Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX在进入另一个线程之前更新GUI_Java_Multithreading_Controller_Java 8_Fxml - Fatal编程技术网

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

JavaFX在进入另一个线程之前更新GUI,java,multithreading,controller,java-8,fxml,Java,Multithreading,Controller,Java 8,Fxml,编辑: 我注意到我的问题与另一个有关。虽然我们的目标相似,但另一个问题的设置却不同:他们在程序的主类中创建程序的所有GUI方面,他们还在start方法中设置按钮按下的触发事件。因此,使用“setOnAction(event->)”和任务结合的解决方案是可行的。它是一个单类程序,我能够使解决方案工作。如果我创建了一个新的单类程序,这个应用程序在我的情况下不适用于我 在我的设置中,我没有在主类之外运行此事件,而是在链接到我的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!");
});