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



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

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

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

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

TLDR;

使用 addElement 和 removeElement 修改自定义默认列表模型中的列表后,如何显示修改后的列表:

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

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

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

我的默认列表模型类

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 已经有一个支持模型的数据核心,因此您的列表字段会忽略并尝试覆盖它,但未成功。

关于:

使用 addElement 和 removeElement 修改自定义默认列表模型中的列表后,如何显示修改后的列表:

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

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

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

相关内容

  • 没有找到相关文章

最新更新