【问题标题】:Dynamically update JList from events从事件动态更新 JList
【发布时间】:2016-08-06 15:44:17
【问题描述】:

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

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

【问题讨论】:

    标签: java swing arraylist jlist eventhandler


    【解决方案1】:

    您的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&lt;?&gt; studentList 属于 unknown 未指定类型;我们无法恢复原始列表。甚至学生姓名的ArrayList&lt;String&gt; 也无法可靠地匹配回单个学生,因为#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&lt;MyType&gt; 扩展。
        • 然后,每当您从 ArrayList 中添加或删除数据时,您必须记得调用适当的 AbstractListModelfireXxx(...) 方法,以便模型将更改通知视图(此处为 JList),所以它可以改变它的显示。

      【讨论】:

        猜你喜欢
        • 2015-04-01
        • 2023-04-09
        • 1970-01-01
        • 2014-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多