0

我遇到了一个“奇怪”的问题。

我正在用 Java 编写一个聊天程序,它的设计方式是让您的联系人使用 JList 收听。当任何联系人收到消息时,JList 仍应选择在收到消息之前选择的联系人。已向我发送消息的联系人应位于列表顶部,但未被选中。我通过保存当前选定联系人的索引并写入这两行来解决了这个问题。

  1. 用我的 defaultlistmodel 更新 jlist

    联系人JList.setModel(模型);

  2. 用于选择先前选择的联系人。我这样做是因为 jlist 在更新后“忘记”了选择状态。

    联系人JList.setSelectedIndex(selectedContactIndex);

问题是 setSelectedIndex 似乎并没有真正选择特定的对象。它选择了它,我可以用我的眼睛看到它,但不知何故,选择仍然是我最后一次用鼠标单击的位置。

我将尝试用一个例子来解释这个问题以使其清楚。

当我向联系人发送消息时,说联系人姓名为 Jay,列表中的索引为 5,此联系人将移至列表顶部并被选中(这是因为是我发送消息,我不是收到一个)。这意味着 Jay 变为索引 0 并通过以下方式被选中:

contactsJList.setSelectedIndex(0);

现在,当我收到来自另一个联系人(例如名字为 Ann)的消息时,我仍然希望选择 Jay。Ann 以索引 0 名列榜首,Jay 以索引 1 名列第二。现在的问题是 Jay 没有被选中,因为在收到 Ann 的消息之前我没有用鼠标亲自点击过他,而是我在代码中写了应该选中 Jay(并且是当前选中的索引)。现在请记住,在我给他发消息之前,Jay 是索引 5(这也是我用鼠标单击的索引)。因此,不是在收到 Ann 的消息后选择 Jay,而是选择了索引号 5。

为什么 setSelectedIndex() 不能正常工作?我是不是想错了?我该如何解决我的问题?也许我应该使用 ListSelectionModel?

帮助将不胜感激!非常感谢您提前

4

1 回答 1

1

不确定为什么要使用 setModel() 方法来更新 JList。

如果您要在列表顶部添加一个项目,您需要做的就是使用:

DefaultListModel model = (DefaultListModel)list.getModel();
model.add(0, yourNewItem);

这将添加项目而不影响当前选定的项目。

于 2013-10-14T18:31:00.500 回答