Я хочу открыть новое окно в контроллере другого окна через другой класс. На пример вот функция которая находится в контроллере:
public void openNewScene(String Window) {
search.setVisible(false);
playButton.getScene().getWindow().hide();
FXMLLoader loader =new FXMLLoader();
loader.setLocation(getClass().getResource(Window));
Const.gameController = (GameController) loader.getController();
try {
loader.load();
}catch (IOException e) {
e.getMessage();
}
Parent root = loader.getRoot();
final Stage stage = new Stage();
stage.initStyle(StageStyle.TRANSPARENT);
root.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
xOffset = event.getSceneX();
yOffset = event.getSceneY();
}
});
root.setOnMouseDragged(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
stage.setX(event.getScreenX() - xOffset);
stage.setY(event.getScreenY() - yOffset);
}
});
stage.setScene(new Scene(root));
stage.setResizable(false);
stage.show();
}
Она вызывается в другом классе(мини-сервере) когда туда посылается опред. сигнал:
if (type == MessageTypes.SEARCH_REPLY) {
Const.menuController.openNewScene("/Main/GameWindow/GameWindow.fxml");
}
Но после этого я получаю исключение
Exception in thread "Thread-3" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
at javafx.graphics/com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:291)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at javafx.graphics/javafx.stage.Window.setShowing(Window.java:1185)
at javafx.graphics/javafx.stage.Window.hide(Window.java:1211)
at Main.Menu.MenuController.openNewScene(MenuController.java:207)
at Main.ClientServer.run(ClientServer.java:40)
Это означает что я хочу обраться к FX объекту не через FX поток и нужно добавить Platform.runLater, НО я не понимаю куда. Ведь куда бы я не сунул везде ошибка о том что это не подходит..
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
Начните задавать вопросы и получать на них ответы
Найдите ответ на свой вопрос, задав его.
Задать вопросlang-java
Platform.runLaterи оно завалилось? По идее,Platform.runLater(() -> Const.menuController.openNewScene("/Main/GameWindow/GameWindow.fxml"))можно поместить в любое место и этого будет достаточно.root.setOnMousePressed. Содержимое листенера оберните вPlatform.runLater