修改
我注意到我的问题与另一个问题有关。虽然我们的目标是相似的,但另一个问题的设置是不同的:他们在程序的主类中创建程序的所有GUI方面,他们也在开始时设置按钮的触发事件方法。因此,使用" setOnAction的解决方案(事件 - >"与Task一起工作。这是一个单一的类程序,如果我创建了一个新的单一类程序,我能够使解决方案工作,根据我的情况,这个应用程序对我不起作用。
在我的设置中,我没有从主类中运行此事件,而是在链接到我的FXML的Controller类之外,我有触发已定义方法的事件。我没有发布我的整个Controller类,因为这似乎没必要。如果有一种方法可以使链接问题的解决方案适用于我的不同设置,或者提供一个很棒的指导链接。我已经研究过"任务"设置,取决于相关问题,但到目前为止还未能成功地如下图所示:
@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();
});
}
我在Java8中有一个程序使用FXML来下载和解析数据。我希望让程序更新GUI TextField(名为&#34; statusFld&#34;这里)来说&#34; Running&#34;当我点击开始按钮。以下是控制器中应该负责此系列事件的方法。
@FXML
private void goForIt(ActionEvent event)
{
statusFld.setText("Running!");
java.util.Date now = calendar.getTime();
java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(now.getTime());
(new Thread(new EmailCommunication("", currentTimestamp, "START"))).start();
(new Thread(new DataGathering2())).start();
}
但是,当我尝试运行该程序时,GUI不会直观地更新并直接进入另外两个线程。所以我试图利用&#34; Platform.runLater()&#34;通过将状态字段传递给其他一个线程的方法:
Platform.runLater(() ->
{
statusFld.setText("Running!");
});
但是20分钟后它还没有对GUI进行视觉更新。我的猜测是,这可能是由于我所拥有的大量数据处理,所以谁知道什么&#34;以后&#34;实际上就是这种情况。
我的问题是如何确保GUI可视化更新,然后转移到另一个非常强大的处理线程?
谢谢!