【问题标题】:Set selected index on JList在 JList 上设置选定的索引
【发布时间】:2013-10-14 17:54:01
【问题描述】:

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

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

  1. 用我的 defaultlistmodel 更新 jlist

    contactsJList.setModel(model);

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

    contactsJList.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?

非常感谢您的帮助!提前非常感谢你

【问题讨论】:

    标签: java swing indexing chat jlist


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我真的不知道为什么,但是在尝试执行您的第一行时出现空指针异常。 DefaultListModel 模型 = (DefaultListModel)contactsJList.getModel();
    • @user2099024,别看我,我无权访问你的代码。我建议你阅读How to Use Lists 上的 Swing 教程。它有一个工作示例,展示了如何使用我建议的方法动态更新列表的模型。
    • 谢谢。问题是我也必须做这行代码:contactsJList.setModel(new DefaultListModel()); model = (DefaultListModel) contactsJList.getModel();
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 2011-01-15
    相关资源
    最近更新 更多