Привязка Swing JList к массиву

#java #swing #user-interface #jlist

#java #swing #пользовательский интерфейс #jlist

Вопрос:

Я хочу привязать JList в JScrollPane к массиву, всякий раз, когда массив изменяется, список изменяется.

Комментарии:

1. @Ahmed, когда вы нажимаете «Вставить ", you want your queue( JList» в JScrollPane ?), чтобы добавить элемент, JTextField будет обновляться для отображения размера очереди?

2. Нет, когда я нажимаю insert, я буду отображать содержимое queue на панели. текстовое поле — это еще один ввод

3. @Ahmed, что такое «содержимое» очереди и где их источник? Полагаю, я все еще немного сбит с толку, по крайней мере, изображением. какую роль, если таковая имеется, играет текстовое поле во всем этом?

4. Хм, извините за путаницу. Позвольте мне просто сформулировать это так. У меня есть JList. И у меня есть массив, который обновляется до тех пор, пока выполняется программа. Я хочу создать что-то вроде table.setModel (blabla), но для того, чтобы список обновлялся всякий раз, когда обновляется этот фрейм

5. реальные массивы ( Something[] ) не доступны для прослушивания в Java. Я бы посоветовал вам использовать List<Something> реализацию. Вам обязательно следует взглянуть на библиотеку с открытым исходным кодом GlazedLists .

Ответ №1:

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

 public JList(Object[] listData);
public JList(Vector<?> listData);
  

Очевидно, что это не сработает. Только в том случае, если вы используете третий конструктор не по умолчанию

 public JList(ListModel model);
  

и используйте реализацию по умолчанию DefaultListModel и обновляйте ее элементы напрямую, например

 DefaultListModel model = new DefaultListModel();
...
model.setElementAt(value, 25);
  

вы получаете динамически обновляемый JList компонент, обновляя DefaultListModel .

Что предоставляет Java SE, так это «список фиксированного размера, подкрепленный указанным массивом» с помощью java.util.Arrays.asList(T... a) метода, сравните Java SE API.

Однако здесь поддержка Java SE прерывается. Не существует ListModel реализации, которая была бы «подкреплена списком».

Я пробовал оба способа преодолеть это:

  1. реализовать List интерфейс в классе, синхронно обновляющем базовый DefaultListModel
  2. расширять DefaultListModel , синхронно обновляя базовый List экземпляр.

Ни один из способов не сработал.

Поэтому я рискну сказать, что Java SE пока не поддерживает эту функцию. Вы должны закодировать свою собственную реализацию, JList синхронизированную List экземпляром, или подождать, пока не появится новый дистрибутив Java, который содержит JList's или DefaultListModel's поддерживается List экземплярами с помощью резервных копий.