Использование метода JList .setModel() с классом в качестве аргумента

Моя конечная цель - иметь JList, который обновляет свой контент во время выполнения, и я нашел решение, которое работает из этого сообщения здесь, на SO, однако мне любопытно, почему моя первоначальная идея этого не сделала.

На данный момент у меня есть что-то вроде этой настройки, и она работает:

DefaultListModel default = new DefaultListModel();

for(int i = 0; i < array.size() ; ++i){
   test.addElement(array.get(i));
}
list.setModel(default);

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

SomeClass test = new SomeClass(); //Implements ListModel
list.setModel(test);

or

SomeClass test = new SomeClass(); //Implements ListModel
list = new JList(test);

Ни одна из этих работ, что меня смущает. Могут ли эти последние два метода работать как-то, код намного чище.

Спасибо.


person Koop    schedule 20.11.2010    source источник
comment
Передача класса ListModel вместо экземпляра этого класса является ошибкой компилятора. Почему вы путаете?   -  person Istao    schedule 20.11.2010
comment
Я думаю, что моя демонстрация кода немного вводит в заблуждение, извините. Это то, что я делал, я изменю код, чтобы сделать это более понятным.   -  person Koop    schedule 20.11.2010
comment
Почему последние два метода не работают? Укажите ошибку, которую вы видите. Если SomeClass расширяет ListModel, то оба этих метода будут работать.   -  person Nate W.    schedule 20.11.2010
comment
ваш код SomeClass было бы неплохо увидеть.   -  person akf    schedule 20.11.2010


Ответы (4)


Первый подход должен работать, если вы правильно реализуете ListModel. Суть в том, что когда вы изменяете данные, которые вам нужно вызывать:

fireContentsChanged(...);

из AbstractListModel (которую, как я предполагаю, вы расширяете). Вызов этого метода заставит JList перерисовать себя.

Второй подход не будет работать, потому что вы просто создаете новый компонент JList, который находится в памяти. Создание компонента не добавляет его в графический интерфейс. Поэтому, если вы используете этот подход, вам нужно удалить исходный JList из графического интерфейса, а затем добавить новый JList в графический интерфейс. Это не очень удобно и является веской причиной, по которой этот подход не следует использовать. Настройка модели всегда является предпочтительным подходом.

person camickr    schedule 20.11.2010
comment
FireContentsChanged() должен быть частью AbstractListModel или пользовательским методом? Кроме того, это просто повторяется во всех значениях? Спасибо. - person Koop; 20.11.2010
comment
Когда вы добавляете ListModel в JList, JList добавляет слушателя к модели. Когда вы меняете модель, модель уведомляет представление (список) об изменении данных, чтобы представление могло перерисовываться. Это уведомление выполняется методами fireXXX, которые являются частью AbstractListModel. Вот почему, когда вы создаете пользовательскую модель, вы должны расширить абстрактную модель, чтобы вам не пришлось изобретать велосипед и уведомлять представление. Все, что вам нужно сделать, это вызвать соответствующий метод fireXXX. - person camickr; 21.11.2010

Первый случай кажется мне решением. Можете ли вы привести проверяемый пример?

Второй случай не будет работать, потому что вы просто повторно используете переменную и фактически не меняете JList в графическом интерфейсе. Я предполагаю, что вы уже добавили этот список парню ранее в коде.

person jzd    schedule 20.11.2010

Скорее всего, ваша реализация ListModel неверна.

person milan    schedule 20.11.2010

Почему бы не использовать:

DefaultListModel<String> lstList = new DefaultListModel<String>();
person Trevor Dndreezy Netshisaulu    schedule 17.06.2018