Java – 更改对象后更新JList

我有一个使用DefaultListModel的JList。

然后我将值添加到模型中,然后出现在JList中。 我创建了一个MouseListener(双击时)允许用户编辑他们选择的那个人的当前用户号。

我已经检查过该记录的实际对象正在被更改,它是。 我遇到的唯一问题是让实际的Jlist更新以显示该对象的新值。

我当前代码的片段是:

创建JList和DefaultTableModel:

m = new DefaultListModel(); m.addListDataListener(this); jl = new JList(m); jl.addMouseListener(this); 

更新对象:

 String sEditedNumber = JOptionPane.showInputDialog(this, "Edit number for " + name, number); if (sEditedNumber != null) { directory.update (name, sEditedNumber); } 

并且(当jl是JList而m是DefaultTableModel时):

 public void contentsChanged(ListDataEvent arg0) { jl.setModel(m); } 

您需要在ListModel上调用fireContentsChanged()

而不是使用setModel() ,使用其中一个DefaultListModel方法(如setElementAt() setModel()更新现有模型,这将为您提供fireContentsChanged()

您需要调用DefaultListModel.fireContentsChanged() 。 但由于这种方法受到保护(我真的很想知道为什么),你不能直接这样做。 相反,做一个小的子类:

 class MinoListModel extends DefaultListModel { public void update(int index) { fireContentsChanged(this, index, index); } } 

将它用作列表模型:

 m = new MinoListModel<>(); jl = new JList(m); 

更新用户号后,更新相应的条目: m.update(theIndex);

或者,如果您不想要子类,则可以在用户编号更改后替换JList元素: m.setElementAt(theSameElement, theIndex); 。 虽然这有点麻烦,并且有一个子类似乎更清洁的方法。