javafx线程更新列表视图

时间:2013-05-24 08:48:03

标签: multithreading javafx

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

我正在使用的代码:

                  String message_reçu;
    try {
        out = new PrintWriter(socket.getOutputStream());
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while (true) {
            message_reçu = in.readLine();
            if (message_reçu != null) {
                messagesReçus.add(message_reçu);  
            }
            if (message_reçu.equals("QUIT")) {
                break;
            }
        }

       in.close();
       out.close();
        socket.close();

我在一个可运行的类中执行了这个操作,一旦服务器触发了一个msg,该线程就会在列表中插入msg并显示在listview上,但线程会死掉而不是保持工作

我对它进行了搜索,并且每个人都说要使用runlater但是我完全迷失在那里我确实宣布了一个runlater但是我不确定如何执行它以便欢迎任何帮助

谢谢

1 个答案:

答案 0 :(得分:3)

其他答案

这个问题在很大程度上与以下问题重复,所以也请参考这些问题的答案:

<强>解决方案

你的问题比那些问题更具体,所以我会提供一些额外的信息。

对于您想要在Platform.runLater中包含添加调用的特定代码:

Platform.runLater(new Runnable() {
  public void run() {
    messagesReçus.add(message_reçu);
  }
});

示例中的其他所有内容都保持不变。

背景资料

必须在JavaFX应用程序线程上进行JavaFX UI更新,否则您的程序很可能会以意想不到的方式发生故障。

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

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