感谢您查看我的问题。我会尽力使其尽可能清晰和简洁。
计划
<小时/> 好的,我已经实现了一个聊天程序。该聊天程序的部分功能是在线用户列表。该列表每 10 秒更新一次。这是我遇到问题的程序部分。每隔 10 秒,我的服务器就会向每个客户端发送一个 CSV 字符串中包含所有在线用户的数据包。客户端成功解析数据包,并将每个名称加载到 ListView 中。所有这些事情都完全按照我想要的方式进行。问题
<小时/> 当列表刷新时,所有焦点都会丢失。我想这是因为列表中的所有项目都被替换了,但我正在努力想办法解决它。这之所以重要,是因为用户要向另一个用户发送消息,他们必须单击列表中的名称,然后发送消息。显然,如果它不断刷新,使用聊天程序就会变得非常烦人!字符串填充此字段:
private DefaultListModel<String> usersList;
使用以下代码绑定(bind)到 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 会记住它的焦点,这样客户端就不必继续单击该用户吗?我不是在这里寻找代码,也不是通过任何想象力的快速修复。我已经思考这个问题几天了,但现在陷入困境,因此非常感谢任何帮助。提前致谢,克里斯。
最佳答案
您可以简单地不删除所有条目,而是遍历每个名称的整个列表,看看它是否已经不在其中,在这种情况下您可以添加它。这应该将焦点保留在拥有它的项目上。
或者,您也可以在 JList
上放置一个监听器,并存储所选的项目,然后在刷新后手动将其设置为选中状态。
关于java - 防止 JList 刷新失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280600/