Использование метода JList .setModel () с классом в качестве аргумента. - PullRequest
5 голосов
/ 20 ноября 2010

Моя конечная цель - создать 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);

или

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

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 20 ноября 2010

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

fireContentsChanged(...);

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

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

1 голос
/ 20 ноября 2010

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

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

0 голосов
/ 17 июня 2018

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

DefaultListModel<String> lstList = new DefaultListModel<String>();
0 голосов
/ 20 ноября 2010

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

...