从事件动态更新JList

时间:2016-04-14 21:12:27

标签: java swing arraylist jlist eventhandler

我有一个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);

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

2 个答案:

答案 0 :(得分: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()。您可以将实际对象添加到经过适当输入的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());

答案 1 :(得分:2)

立刻想到两种解决方案:

  1. 根本不要使用ArrayList,
    • 使用DefaultListModel来保存您的数据集合。
    • 然后,只要您在此模型中添加或删除项目,JList就会自动更新。
  2. 或者是,使用ArrayList来保存您的数据
    • 然后使用相同的ArrayList作为您自己的代码创建的JList数据模型的核心。
    • 这意味着使用DefaultListModel,而是从AbstractListModel<MyType>延伸。
    • 然后,无论何时添加或删除ArrayList中的数据,必须记住调用相应的AbstractListModel fireXxx(...)方法,以便模型将通知视图(此处为JList)的更改,所以它可以改变它的显示。