[更改JList模型时,JscrollPane不会更新(Java swing)

问题描述 投票:0回答:1

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

我尝试对所有内容进行revalidate()和repaint(),但它没有改变。

现在来了有趣的事情。如果我使用for(int i = 0; i

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

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);
    }

我的DefaultListModel类

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);
    }
}

java swing awt jlist defaultlistmodel
1个回答
1
投票

这是错误的:

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

DefaultListModel已经具有支持该模型的数据核,因此您的列表字段将忽略并尝试覆盖此失败。

关于:

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

并且调用这些方法将修改DefaultListModel默认保存的数据核,并且至少不会更改您自己的列表字段。

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

老实说,根据您发布的内容,除非您的问题中没有提到要求,否则我不确定您是否甚至需要扩展DefaultListModel或AbstractListModel,而只需按原样使用DefaultListModel即可。

© www.soinside.com 2019 - 2024. All rights reserved.