Java-更改对象后更新JList

Java-更改对象后更新JList,java,swing,object,jlist,defaultlistmodel,Java,Swing,Object,Jlist,Defaultlistmodel,我有一个使用DefaultListModel的JList 然后,我将值添加到模型中,然后显示在JList中。我已经创建了一个MouseListener(双击时),允许用户编辑他们选择的人的当前用户号码 我已经检查了该记录的实际对象是否正在更改,并且它是。我遇到的唯一问题是更新实际的Jlist以显示该对象的新值 我拥有的当前代码片段包括: 创建JList和DefaultTableModel: m = new DefaultListModel(); m.addListDataListener(thi

我有一个使用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);
}
public void contentsChanged(ListDataEvent arg0) {
        jl.setModel(m);
    }
更新对象:

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);
}
public void contentsChanged(ListDataEvent arg0) {
        jl.setModel(m);
    }
和(当jl是JList,m是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);
}
public void contentsChanged(ListDataEvent arg0) {
        jl.setModel(m);
    }

您需要调用ListModel。

而不是
setModel()
,使用
DefaultListModel
方法之一更新现有模型,例如,它将
fireContentsChanged()

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

class MinoListModel<T> extends DefaultListModel<T>
{
    public void update(int index)
    {
        fireContentsChanged(this, index, index);
    }
}
class MinoListModel扩展了DefaultListModel
{
公共无效更新(整数索引)
{
fireContentsChanged(这个,索引,索引);
}
}
将其用作列表模型:

m = new MinoListModel<>();
jl = new JList(m);
m=new MinoListModel();
jl=新的JList(m);
更新用户编号后,更新相应条目:
m.update(索引)


或者,如果不需要子类,可以在用户编号更改后替换JList元素:
m.setElementAt(samelement,theIndex)。尽管这有点麻烦,拥有子类似乎是更干净的方法。

我可以在DefaultListModel上这样做吗?@M92:为什么不呢?因为DefaultListModel是从AbstractListModel扩展而来的?我不确定如何实现这一点,但是,我能得到一些指导吗?我似乎无法让它工作。我在哪里添加它,以及如何使用它更新JList?我正在尝试使用提供的链接,但距离不远。我担心在
DefaultListModel
已经触发模型之外的事件时触发该事件。另请参见。为什么要使用
MouseListener
而不是一个?它受
保护
正是为了让您这样做。列表事件触发应该封装在
ListModel
本身中,而不是散布在应用程序中。