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