【问题标题】:Java Update UI from a Worker Thread [duplicate]来自工作线程的 Java 更新 UI [重复]
【发布时间】:2016-06-01 05:02:09
【问题描述】:

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

【问题讨论】:

    标签: java multithreading user-interface javafx


    【解决方案1】:

    使用Platform#runLater()静态方法,在JavaFX应用线程上运行指定的Runnable;它可以从任何线程调用:

    Platform.runLater(() -> {
        // The code that you want to run on the JavaFX Application Thread
    });
    

    【讨论】:

      【解决方案2】:

      您可以使用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);
      

      【讨论】:

      • 如果socket连接成功了,故意返回零联系怎么办?
      • @VGR 对您绑定到的列表所做的任何更新都会自动反映在视图中。这就是 JavaFX 绑定的想法。
      • 我的意思是空列表并不一定表示缺少连接。
      猜你喜欢
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多