我有一个带有自定义 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。