【发布时间】: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 线程。我理解这个问题,但你会如何解决这个问题?
【问题讨论】:
-
假设您的
done()方法应该在某些后台工作完成后执行,您还可以考虑扩展Task并覆盖在 FX 应用程序线程上执行的succeeded()方法.
标签: java multithreading javafx