Java 从事件动态更新JList

Java 从事件动态更新JList,java,swing,arraylist,jlist,eventhandler,Java,Swing,Arraylist,Jlist,Eventhandler,我有一个JList,它从对象的ArrayList中获取元素,并在列表窗格中显示该对象中的一些元素。当我选择该元素时,它会在其他字段和标签中显示完整信息。作为程序实现的一部分,我还能够向ArrayList添加和删除对象。我想做的是每次更改ArrayList时,JList将更新以反映ArrayList的新状态。下面是我的JList元素的代码 DefaultListModel<String> defListModel = new DefaultListModel<String

我有一个
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 defListModel=新的DefaultListModel();
如果(studentList.size()>0){
对于(int i=0;i

在添加和删除项目时,如何动态更新此列表?请不要提供完整的解决方案(因为我发现我在实践中学习得更好),但如果有任何有用的提示或建议,我将不胜感激。

两种解决方案会立即浮现在我的脑海中:

  • 根本不要使用ArrayList,
    • 而是使用DefaultListModel保存数据集合
    • 然后,无论何时在此型号中添加或删除项目,JList都会自动更新
  • 或者是,使用ArrayList保存数据
    • 然后使用这个相同的ArrayList作为您自己代码创建的JList数据模型的核心
    • 这意味着不使用DefaultListModel,而是从
      AbstractListModel
      扩展而来
    • 然后,无论何时从ArrayList中添加或删除数据,都必须记住调用适当的AbstractListModel
      fireXxx(…)
      方法,以便模型将更改通知视图(此处为JList),以便它可以更改其显示

  • 我马上想到两个解决方案:

  • 根本不要使用ArrayList,
    • 而是使用DefaultListModel保存数据集合
    • 然后,无论何时在此型号中添加或删除项目,JList都会自动更新
  • 或者是,使用ArrayList保存数据
    • 然后使用这个相同的ArrayList作为您自己代码创建的JList数据模型的核心
    • 这意味着不使用DefaultListModel,而是从
      AbstractListModel
      扩展而来
    • 然后,无论何时从ArrayList中添加或删除数据,都必须记住调用适当的AbstractListModel
      fireXxx(…)
      方法,以便模型将更改通知视图(此处为JList),以便它可以更改其显示
  • 您的系统具有您需要的所有方法:

    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.clear();
    studentList.addAll(Collections.list(defListModel.elements()));
    
    编辑哇!很抱歉您的
    ArrayList studentList
    属于未知的未指定类型;我们无法恢复原始列表。即使学生姓名的
    ArrayList
    也无法可靠地匹配回各个学生,因为
    #toString()
    每次调用时都可能返回不同的
    字符串,具体取决于它的实现方式,而且学生姓名可能不唯一。您只需对两个列表执行相同的操作


    EDIT列表的默认呈现程序将对列表中的对象调用
    #toString()
    。您可以将实际对象添加到相应类型的
    JList
    /
    /
    DefaultListModel
    ,而不是调用
    defListModel.addElement(aStudent.toString())

    DefaultListModel<Student> defListModel = new DefaultListModel<>();
    // ...
        defListModel.addElement(aStudent);
    // ...
    JList<Student> list = new JList<>(defListModel);
    
    您的系统具有您需要的所有方法:

    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.clear();
    studentList.addAll(Collections.list(defListModel.elements()));
    
    编辑哇!很抱歉您的
    ArrayList studentList
    属于未知的未指定类型;我们无法恢复原始列表。即使学生姓名的
    ArrayList
    也无法可靠地匹配回各个学生,因为
    #toString()
    每次调用时都可能返回不同的
    字符串,具体取决于它的实现方式,而且学生姓名可能不唯一。您只需对两个列表执行相同的操作


    EDIT列表的默认呈现程序将对列表中的对象调用
    #toString()
    。您可以将实际对象添加到相应类型的
    JList
    /
    /
    DefaultListModel
    ,而不是调用
    defListModel.addElement(aStudent.toString())

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