JavaFX Обновление пользовательского интерфейса из другого потока

У меня есть основной класс

    public class Main {
        public static void main(String[] args) {
            Application.launch(View.class);
            View view = new View();
            Platform.runLater(() -> view.changeTitle());
        }
    }

и класс просмотра JavaFX

    public class View extends Application {

        Stage primaryStage;

        public View() {

        }

        @Override
        public void start(Stage primaryStage) throws Exception{
            Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
            primaryStage.setTitle("Hello World");
            primaryStage.setScene(new Scene(root, 300, 275));
            this.primaryStage = primaryStage;
            primaryStage.show();
        }

        public void changeTitle() {
           primaryStage.setTitle("YEA!");
       }
    }

Я хочу, чтобы основной класс что-то делал в потоке JavaFX, но мой код не работает. В документации сказано, что я могу вызывать Platform.runLater() из любого потока, который захочу. Если я вызываю Platform.runLater() из потока JavaFX (например, в start()), все в порядке.


person WildWind03    schedule 23.04.2016    source источник


Ответы (1)


Во-первых, main(String) заблокирован на Application.launch(Class).

Из Oracle Javadocs:

Метод запуска не возвращает значение до тех пор, пока приложение не завершит работу либо с помощью вызова Platform.exit, либо пока не будут закрыты все окна приложения.

Во-вторых, вы создаете новый экземпляр View во второй строке. Это НЕ будет тот же созданный экземпляр приложения, поэтому ваш Platform.runLater не повлияет на запущенное приложение, даже если этот код будет доступен до его выхода.

person Gordon    schedule 23.04.2016