JavaFX多线程概念

时间:2018-07-10 15:11:05

标签: java multithreading javafx server client

开始之前:我是JavaFX的新手,通过这个项目,我想学习如何正确使用该库。

情况如下:我有一个服务器-客户端应用程序。服务器向客户端发送服务器上活动用户的列表。现在,我想在用户界面中列出活动用户。我想用FlowPane中的按钮来做到这一点。问题是我的客户端在外部线程中,而不在应用程序线程中。但是由于客户端可以获取用户列表,因此我尝试直接从客户端线程更新按钮列表。

            if(data.getObject() instanceof ArrayList<?>) {
                ArrayList<User> activeUsers = (ArrayList<User>) data.getObject();
                controller.setActiveUsers(activeUsers);
            }

控制器中的方法执行以下操作:

public void setActiveUsers(ArrayList<User> activeUsers) {
    for(User user:activeUsers) {
        fpOnlineUsers.getChildren().add(new Button(user.getName()));
    }
}

我得到的异常如下:java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3

我有两个问题:

  1. 我该如何解决?
  2. 为什么阻止JavaFX由应用程序线程以外的其他线程更改?

请道歉任何语言错误,我不是母语人士:)

1 个答案:

答案 0 :(得分:0)

  1. 您需要在应用程序线程上进行任何与JavaFX对象相关的调用。要从客户端线程执行此操作,请使用Application.runlater(Runnable)函数。

您的代码应如下所示:

public void setActiveUsers(ArrayList<User> activeUsers) {
    Platform.runLater(new Runnable() {
        @Override public void run() {
            for(User user:activeUsers) {
                fpOnlineUsers.getChildren().add(new Button(user.getName()));
            }
        }
    }
});

参考: Platform.runLater and Task in JavaFX