Установить выбранный индекс в JList

Столкнулся со "странной" проблемой.

Я делаю программу чата на Java, и она разработана таким образом, чтобы ваши контакты прослушивались с помощью JList. Когда сообщение получено каким-либо контактом, JList все равно должен выбрать контакт, который был выбран до получения сообщения. Контакт, отправивший мне сообщение, должен быть вверху списка, но не быть выбранным. Я решил эту проблему, сохранив индекс текущего выбранного контакта и написав эти две строки.

  1. для обновления jlist с моей моделью defaultlistmodel

    контактыJList.setModel(модель);

  2. для выбора ранее выбранного контакта. Я делаю это, потому что jlist «забывает» о состоянии выбора после его обновления.

    контактыJList.setSelectedIndex(selectedContactIndex);

Проблема в том, что setSelectedIndex, похоже, не выбирает конкретный объект на самом деле. Он выбирает его, и я могу видеть его глазами, но каким-то образом выбор остается там, где я в последний раз щелкнул мышью.

Я постараюсь объяснить проблему на примере, чтобы было понятно.

Когда я отправляю сообщение контакту, скажем, контакту с именем Джей и индексом 5 в списке, этот контакт переместится в начало списка и будет выбран (это потому, что это я отправляю сообщение, а не я). получение одного). Это означает, что Jay становится индексом 0 и выбирается, написав:

contactsJList.setSelectedIndex(0);

Теперь, когда я получаю сообщение от другого контакта, например, с именем Энн, я все еще хочу, чтобы Джей был выбран. Энн попадает в начало списка с индексом 0, а Джей занимает индекс 1 и второе место в списке. Теперь проблема в том, что Джей не выбран, ПОТОМУ ЧТО я не щелкнул по нему мышью до того, как получил сообщение от Энн, вместо этого я написал в коде, что Джей должен быть выбран (и быть текущим выбранным индексом). Теперь вспомните, что у Джея был индекс 5, прежде чем я отправил ему сообщение (это также индекс, по которому я щелкнул мышью). Таким образом, вместо выбора Джея после получения сообщения от Энн выбирается номер индекса 5.

Почему setSelectedIndex() не работает должным образом? Я не правильно думаю или что? Как я могу решить свою проблему? Может быть, мне следует использовать ListSelectionModel?

Помощь будет очень признательна! заранее большое спасибо


person user2099024    schedule 14.10.2013    source источник


Ответы (1)


Не уверен, почему вы используете метод setModel() для обновления JList.

Если вы добавляете элемент вверху списка, все, что вам нужно сделать, это использовать:

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

Это добавит элемент, не затрагивая текущий выбранный элемент.

person camickr    schedule 14.10.2013
comment
Я действительно не знаю почему, но я получаю исключение nullpointerexception при попытке выполнить вашу первую строку. Модель DefaultListModel = (DefaultListModel)contactsJList.getModel(); - person user2099024; 14.10.2013
comment
@ user2099024, не смотри на меня, у меня нет доступа к твоему коду. Я предлагаю вам прочитать учебник Swing по Как использовать списки . В нем есть рабочий пример, который показывает, как динамически обновлять модель списка, используя предложенный мной подход. - person camickr; 14.10.2013
comment
Спасибо. Проблема заключалась в том, что мне пришлось сделать и эту строку кода: contactJList.setModel(new DefaultListModel()); модель = (DefaultListModel) contactJList.getModel(); - person user2099024; 14.10.2013