Привет У меня есть приложение, которое работает как на графическом интерфейсе (Java FX), так и на командной строке. Когда вы выполняете GUI, я показываю статус в текстовой области. Это прекрасно работает.Java FX: невозможно открыть всплывающее окно из разных потоков FX
Но проблема в том, когда я пытаюсь показать ошибку (через всплывающее окно) из какого-то другого (не javafx) класса, это показывает мне Java Fx - thread Exception not on FX thread.
Ниже мой код
Это мой Java класс FX, где я хочу, чтобы показать всплывающее окно.
public class DeploymentProcesController implements Initializable {
@FXML
private TextArea statusTextArea;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
public void updateGUIMessage(String message) {
if (Platform.isFxApplicationThread()) {
statusTextArea.appendText(message);
} else {
Platform.runLater(new Runnable() {
@Override
public void run() {
statusTextArea.appendText(message);
}
});
}
}
public void displayAlertMessages(final String message) {
Platform.setImplicitExit(false);
Task<Void> task = new Task<Void>() {
@Override public Void call() {
Platform.runLater(new Runnable() {
public void run() {
Alert alert = new Alert(AlertType.INFORMATION, message, ButtonType.OK);
alert.showAndWait();
}
});
return null;
}
};
new Thread(task).start();
}
}
я иметь не класс FX, который является точкой входа. Итак, исходя из типа запуска (командной строки/GUI), я обновляю статус.
Вот как я звоню, чтобы обновить статус.
public void promptUser(String message,boolean isCommandLineRun){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
if(isCommandLineRun) {
System.out.println(simpleDateFormat.format(new Date()) + " - " + message);
} else {
controller.displayAlertMessages(message);
}
}
У меня нет проблем, когда я вызываю метод updateGUIMessage из класса non fx. Это связано с тем, что элемент statusArea находится в потоке FX (член этого класса fx).
Также у меня нет проблем с созданием окна предупреждения на какой-либо кнопке, , но для отображения окна предупреждения из другого класса. У меня возникают проблемы, поскольку, как только я пытаюсь создать окно предупреждения, приложение вылетает , говоря не о потоке fx.
Я понимаю, что поле «Предупреждение» является всплывающим окном и поэтому может быть необработанным. Но кто-нибудь может мне помочь, я хочу показать пользователю окно предупреждения из разных классов.
Любой класс волен называть любой класс JavaFX или метод, но этот вызов должен быть сделан на FX нить Java, независимо от того, какой класс не делает вызов. Если вы не хотите, чтобы какой-либо конкретный класс импортировал платформу, напишите метод в другом классе, который использует Platform.runLater, и вызовите этот метод «non fx». – VGR