繁体   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