2016-04-14 62 views
0

我有一个JList,它从对象的ArrayList中获取元素,并显示列表窗格中对象的一些元素。当我选择该元素时,它会在其他字段和标签中显示完整的信息。作为我的程序实现的一部分,我也可以添加和删除对象到ArrayList。我想要做的是每次ArrayList更改JList将更新以反映ArrayList的新状态。以下是我的JList元素的代码。从事件动态更新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); 

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

回答

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()。您可以将实际对象添加到相应类型的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<MyType>延伸。
    • 然后,无论何时添加或从ArrayList中删除数据,您都必须调用相应的AbstractListModel fireXxx(...)方法,以便模型将通知视图(这里是JList)的更改,以便它可以更改其显示。