2010-11-20 3 views
5

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

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

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); 

или

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

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

Спасибо.

+0

Передача класса ListModel вместо экземпляра этого класса является ошибкой компилятора. Почему вы сбиваете с толку? – Istao

+0

Я думаю, что моя демо-версия кода немного вводит в заблуждение. То, что я делаю, я изменю код, чтобы сделать это более понятным. – Koop

+1

Почему не работают эти последние два метода? Пожалуйста, предоставьте ошибку, которую вы видите. Если 'SomeClass' расширяет' ListModel', то оба этих метода будут работать. –

ответ

3

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

fireContentsChanged(...); 

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

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

+0

является fireContentsChanged(), который должен быть частью AbstractListModel или настраиваемого метода? Кроме того, это просто повторяет все значения? Благодарю. – Koop

+0

Когда вы добавляете ListModel в JList, JList добавляет слушателя к модели. Когда вы меняете модель, модель уведомляет представление (список) о том, что данные были изменены, поэтому представление может перерисовываться. Это уведомление выполняется с помощью методов fireXXX, которые являются частью AbstractListModel. Вот почему при создании пользовательской модели вы должны расширить абстрактную модель, вам не нужно изобретать колесо и уведомлять представление. Все, что вы делаете, - это метод apororiate fireXXX. – camickr

1

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

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

0

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