我有一个带有自定义DefaultListModel的JList。 JList位于JScrollPane内部的JScrollPane内部。当我通过添加或删除元素来更新模型时,即使模型已正确更改,页面上也看不到任何变化。
我尝试对所有内容进行revalidate()和repaint(),但它没有改变。
现在来了有趣的事情。如果我使用for(int i = 0; i 仅当我使用手动填写的另一个列表创建并设置新模型时,我才能查看更新的列表。 TLDR; 在使用addElement和removeElement在自定义DefaultListModel中修改列表之后,如何显示修改后的列表: 这显示原始列表,因此视图未更新 我的DefaultListModel类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中修改列表之后,如何显示修改后的列表:
并且调用这些方法将修改DefaultListModel默认保存的数据核,并且至少不会更改您自己的列表字段。
我建议您要么摆脱列表字段,要么将数据传递给超级对象(如果需要的话,包括其构造函数),或者扩展AbstractListModel,然后确定使用您自己的数据核。如果确实使用派生自AbstractListModel的类,则必须注意在模型更改时正确调用通知方法,这是DefaultListModel会为您解决的问题。
老实说,根据您发布的内容,除非您的问题中没有提到要求,否则我不确定您是否甚至需要扩展DefaultListModel或AbstractListModel,而只需按原样使用DefaultListModel即可。