JavaFX在进入另一个线程之前更新GUI
编辑: 我注意到我的问题与另一个有关。虽然我们的目标相似,但另一个问题的设置却不同:他们在程序的主类中创建程序的所有GUI方面,他们还在start方法中设置按钮按下的触发事件。因此,使用“setOnAction(event->)”和任务结合的解决方案是可行的。它是一个单类程序,我能够使解决方案工作。如果我创建了一个新的单类程序,这个应用程序在我的情况下不适用于我 在我的设置中,我没有在主类之外运行此事件,而是在链接到我的FXML的控制器类之外运行此事件,并且我已经定义了触发方法的事件。我没有发布我的整个控制器类,因为这似乎是不必要的。如果有方法使链接问题的解决方案适用于我的不同设置,或者链接,以获得一流的指导。我已经研究了“任务”设置,从链接的问题中提取,但迄今为止还未能使其成功运行,如下图所示:JavaFX在进入另一个线程之前更新GUI,java,multithreading,controller,java-8,fxml,Java,Multithreading,Controller,Java 8,Fxml,编辑: 我注意到我的问题与另一个有关。虽然我们的目标相似,但另一个问题的设置却不同:他们在程序的主类中创建程序的所有GUI方面,他们还在start方法中设置按钮按下的触发事件。因此,使用“setOnAction(event->)”和任务结合的解决方案是可行的。它是一个单类程序,我能够使解决方案工作。如果我创建了一个新的单类程序,这个应用程序在我的情况下不适用于我 在我的设置中,我没有在主类之外运行此事件,而是在链接到我的FXML的控制器类之外运行此事件,并且我已经定义了触发方法的事件。我没有发布
@FXML
private void goForIt(ActionEvent event)
{
kickTheBaby();
}
private void kickTheBaby()
{
java.util.Date now = calendar.getTime();
java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime());
statusFld.setOnAction(event -> {statusFld.setText("Running");
Task task = new Task<Void>() {
@Override
public Void call()
{
(new Thread(new EmailCommunication("", currentTimestamp, "START"))).start();
(new Thread(new DataGathering2())).start();
return null;
}
};
task.setOnSucceeded(taskFinishEvent -> statusFld.setText(statusFld.getText()
+ "All done time to sleep..."));
new Thread(task).start();
});
}
但是,当我尝试运行该程序时,GUI不会进行可视化更新,而是直接进入其他两个线程。因此,我尝试在其他线程之一中使用“Platform.runLater()”方法,方法是将状态字段按如下方式传递给它:
Platform.runLater(() ->
{
statusFld.setText("Running!");
});
但20分钟后,它没有给GUI提供一个可视化更新。我猜这可能是由于我让它做的数据处理量太大,所以谁知道在这种情况下“以后”会是什么
我的问题是,如何确保GUI在转到其他处理非常密集的线程之前进行可视化更新
谢谢!编辑问题以澄清并显示使事情成功的进一步尝试。编辑问题以澄清并显示使事情成功的进一步尝试。
Platform.runLater(() ->
{
statusFld.setText("Running!");
});