我正在使用JavaFX,我需要以某种方式从工作线程更新UI元素。
我的工作线程一直在通过套接字侦听传入连接。当它检测到一个时,它调用方法updateListOfConnections();
我想要做的是updateListOfConnections非常简单:
this.deviceList.clear();
this.deviceList.addAll(this.contactManager.getContacts().keySet());
if(this.deviceList.size() > 0){
updateConnectButtonState(false);
} else {
updateConnectButtonState(true);
}
正如您所看到的,我在这里影响了几个项目的UI状态,当我尝试从我的线程调用updateListOfConnections时,我得到了一个异常。
我提出的一些可能的解决方案(非常不理想)是:
我只需让用户通过按一下按钮调用updateListOfConnections手动刷新deviceList。
或者,循环不断运行,当它达到一定的时间间隔时,重置间隔并调用updateListOfConnections。
所以我的主要问题是如何使用JavaFX从Java工作线程更新UI元素?
答案 0 :(得分:2)
使用Platform#runLater()静态方法,该方法在 JavaFX应用程序线程上运行指定的Runnable
;它可以从任何线程调用:
Platform.runLater(() -> {
// The code that you want to run on the JavaFX Application Thread
});
答案 1 :(得分:0)
您可以使用Platform.runLater(Runnable)
在主JavaFX线程上执行代码。
但是我建议你看看JavaFX绑定。 LINK
例如,在您的控制器中(例如从FXML实例化)
@FXML private Button aButton;
private final BooleanProperty disableProperty = new ReadOnlyBooleanWrapper();
public init() {
disableProperty.bind(-- Your observable list here--.isEmpty());
aButton.disableProperty().bindBidirectional(disableProperty);