我遇到了一个“奇怪”的问题。
我正在用Java编写聊天程序,它的设计方式是你的联系人用JList监听。当任何联系人收到消息时,JList仍应选择在收到消息之前选择的联系人。已将消息发送给我的联系人应该转到列表顶部但不会被选中。我通过保存当前所选联系人的索引并写入这两行来解决了这个问题。
用于使用我的defaultlistmodel
更新jlistcontactsJList.setModel(模型);
用于选择之前选择的联系人。我这样做是因为jlist在更新后“忘记”选择状态。
contactsJList.setSelectedIndex(selectedContactIndex);
问题是setSelectedIndex似乎没有选择真实的特定对象。它选择它,我可以用眼睛看到它,但不知何故,选择仍然是我最后用鼠标点击的地方。
我将尝试用一个例子解释这个问题,以便明确。
当我向联系人发送消息时,说明联系人名称Jay和列表中的索引5,此联系人将移至列表顶部并被选中(这是因为我发送消息,我'没有收到一个)。这意味着杰伊成为索引0并通过写作被选中:
contactsJList.setSelectedIndex(0);
现在,当我收到来自其他联系人的消息时,例如名字Ann,我仍然希望Jay被选中。 Ann以索引0到达列表的顶部,Jay在列表中是索引1和第二。现在的问题是周杰伦没有被选中,因为在收到Ann的消息之前我没有亲自用他的鼠标点击他,而是我在代码中写道Jay应该被选中(并且是当前选择的索引)。现在请记住,在我给他发送消息之前,Jay首先是索引5(这也是我用鼠标点击的索引)。因此,在收到Ann的消息后选择了Jay而不是Jay,索引号5被选中。
为什么setSelectedIndex()没有正常工作?我不是想对吗?我怎样才能解决我的问题?也许我应该使用ListSelectionModel?
非常感谢帮助!非常感谢您提前
答案 0 :(得分:1)
不确定为什么要使用setModel()方法更新JList。
如果您要在列表顶部添加项目,您只需使用:
DefaultListModel model = (DefaultListModel)list.getModel();
model.add(0, yourNewItem);
这将添加项目而不会影响当前选定的项目。