2016-04-14 63 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())); 

編輯哎呀!抱歉。您的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()); 
2

兩種解決方案立刻浮現在腦海:

  1. 不要使用ArrayList可言,
    • 改用DefaultListModel握住你的數據的收集。
    • 然後,無論何時添加或刪除此模型中的項目,JList都會自動更新。
  2. 還是有的,使用ArrayList來保存你的數據
    • 然後使用相同的ArrayList作爲自己的代碼創建JList的數據模型的核心。
    • 這意味着不是使用DefaultListModel,而是從AbstractListModel<MyType>延伸。
    • 然後,無論何時添加或從ArrayList中刪除數據,您都必須調用相應的AbstractListModel fireXxx(...)方法,以便模型將通知視圖(這裏是JList)的更改,以便它可以更改其顯示。