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
在添加和删除项目时,如何动态更新此列表?请不要提供完整的解决方案(因为我发现我在实践中学习得更好),但如果有任何有用的提示或建议,我将不胜感激。两种解决方案会立即浮现在我的脑海中:
- 而是使用DefaultListModel保存数据集合
- 然后,无论何时在此型号中添加或删除项目,JList都会自动更新
- 然后使用这个相同的ArrayList作为您自己代码创建的JList数据模型的核心
- 这意味着不使用DefaultListModel,而是从
扩展而来AbstractListModel
- 然后,无论何时从ArrayList中添加或删除数据,都必须记住调用适当的AbstractListModel
方法,以便模型将更改通知视图(此处为JList),以便它可以更改其显示李>fireXxx(…)
我马上想到两个解决方案:
- 而是使用DefaultListModel保存数据集合
- 然后,无论何时在此型号中添加或删除项目,JList都会自动更新
- 然后使用这个相同的ArrayList作为您自己代码创建的JList数据模型的核心
- 这意味着不使用DefaultListModel,而是从
扩展而来AbstractListModel
- 然后,无论何时从ArrayList中添加或删除数据,都必须记住调用适当的AbstractListModel
方法,以便模型将更改通知视图(此处为JList),以便它可以更改其显示李>fireXxx(…)
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);