Задайте избрания индекс в JList

Срещнах "странен" проблем.

Правя програма за чат на Java и тя е проектирана по начин, по който вашите контакти се слушат с JList. Когато съобщение бъде получено от който и да е контакт, JList все пак трябва да избере контакта, който е бил избран преди получаването на съобщението. Контактът, който ми е изпратил съобщението, трябва да отиде в горната част на списъка, но не и да бъде избран. Реших този проблем, като запазих индекса на текущо избрания контакт и написах тези два реда.

  1. за актуализиране на jlist с моя defaultlistmodel

    contactsJList.setModel(модел);

  2. за избор на избрания преди това контакт. Правя това, защото jlist "забравя" за състоянието на избор, след като се актуализира.

    contactsJList.setSelectedIndex(selectedContactIndex);

Проблемът е, че setSelectedIndex изглежда не избира конкретния обект наистина. Селектира го и мога да го видя с очите си, но някак си селекцията все още е там, където последно щракнах с мишката.

Ще се опитам да обясня проблема с пример, за да стане ясно.

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

contactsJList.setSelectedIndex(0);

Сега, когато получа съобщение от друг контакт, например с името Ан, все още искам Джей да бъде избран. Ан стига до върха на списъка с индекс 0, а Джей е индекс 1 и втори в списъка. Проблемът сега е, че Jay не се избира, ЗАЩОТО не съм щракнал върху него лично с мишката, преди да получа съобщението от Ann, вместо това написах в код, че Jay трябва да бъде избран (и да бъде текущо избраният индекс). Сега си спомнете, че Джей беше индекс 5 на първо място, преди да му изпратя съобщение (това е и индексът, върху който щракнах с мишката). Така че вместо Jay да бъде избран след получаване на съобщението от Ann, индекс номер 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
Благодаря ти. Проблемът беше, че трябваше да направя и този ред код: contactsJList.setModel(new DefaultListModel()); модел = (DefaultListModel) contactsJList.getModel(); - person user2099024; 14.10.2013