0

javafx で簡単なチャット アプリケーションを実行しようとしています。実際の問題は、更新を observablelist に挿入し、それを 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();

私は実行可能なクラス内でこれを行い、サーバーがメッセージを起動すると、スレッドはメッセージをリストに挿入し、リストビューに表示しますが、スレッドは作業を維持する代わりに終了します

私はそれを検索しましたが、誰もがrunlaterを使用するように言っていますが、私はそこで完全に迷っています。私はrunlaterを宣言しましたが、それを実行する方法がわからないので、どんな助けも大歓迎です

ありがとう

4

1 に答える 1

4

その他の回答

この質問は主に次の質問と重複しているため、それらの回答も参照してください。

解決

ただし、あなたの質問はそれらよりも少し具体的であるため、追加情報を提供します。

特定のコードでは、 add 呼び出しをPlatform.runLaterにラップします。

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

あなたの例の他のすべてはそのままです。

背景情報

JavaFX UI の更新は、JavaFX アプリケーション スレッドで行う必要があります。そうしないと、プログラムが予期しない方法で誤動作する可能性が高くなります。

ListView コントロールは、ListView セル値をサポートする ObservableList への変更をリッスンします。そのリストが変更されると、最初にリストを更新したスレッドで UI の更新がすぐにトリガーされます。

Platform.runLater でリストの変更をラップしたら、その後トリガーされる UI 更新が、ユーザー スレッドではなく JavaFX アプリケーション スレッドで実行されるようにします。

于 2013-05-25T02:09:07.863 に答える