【问题标题】:Java - Updating JList after changing an objectJava - 更改对象后更新 JList
【发布时间】:2012-04-09 13:01:55
【问题描述】:

我有一个使用 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);
    }

【问题讨论】:

标签: java swing object jlist defaultlistmodel


【解决方案1】:

代替setModel(),使用DefaultListModel 方法之一更新现有模型,例如setElementAt(),这将为您提供fireContentsChanged()

【讨论】:

【解决方案2】:

您需要在 ListModel 上调用fireContentsChanged()

【讨论】:

  • 我可以在 DefaultListModel 上这样做吗?
  • @M92:既然 DefaultListModel 是从 AbstractListModel 扩展而来的,为什么不呢?
  • 我不确定如何实现这一点,我可以得到一些指导吗?我似乎无法让它工作。我在哪里添加它,以及如何使用它来更新 JList?我正在尝试使用提供的链接,但没有走远。
  • DefaultListModel 已经这样做时,我对在模型外触发事件持谨慎态度。
【解决方案3】:

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

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

将其用作您的列表模型:

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

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

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

【讨论】:

  • protected 正是为了让你这样做。列表事件触发应该封装在 ListModel 本身中,而不是散布在您的应用程序中。
猜你喜欢
  • 2014-01-12
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多