Java Platform.runLater问题-延迟执行 按钮按钮=新按钮(“显示文本”); setOnAction(新的EventHandler(){ @凌驾 公共无效句柄(ActionEvent事件){ Platform.runLater(新的Runnable(){ @凌驾 公开募捐{ field.setText(“开始”); } }); 试一试{ 睡眠(5000); }捕获(中断异常例外){ Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex); } Platform.runLater(新的Runnable(){ @凌驾 公开募捐{ field.setText(“结束”); } }); } });

Java Platform.runLater问题-延迟执行 按钮按钮=新按钮(“显示文本”); setOnAction(新的EventHandler(){ @凌驾 公共无效句柄(ActionEvent事件){ Platform.runLater(新的Runnable(){ @凌驾 公开募捐{ field.setText(“开始”); } }); 试一试{ 睡眠(5000); }捕获(中断异常例外){ Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex); } Platform.runLater(新的Runnable(){ @凌驾 公开募捐{ field.setText(“结束”); } }); } });,java,javafx,javafx-2,javafx-8,Java,Javafx,Javafx 2,Javafx 8,运行上述代码后,field.setText(“开始”)不会执行,我的意思是textfield没有将其文本设置为“开始”,为什么?如何解决这个问题?请记住,按钮的onaaction是在JavaFX线程上调用的,因此实际上是在暂停UI线程5秒钟。当UI线程在这五秒钟结束时解除冻结时,两个更改都会依次应用,因此您最终只能看到第二个 您可以通过在新线程中运行上述所有代码来修复此问题: Button button = new Button("Show Text"); button.setOnAction(

运行上述代码后,
field.setText(“开始”)
不会执行,我的意思是textfield没有将其文本设置为“开始”,为什么?如何解决这个问题?

请记住,按钮的
onaaction
是在JavaFX线程上调用的,因此实际上是在暂停UI线程5秒钟。当UI线程在这五秒钟结束时解除冻结时,两个更改都会依次应用,因此您最终只能看到第二个

您可以通过在新线程中运行上述所有代码来修复此问题:

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");
            }
        });
        }
});

很好地解释了为什么-尽管注意到fx附带了对动画的广泛高级支持:-)@walkerfirst
runLater
。由于事件处理程序在应用程序线程上运行,
field.setText(“START”)
可以安全地移动到
Runnable
的“外部”
    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();
    });