【问题标题】:Update GUI upon button Click: JavaFX单击按钮更新 GUI:JavaFX
【发布时间】:2014-08-05 19:17:49
【问题描述】:

希望在单击按钮时首先更新 GUI,但是 Platform.runLater 在稍后阶段执行,并且正在寻找在单击按钮时首先更新 GUI 的代码。

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

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

【问题讨论】:

  • 你为什么要使用Platform.runLater(...)
  • 为了能够在 GUI 线程上更新 GUI,请让我知道以获得更好的建议。
  • 无论如何都会在 GUI 线程上调用事件处理程序。
  • 然而,当 GUI 更新时,为时已晚。希望首先更新 GUI
  • 什么需要几分钟?是在Platform.runLater(task) 中的task 开始 还是完成 之前几分钟?在task 启动之前,它通常只需要几毫秒。如果task 执行时间过长(如查询远程数据库),则不应在 UI 线程上执行。

标签: java multithreading concurrency javafx platform


【解决方案1】:

尽管 API 指定 Platform.runLater“在未来某个未指定的时间在 JavaFX 应用程序线程上运行指定的 Runnable”,但执行指定线程通常几乎不需要时间。相反,您可以在按钮上添加一个 EventHandler 来监听鼠标点击。

假设控制器implements Initializable

    @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 带注释的方法中注册处理程序?您预计会发生一些导致处理程序注册的事件(因此只有单击该事件的后续按钮才会触发 GUI 更新)?为什么你使用setOnMouseClicked(...) 而不是setOnAction(...) 来代替Button
  • 查看更新的答案。你是对的,方法不需要是@FXML;我把它移到了initialize(...)。我将其保留为setOnMouseClicked(...) 只是因为单击按钮时指定了问题。我认为这里的按钮是指 FXML 按钮。
猜你喜欢
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2014-01-17
  • 2017-03-06
  • 2016-09-28
相关资源
最近更新 更多