2016-04-14 2 views
0

У меня есть JList, который принимает элементы из объектов ArrayList и отображает некоторые элементы из объекта в панели списка. Когда я выбираю этот элемент, он отображает полную информацию в других полях и ярлыках. В рамках моей реализации программы я также могу добавлять и удалять объекты в ArrayList. То, что я хотел бы сделать, это каждый раз, когда ArrayList изменен. JList будет обновляться, чтобы отразить новое состояние ArrayList. Ниже приведен код для моего элемента JList.Динамическое обновление JList из событий

DefaultListModel<String> defListModel = new DefaultListModel<String>(); 
    if(studentList.size() > 0){ 
     for(int i = 0; i < studentList.size(); i++){ 
      Student aStudent = studentList.get(i); 
     defListModel.addElement(aStudent.toString()); 
     } 
    } 
    JList<String> list = new JList<String>(defListModel); 
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    JScrollPane scroll = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    ListSelectionModel listSelectionModel = list.getSelectionModel(); 
    listSelectionModel.addListSelectionListener(new SelectionListener()); 
    scroll.setBounds(16, 24, 130, 205); 
    mainPanel.add(scroll); 

Как я буду динамически обновлять этот список, поскольку элементы будут добавлены и удалены? Пожалуйста, не предоставляйте полное решение (поскольку я нахожу, что лучше училюсь), но любые полезные советы или предложения, в которых я мог бы найти решение, были бы оценены.

ответ

3

Ваш DefaultListModel имеет все методы, которые вам нужны:

void DefaultListModel#addElement(E element); 
void DefaultListModel#add(int index, E element); 
E  DefaultListModel#remove(int index); 
boolean DefaultListModel#removeElement(Object obj) 

Как добавить/удалить элементы из списка, вы можете сделать то же самое модификацию модели JList в.


Если вы просто сделать обновление вашей DefaultListModel, вы можете восстановить ваш ArrayList с:

studentList = Collections.list(defListModel.elements()); // creates new ArrayList 

или, если другие ссылки на studentList должна поддерживаться:

studentList.clear(); 
studentList.addAll(Collections.list(defListModel.elements())); 

EDIT Упс! Сожалею. Ваш ArrayList<?> studentList имеет номер неизвестен не указан тип; мы не можем восстановить исходный список.Даже ArrayList<String> имен студентов не могут быть надежно подобраны к отдельным ученикам, так как #toString() может возвращать разные String каждый раз, когда он вызывается, в зависимости от того, как он реализован, а имена учеников могут быть не уникальными. Вам просто нужно выполнить те же операции в обоих списках.


EDIT по умолчанию визуализатор для JList будет вызывать #toString() на объекты в списке. Вместо того, чтобы звонить defListModel.addElement(aStudent.toString()), вы можете добавить фактические объекты к соответствующему типу JList/DefaultListModel.

DefaultListModel<Student> defListModel = new DefaultListModel<>(); 
// ... 
    defListModel.addElement(aStudent); 
// ... 
JList<Student> list = new JList<>(defListModel); 

С этим изменением, defListModel может быть изменен, и соответствующие изменения в список студентов могут быть восстановлены с помощью:

studentList = Collections.list(defListModel.elements()); 
2

Два решения сразу приходят на ум:

  1. Не использовать ArrayList вообще,
    • вместо этого использовать DefaultListModel для хранения вашей коллекции данных.
    • В любое время, когда вы добавляете или удаляете элементы из этой модели, JList автоматически обновляется.
  2. Или да, использовать ArrayList для хранения данных
    • И затем использовать этот же ArrayList как ядро ​​вашего собственного кода созданной модели данных JList.
    • Это означает не с использованием DefaultListModel, а скорее от AbstractListModel<MyType>.
    • Затем, когда вы добавлять или удалять данные из ArrayList, вы необходимо помнить, чтобы вызвать соответствующий метод AbstractListModel fireXxx(...) так, что модель будет оповещать вид (здесь JList) изменений, так что он может изменить его дисплей.