防止失去对JList刷新的关注

时间:2013-03-07 20:00:25

标签: java multithreading swing

感谢您查看我的问题。我会尽量使它尽可能简洁明了。

该计划

<小时/> 好的,所以我实施了一个聊天程序。该聊天程序的部分功能是在线用户列表。此列表每10秒更新一次。这是我遇到麻烦的程序的一部分。每隔10秒,我的服务器就会将一个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);
    }
}

在线用户列表刷新之前 Before refresh http://s12.postimage.org/p39jicn8d/pre_Refresh_Client_List.png 在线用户列表刷新后 After Refresh http://s22.postimage.org/5k5baurg1/post_Refresh_Client_List.png

问题

<小时/> 你能为我们提供任何方法,客户可以从“在线列表”中选择另一个用户,当列表刷新时,ListItem会记住它的焦点,这样客户就不必一直点击用户了吗?我不是在这里寻找代码,也不是想象力的快速修复。我只是在考虑这几天,现在我已经被困住了,所以任何帮助都会非常感激。

先谢谢你,克里斯。

1 个答案:

答案 0 :(得分:2)

你可能根本就没有删除所有条目,而是遍历每个名​​称的整个列表,看看它是否已经存在,在这种情况下你要添加它。这应该专注于拥有它的项目。

或者,您可以将监听器放在JList上,并存储所选项目,然后在刷新后手动将其设置为选中。