簡體   English   中英

從事件動態更新JList

[英]Dynamically update JList from events

我有一個JList ,它從對象的ArrayList中獲取元素,並在列表窗格中顯示該對象中的某些元素。 當我選擇該元素時,它將在其他字段和標簽中顯示完整信息。 作為程序實現的一部分,我還可以向ArrayList添加和刪​​除對象。 我想做的是每次更改ArrayListJList都會更新以反映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());

立即想到兩個解決方案:

  1. 根本不要使用ArrayList,
    • 而是使用DefaultListModel來保存數據集合。
    • 然后,無論何時在此模型中添加或刪除項目,JList都會自動更新。
  2. 或者是,使用ArrayList來保存數據
    • 然后使用相同的ArrayList作為您自己的代碼創建的JList數據模型的核心。
    • 這意味着使用DefaultListModel而是從AbstractListModel<MyType>擴展。
    • 然后,無論何時在ArrayList中添加數據或從中刪除數據,都必須記住調用適當的AbstractListModel fireXxx(...)方法,以便該模型將更改通知給視圖(此處為JList),以便可以更改其顯示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM