Platform.runLater问题 - 延迟执行

Wal*_*ker 2 java javafx javafx-2 javafx-8

Button button = new Button("Show Text");
button.setOnAction(new EventHandler<ActionEvent>(){
    @Override
    public void handle(ActionEvent event) {
        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                field.setText("START");
            }
       });

        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                field.setText("END");
            }
        });
        }
});
Run Code Online (Sandbox Code Playgroud)

运行上面的代码后,field.setText("START")没有执行,我的意思是textfield没有将其文本设置为"START",为什么?怎么解决这个?

Ita*_*tai 5

请记住,在onActionJavaFX线程上调用按钮,因此您实际上会停止UI线程5秒钟.当UI线程在这五秒结束时被解冻时,两个更改都会连续应用,因此您最终只会看到第二个.

您可以通过在新线程中运行上面的所有代码来解决此问题:

    Button button = new Button();
    button.setOnAction(event -> {
        Thread t = new Thread(() -> {
            Platform.runLater(() -> field.setText("START"));
            try {
                Thread.sleep(5000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
            Platform.runLater(() -> field.setText("END"));
        });

        t.start();
    });
Run Code Online (Sandbox Code Playgroud)

  • 很好地解释了为什么 - 虽然注意到fx带有对动画的广泛高级支持:-) @Walker (3认同)
  • 第一个`runLater`是不必要的.由于事件处理程序在应用程序线程上运行,`field.setText("START")`可以安全地移动到`Runnable`的"外部". (2认同)