如何在非gui线程上更改JavaFX元素?

时间:2017-09-09 12:51:04

标签: java multithreading javafx

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

@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。我理解这个问题,但你会如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

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

<强>示例

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