【问题标题】:How to change a JavaFX element on non gui thread?如何在非 gui 线程上更改 JavaFX 元素?
【发布时间】:2017-09-09 12:51:03
【问题描述】:

所以当我启动我的应用程序时,我会在我的窗口上显示一个按钮作为加载屏幕/点击播放按钮。因此,当应用程序启动时,它会显示“正在加载”并在 initalize 方法中设置为禁用。然后我的控制器实例化另一个使用 4 个线程来计算事物的类,这应该在用户看到加载屏幕期间持续。所以我的控制器实例化了一个私有类,它作为具有多个线程的类的回调。当该类完成计算时,它将向控制器回调它已完成。当发生这种情况时,我想再次启用我的按钮并更改文本,以便用户可以单击它并开始。这是代码的一部分:

@FXML
private Button btnStart;

private final MuliThreadedClass treeBuilderStarter = new TreeBuilderStarter(board, new CBTreeDoneImpl());


    private class CBTreeDoneImpl implements CBThreadDone{

        @Override
        public void done(ComplextObject obj) {
            btnStart.setDisable(false);
            btnStart.setText("Click to start!");
        }
    }

    @FXML
    public void initialize() {
        btnStart.setDisable(true);
    }

现在当回调被调用时

  btnStart.setDisable(false);
  btnStart.setText("Click to start!");

被执行我得到一个异常说 IllegalStateException not on FX 线程。我理解这个问题,但你会如何解决这个问题?

【问题讨论】:

标签: java multithreading javafx


【解决方案1】:

您应该使用 Platform.runLater(Runnable) 在非 FX 线程上执行 GUI 操作。

示例

Platform.runLater(() -> {
    // Do sth...
});

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    相关资源
    最近更新 更多