[英]Dynamically update JList from events
我有一個JList
,它從對象的ArrayList
中獲取元素,並在列表窗格中顯示該對象中的某些元素。 當我選擇該元素時,它將在其他字段和標簽中顯示完整信息。 作為程序實現的一部分,我還可以向ArrayList
添加和刪除對象。 我想做的是每次更改ArrayList
, JList
都會更新以反映ArrayList
的新狀態。 以下是我的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);
當添加和刪除項目時,我將如何動態更新此列表? 請不要提供完整的解決方案(因為我發現這樣做可以使我學得更好),但是任何可以找到解決方案的有用提示或建議將不勝感激。
您的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()));
編輯糟糕! 抱歉。 您的ArrayList<?> studentList
是未知類型的; 我們無法恢復原始列表。 甚至學生姓名的ArrayList<String>
也無法可靠地匹配回各個學生,因為#toString()
每次調用時都可能返回不同的String
(取決於實現方式),並且學生姓名可能不是唯一的。 您只需要對兩個列表執行相同的操作。
編輯 JList
的默認渲染器將在列表中的對象上調用#toString()
。 您可以將實際對象添加到適當類型的JList
/ DefaultListModel
,而不是調用defListModel.addElement(aStudent.toString())
。
DefaultListModel<Student> defListModel = new DefaultListModel<>();
// ...
defListModel.addElement(aStudent);
// ...
JList<Student> list = new JList<>(defListModel);
進行此更改后,可以修改defListModel,並且可以使用以下方法恢復對學生列表的相應更改:
studentList = Collections.list(defListModel.elements());
立即想到兩個解決方案:
AbstractListModel<MyType>
擴展。 fireXxx(...)
方法,以便該模型將更改通知給視圖(此處為JList),以便可以更改其顯示。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.