0

私の質問を見てくれてありがとう。できるだけ明確かつ簡潔にするように努めます。

プログラム


さて、私はチャットプログラムを実装しました。そのチャットプログラムの機能の一部は、オンラインのユーザーのリストです。このリストは10秒ごとに更新されます。これは私が問題を抱えているプログラムの一部です。私のサーバーは、10秒ごとに、オンラインのすべてのユーザーのパケットを1つのCSV文字列で各クライアントに送信します。クライアントはパケットを正常に解析し、すべての名前をListViewにロードします。これらはすべて、私が望んでいるとおりに機能します。

問題


リストが更新されると、すべてのフォーカスが失われます。これは、リスト内のすべてのアイテムが置き換えられたためだと思いますが、それを回避する方法を考えるのに苦労しています。これが重要な理由は、ユーザーが別のユーザーにメッセージを送信するには、リスト内の名前をクリックしてからメッセージを送信する必要があるためです。明らかに、それがリフレッシュし続けると、チャットプログラムの使用が非常に面倒になります!

文字列はこのフィールドに入力されます。

private DefaultListModel<String> usersList;

これは、次のコードでListViewにバインドされています。

this.list = new JList(this.usersList);

次の方法を使用して、サーバーからのデータによって更新されます。

 public void setOnlineUsersList()
 {
    String[] onlineUsers = this.c.getOnlineUsers();
    // Request the client to query the server for online users. Execution waits until a  response is recieved.
    if (this.usersList.size() > 0) {
        // Ensure there are users online.
        this.usersList.clear();
        // Clear the users from the list, if they need to be replaced.
    }

    for (String s : onlineUsers)
    {
        // Add each username to the DefaultListModel, which updates the ListView.
        this.usersList.addElement(s);
    }
}

オンラインユーザーリストが更新される前オンラインユーザーリストが更新され た後更新前 更新後

質問


クライアントが「オンラインリスト」から別のユーザーを選択できる方法を教えてください。リストが更新されると、ListItemはフォーカスを記憶しているため、クライアントはユーザーをクリックし続ける必要がありません。私はここでコードを探しているわけではありません。私はこれについて数日間考えていましたが、今は行き詰まっているので、助けていただければ幸いです。

よろしくお願いします、クリス。

4

1 に答える 1

2

すべてのエントリを削除するのではなく、名前ごとにリスト全体を繰り返し処理して、まだそこにないかどうかを確認します。その場合は、追加します。これは、それを持っているアイテムに焦点を合わせ続けるべきです。

または、リスナーをに配置し、JList選択したアイテムを保存して、更新後に手動で選択済みに設定できる場合もあります。

于 2013-03-07T20:04:57.680 に答える