0

Я хочу открыть новое окно в контроллере другого окна через другой класс. На пример вот функция которая находится в контроллере:

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, НО я не понимаю куда. Ведь куда бы я не сунул везде ошибка о том что это не подходит..

Michel_T.
2601 серебряный знак9 бронзовых знаков
задан 4 янв. 2019 в 22:54
5
  • 1
    А можешь добавить пример, где ты добавил Platform.runLater и оно завалилось? По идее, Platform.runLater(() -> Const.menuController.openNewScene("/Main/GameWindow/GameWindow.fxml")) можно поместить в любое место и этого будет достаточно. Commented 5 янв. 2019 в 0:34
  • 1
    В твоём случае, должно быть что-то вроде этого: ` if (type == MessageTypes.SEARCH_REPLY) { Platform.runLater(() ->Const.menuController.openNewScene("/Main/GameWindow/GameWindow.fxml")); } ` Commented 5 янв. 2019 в 0:35
  • Если ошибка возникает при перетягивании объекта, тогда проблема в root.setOnMousePressed. Содержимое листенера оберните в Platform.runLater Commented 5 янв. 2019 в 14:55
  • Да, это действительно сработало, а не подскажите, почему это работает через лямбду, а без нее, что то вроде: Platform.runLater(Const.menuController.openNewScene("/Main/GameWindow/GameWindow.fxml")); не робит Commented 5 янв. 2019 в 15:56
  • Потому что добавляя лямбду, ты говоришь: "вот функция/задача, выполни её в главном потоке", а без лямбды ты просто выполняешь эту функцию, т.е. функция выполняется во вспомогательном потоке. Commented 5 янв. 2019 в 22:42

0

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

Ваш ответ

Черновик сохранён
Черновик удалён

Зарегистрируйтесь или войдите

Регистрация через Google
Регистрация через почту

Отправить без регистрации

Необходима, но никому не показывается

Отправить без регистрации

Необходима, но никому не показывается

Нажимая «Отправить ответ», вы соглашаетесь с условиями пользования и подтверждаете, что прочитали политику конфиденциальности.

Начните задавать вопросы и получать на них ответы

Найдите ответ на свой вопрос, задав его.

Задать вопрос

Изучите связанные вопросы

Посмотрите похожие вопросы с этими метками.