工作线程的Java Update UI

时间:2016-02-19 15:06:24

标签: java multithreading user-interface javafx

我正在使用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元素?

2 个答案:

答案 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);