java - 防止 JList 刷新失去焦点

标签 java multithreading swing

感谢您查看我的问题。我会尽力使其尽可能清晰和简洁。

计划

<小时/> 好的,我已经实现了一个聊天程序。该聊天程序的部分功能是在线用户列表。该列表每 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);
    }
}

在线用户列表刷新之前 Before refresh 在线用户列表刷新后 After Refresh

问题

<小时/> 你们能给我提供任何方法,让客户端可以从“在线列表”中选择另一个用户,并且当列表刷新时,ListItem 会记住它的焦点,这样客户端就不必继续单击该用户吗?我不是在这里寻找代码,也不是通过任何想象力的快速修复。我已经思考这个问题几天了,但现在陷入困境,因此非常感谢任何帮助。

提前致谢,克里斯。

最佳答案

您可以简单地不删除所有条目,而是遍历每个名​​称的整个列表,看看它是否已经不在其中,在这种情况下您可以添加它。这应该将焦点保留在拥有它的项目上。

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

关于java - 防止 JList 刷新失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280600/

相关文章:

java - 二叉树 : Why Does One Insert Method Work and the Other Not

java - 后台线程不起作用,但使用简单的 'System.out' 就可以了

c++ - 在 C++ 中创建标准线程会使程序崩溃

java - 需要编辑条形图的 Swing GUI 代码

Java:更改 jLabel 前景色

Java按字母数量排序

java - 在java中的计算器应用程序中连接整数

Java从父类获取子方法

.net - Windows 窗体计时器与单线程应用程序

java - 为什么我的 move() 方法不能将球保持在界内?