Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
单击按钮时更新GUI:JavaFX_Java_Multithreading_Concurrency_Javafx_Platform - Fatal编程技术网

单击按钮时更新GUI:JavaFX

单击按钮时更新GUI:JavaFX,java,multithreading,concurrency,javafx,platform,Java,Multithreading,Concurrency,Javafx,Platform,点击按钮后第一件事就是更新GUI,然而Platform.runLater会在稍后的阶段执行,我正在寻找一段代码,该代码在点击按钮后第一件事就是更新GUI Platform.runLater(new Runnable() { @Override public void run() { //Update GUI here }

点击按钮后第一件事就是更新GUI,然而Platform.runLater会在稍后的阶段执行,我正在寻找一段代码,该代码在点击按钮后第一件事就是更新GUI

Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        //Update GUI here
                    }
                });

如果有人能提供任何输入或建议,我们将不胜感激。

尽管API指定了
平台.runLater
“在将来某个未指定的时间在JavaFX应用程序线程上运行指定的Runnable”,但执行指定线程通常只需很少或根本不需要时间。相反,您可以只向按钮添加一个EventHandler来监听鼠标单击

假设控制器
实现可初始化

    @FXML Button button;

    @Override
    public void initialize(URL fxmlFileLocation, ResourceBundle resources) {
        button.setOnMouseClicked(new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {
                updateGUI();
            }
        });
    }

    private void updateGUI() {
        // code
    }
@FXML按钮;
@凌驾
公共void初始化(URL fxmlFileLocation,ResourceBundle资源){
setOnMouseClicked(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
updateGUI();
}
});
}
私有void updateGUI(){
//代码
}

为什么要使用
Platform.runLater(…)
呢?为了能够在GUI线程上更新GUI,请告诉我一个更好的建议。无论如何,事件处理程序都是在GUI线程上调用的。但是当GUI更新时,已经太晚了。希望GUI作为第一件事更新什么需要几分钟?在
Platform.runLater(task)
中的
task
启动或完成之前几分钟?通常只需几毫秒即可启动
任务
。如果
task
执行时间过长(如查询远程数据库),则不应在UI线程上执行。此代码看起来很奇怪。为什么要在
@FXML
带注释的方法中注册处理程序?您预期会发生一些事件,导致处理程序被注册(因此只有在该事件之后单击按钮才会触发GUI更新)?为什么要使用
setOnMouseClicked(…)
而不是
setOnAction(…)
作为
按钮
?请参阅更新的答案。你是对的,方法不需要是@FXML;我把它改为
初始化(…)
。我将其保留为
setOnMouseClicked(…)
,这仅仅是因为单击按钮时指定的问题。我假设这里的按钮是指FXML按钮。