javaFX: откройте второй этап внутри задачи, дождитесь его закрытия, затем продолжите на первом этапе.

В tableView eventHandler, когда F1 обнаружен от пользователя, он открывает второй этап с comboBox и двумя кнопками. Если пользователь выбирает запись в поле со списком и нажимает первую кнопку, он записывает значение выбранного var в файл, закрывает второй этап и возвращается к первому этапу, где он открывает указанный выше файл для чтения, получает переменную из файла и сохраняет его в первом столбце строки таблицы, которая была активной, когда пользователь нажал клавишу F1. Части: этапы, чтение / запись в файл, обновление табличного представления - все работает нормально, хотя при изменении кода и попытке применить службу (задачу) второй этап не отображается. Другими словами, два этапа не соответствуют друг другу.

// INSIDE mainContoller     
    table.setOnKeyPressed(new EventHandler<KeyEvent>() {
                    public void handle(KeyEvent t) {

                        TablePosition firstCell = table.getSelectionModel().getSelectedCells().get(0);
                        //Integer col = firstCell.getColumn(); 
                        //Integer row = firstCell.getRow();  
                        col = firstCell.getColumn(); 
                        row = firstCell.getRow();  
                        //System.out.println(firstCell.getColumn());    

                        if (t.getCode() == KeyCode.F1){
                            System.out.println("F1 pressed");

                            Service<Void> service = new Service<Void>() {
                                @Override
                                protected Task<Void> createTask() {
                                return new Task<Void>() {
                                        @Override
                                        protected Void call() throws Exception {
                                            //Do Long running work here<<<
                                                System.out.println("In task 1");
                                                Parent root1 = null;
                                                FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("Customer.fxml"));
                                                try {
                                                    root1 = (Parent) fxmlLoader.load();
                                                } catch (IOException e) {
                                                    // TODO Auto-generated catch block
                                                    e.printStackTrace();
                                                }

                                                Stage stage = new Stage();
                                                stage.initModality(Modality.APPLICATION_MODAL);
                                                stage.initStyle(StageStyle.UNDECORATED);
                                                stage.setTitle("ABC");
                                                System.out.println("In task 2");
                                                stage.setScene(new Scene(root1));  
                                                stage.show();
                                                System.out.println("In task 3");

                                                return null;
                                        }
                                        };
                                }
                                @Override
                                protected void succeeded() {
                                     //Called when finished without exception
                                    System.out.println("OnSucceeded");
                                    TextFileReadWrite getCustomer = new TextFileReadWrite();
                                    String cusName = "";
                                    try {
                                        cusName = getCustomer.readFromFile("C:\\gasoum\\YannaKSIA\\ForitiTimologisi\\tempFiles\\tempCustomer.txt");
                                    } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                    }
                                    System.out.println("Col:" + col + " Row: "+ row);  
                                    checkCusFile = true;
                                    oList.get(row).cusEponymia = cusName;
                                    table.refresh();


                                }
                            };
                            service.start(); // starts Thread

                        }   
                    }
                });

        // CustomerContreller.java file
        package application;


        import javafx.application.Platform;
        import javafx.event.ActionEvent;
        import javafx.event.EventHandler;
        import javafx.fxml.FXML;
        import javafx.scene.control.Button;
        import javafx.scene.control.ComboBox;
        import javafx.stage.Stage;

        public class CustomerController extends Thread{

            public String customerName;

            @FXML Button customerChoseButton;
            @FXML Button customerExitButton;
            @FXML ComboBox cusComboBox ;

            public String cus;
            public void initialize() {

                cus = "Testing";

                cusComboBox.getItems().addAll(
                        "Customer 1",
                        "Customer 2",`
                        "Customer 3"
                    );

                //AUTO COMPLETE COMBOBOX
                new AutoCompleteComboBoxListener<>(cusComboBox);

                customerChoseButton.setOnAction(new EventHandler<ActionEvent>() {       
                    @Override
                    public void handle(ActionEvent arg0) {
                            // WRITE SELECTED CUSTOMER INTO FILE
                            TextFileReadWrite wC = new TextFileReadWrite();     
                            String selectedCus = (String) cusComboBox.getSelectionModel().getSelectedItem().toString(); 
                            wC.writeToFile(selectedCus, "C:\\gasoum\\YannaKSIA\\ForitiTimologisi\\tempFiles\\tempCustomer.txt");


                            customerChoseButton.getScene().getWindow().hide();

                    }
                });
                customerExitButton.setOnAction(new EventHandler<ActionEvent>() {        
                    @Override
                    public void handle(ActionEvent arg0) {
                            customerExitButton.getScene().getWindow().hide();
                    }
                });     

            }

        }


// TextFileReadWrite.java
package application;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class TextFileReadWrite {



    public TextFileReadWrite(){

    }


    public void writeToFile(String xcontent, String xfname){
        try {
            File file = new File(xfname);

            // if file doesnt exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(xcontent);
            bw.close();

            //System.out.println("Done");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }




    public String readFromFile(String xfname) throws IOException{
        BufferedReader br = new BufferedReader(new FileReader(xfname));
        try {
            StringBuilder sb = new StringBuilder();
            String line = br.readLine();

            while (line != null) {
                sb.append(line);
                sb.append(System.lineSeparator());
                line = br.readLine();
            }
            String everything = sb.toString();
            return everything;
        } finally {
            br.close();
        }


    }   


}

1 ответ

В вашем коде есть несколько ошибок:

  1. Вы создаете и показываете Stage на фоне темы. Это нарушает политику потоков и вызовет IllegalStateException (см. документацию). Таким образом, сцена не будет показывать, и ваш call() метод завершается с исключением, поэтому onSucceeded обработчик не будет вызван.
  2. Если call() метод все-таки удался, он в основном завершился бы и немедленно прекратился. призвание stage.show() показывает сцену, а затем возвращается. Так что, если это удалось, то onSucceeded Обработчик будет вызываться более или менее сразу после запуска службы (и до того, как пользователь имел возможность взаимодействовать со сценой).

Похоже, что вы вообще не получаете никакой информации со сцены, которую вы показываете, так что здесь нет никакой необходимости в какой-либо нити. Просто покажите сцену прямо в текущем потоке (т.е. в приложении FX). Если вам нужно дождаться ввода пользователя, используйте stage.showAndWait() вместо stage.show(),

Другие вопросы по тегам