JavaFX从另一个线程更新UI

时间:2016-04-23 03:29:01

标签: java multithreading model-view-controller 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()。如果我从JavaFX线程调用Platform.runLater()(例如,在start()中),一切正常。

1 个答案:

答案 0 :(得分:1)

首先,main(String)上阻止了Application.launch(Class)

来自Oracle Javadocs:

  

在应用程序退出之前,通过调用Platform.exit或所有应用程序窗口都已关闭,启动方法不会返回。

其次,您在第二行创建了一个新的View实例。这与应用程序创建的实例不同,因此即使该代码在退出之前可以访问,您的Platform.runLater也不会影响已启动的应用程序。