【问题标题】:Prevent loss of focus on JList refresh防止失去对 JList 刷新的关注
【发布时间】:2013-03-07 20:00:25
【问题描述】:

感谢您查看我的问题。我会尽量做到简洁明了。

程序


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

在线用户列表刷新之前 在线用户列表刷新后

问题


你们能给我提供任何方法,让客户端可以从“在线列表”中选择另一个用户,并且当列表刷新时,ListItem 会记住它的焦点,这样客户端就不必继续点击用户了?我不是在这里寻找代码,也不是通过任何想象来快速修复。我只是想了几天,现在我被困住了,所以非常感谢任何帮助。

提前致谢,克里斯。

【问题讨论】:

    标签: java multithreading swing


    【解决方案1】:

    您可以简单地不删除所有条目,而是遍历每个名​​称的整个列表并查看它是否已经存在,在这种情况下您添加它。这应该保持对拥有它的项目的关注。

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

    【讨论】:

    • 感谢您的建议。我实施了后者;真的很惊讶解决方案是如此简单。奇怪的是我看不到它。嗯,我们都有休息日。 :)
    • 确实,我可能不亚于你!很高兴在那些日子里帮助你:)。
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    相关资源
    最近更新 更多