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 ответ
В вашем коде есть несколько ошибок:
- Вы создаете и показываете
Stage
на фоне темы. Это нарушает политику потоков и вызоветIllegalStateException
(см. документацию). Таким образом, сцена не будет показывать, и вашcall()
метод завершается с исключением, поэтомуonSucceeded
обработчик не будет вызван. - Если
call()
метод все-таки удался, он в основном завершился бы и немедленно прекратился. призваниеstage.show()
показывает сцену, а затем возвращается. Так что, если это удалось, тоonSucceeded
Обработчик будет вызываться более или менее сразу после запуска службы (и до того, как пользователь имел возможность взаимодействовать со сценой).
Похоже, что вы вообще не получаете никакой информации со сцены, которую вы показываете, так что здесь нет никакой необходимости в какой-либо нити. Просто покажите сцену прямо в текущем потоке (т.е. в приложении FX). Если вам нужно дождаться ввода пользователя, используйте stage.showAndWait()
вместо stage.show()
,