在输入另一个线程之前的JavaFX更新GUI

时间:2015-10-13 22:24:15

标签: java multithreading controller java-8 fxml

修改

我注意到我的问题与另一个问题有关。虽然我们的目标是相似的,但另一个问题的设置是不同的:他们在程序的主类中创建程序的所有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可视化更新,然后转移到另一个非常强大的处理线程?

谢谢!

0 个答案:

没有答案