从事件动态更新 JList
Dynamically update JList from events
我有一个 JList
,它从 ArrayList
个对象中获取元素,并在列表窗格中显示该对象的一些元素。当我 select 该元素时,它会在其他字段和标签中显示完整信息。作为我的程序实现的一部分,我还能够向 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);
我将如何在添加和删除项目时动态更新此列表?请不要提供完整的解决方案(因为我发现这样做可以让我学得更好),但如果能提供任何有用的提示或建议,我将不胜感激。
立即想到两个解决方案:
- 根本不要使用 ArrayList,
- 而是使用 DefaultListModel 来保存您的数据集合。
- 然后,只要您在此模型中添加或删除项目,JList 就会自动更新。
- 或者是的,使用 ArrayList 来保存您的数据
- 然后使用这个相同的 ArrayList 作为您自己的代码创建的 JList 数据模型的核心。
- 这意味着 不是 使用 DefaultListModel 而是从
AbstractListModel<MyType>
. 扩展
- 然后,每当您向 ArrayList 添加或删除数据时,必须记得调用适当的 AbstractListModel
fireXxx(...)
方法,以便模型通知视图(此处JList) 的变化,所以它可以改变它的显示。
您的 DefaultListModel
拥有您需要的所有方法:
void DefaultListModel#addElement(E element);
void DefaultListModel#add(int index, E element);
E DefaultListModel#remove(int index);
boolean DefaultListModel#removeElement(Object obj)
当您从列表中 add/remove 项时,您可以对 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()
每次调用时可能 return 不同的 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());
我有一个 JList
,它从 ArrayList
个对象中获取元素,并在列表窗格中显示该对象的一些元素。当我 select 该元素时,它会在其他字段和标签中显示完整信息。作为我的程序实现的一部分,我还能够向 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);
我将如何在添加和删除项目时动态更新此列表?请不要提供完整的解决方案(因为我发现这样做可以让我学得更好),但如果能提供任何有用的提示或建议,我将不胜感激。
立即想到两个解决方案:
- 根本不要使用 ArrayList,
- 而是使用 DefaultListModel 来保存您的数据集合。
- 然后,只要您在此模型中添加或删除项目,JList 就会自动更新。
- 或者是的,使用 ArrayList 来保存您的数据
- 然后使用这个相同的 ArrayList 作为您自己的代码创建的 JList 数据模型的核心。
- 这意味着 不是 使用 DefaultListModel 而是从
AbstractListModel<MyType>
. 扩展
- 然后,每当您向 ArrayList 添加或删除数据时,必须记得调用适当的 AbstractListModel
fireXxx(...)
方法,以便模型通知视图(此处JList) 的变化,所以它可以改变它的显示。
您的 DefaultListModel
拥有您需要的所有方法:
void DefaultListModel#addElement(E element);
void DefaultListModel#add(int index, E element);
E DefaultListModel#remove(int index);
boolean DefaultListModel#removeElement(Object obj)
当您从列表中 add/remove 项时,您可以对 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()
每次调用时可能 return 不同的 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());