更改 JList 模型时 JscrollPane 不更新(Java 摆动)

JscrollPane doesn't update when changing JList model (Java swing)

我有一个带有自定义 DefaultListModel 的 JList。 JList 位于 JTabbedPane 内的 JScrollPane 内。当我通过添加或删除元素来更新模型时,即使模型已正确更改,我也看不到页面上有任何变化。

我尝试重新验证 () 和重新绘制 () 一切,但它没有改变。

有趣的事情来了。如果我用 for (int i = 0; i < model.size(); i++) model.get(i) 打印模型中的所有内容,它只会显示修改后的列表。 但是,如果我通过将列表 public 放入我的自定义模型中,则没有任何更改。

仅当我使用我手动填充的另一个列表创建和设置新模型时,我才能查看更新的列表。

TLDR;

在使用 addElement 和 removeElement 修改自定义 DefaultListModel 中的列表后,如何显示修改后的列表:

for (int i = 0; i < model.size(); i++) {
        System.out.println(model.get(i));
    }

这显示了原始列表,因此未更新视图

for (Object object : model.list) {
        System.out.println(object);
    }

我的默认列表模型class

public class ObjectListModel extends DefaultListModel
{
    final List<Object> list;

    public ObjectListModel(List<Object> list) {
        this.list = list;
    }

    @Override
    public int getSize() {
        return list.size();
    }

    @Override
   public Object getElementAt(int index) {
        return list.get(index);
    }
}

这是错误的:

public class ObjectListModel extends DefaultListModel
{
    final List<Object> list;  // <===== this here

DefaultListModel 已经有支持模型的数据核心,因此您的列表字段忽略并尝试覆盖它,但未成功。

关于:

After modifying list in custom DefaultListModel with addElement and removeElement how can this shows the modified list :

并且调用这些方法会修改DefaultListModel默认持有的数据核,不会对自己的list字段有丝毫的改变。

我建议您要么摆脱列表字段,而是将数据传递给超级对象,如果需要,包括它的构造函数,或者扩展 AbstractListModel 然后确定使用您自己的数据核心。如果您确实使用派生的 AbstractListModel class,则必须注意在模型更改时正确调用通知方法,DefaultListModel 会为您处理这些事情。

老实说,根据您发布的内容,除非您有问题中未提及的要求,否则我不确定您是否需要扩展 DefaultListModel 或 AbstractListModel,而是简单地使用 DefaultListModel 作为-是。