javafx 线程更新列表视图

wil*_*lem 1 multithreading javafx

我正在尝试在 javafx 上做一个简单的聊天应用程序\n我的实际问题是将更新插入可观察列表并将其设置在列表视图中的线程

\n\n

我使用的代码:

\n\n
                  String message_re\xc3\xa7u;\n    try {\n        out = new PrintWriter(socket.getOutputStream());\n        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));\n        while (true) {\n            message_re\xc3\xa7u = in.readLine();\n            if (message_re\xc3\xa7u != null) {\n                messagesRe\xc3\xa7us.add(message_re\xc3\xa7u);  \n            }\n            if (message_re\xc3\xa7u.equals("QUIT")) {\n                break;\n            }\n        }\n\n       in.close();\n       out.close();\n        socket.close();\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在一个可运行的类中执行此操作,一旦服务器触发一条消息,线程就会将该消息插入列表中并显示在列表视图上,但线程会终止而不是继续工作

\n\n

我对其进行了搜索,每个人都说要使用 runlater,但我\xe2\x80\x99m 完全迷失了,我确实声明了 runlater,但我\xe2\x80\x99m 不知道如何执行它,所以欢迎任何帮助

\n\n

谢谢

\n

jew*_*sea 5

其他答案

\n\n

这个问题很大程度上是以下问题的重复,因此也请参考这些问题的答案:

\n\n\n\n

解决方案

\n\n

不过,您的问题比这些问题更具体,所以我将提供一些额外的信息。

\n\n

对于您的特定代码,您希望将 add 调用包装在Platform.runLater中:

\n\n
Platform.runLater(new Runnable() {\n  public void run() {\n    messagesRe\xc3\xa7us.add(message_re\xc3\xa7u);\n  }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

您的示例中的其他所有内容都保持原样。

\n\n

背景资料

\n\n

JavaFX UI 更新必须在 JavaFX 应用程序线程上进行,否则您的程序很可能会出现意外故障。

\n\n

ListView 控件侦听支持 ListView 单元格值的 ObservableList 的更改。当该列表发生更改时,会立即在最初更新列表的线程上触发 UI 更新。

\n\n

将列表修改包装在 Platform.runLater 中后,您可以确保随后触发的 UI 更新在 JavaFX 应用程序线程而不是用户线程上执行。

\n