【发布时间】:2014-05-19 16:53:05
【问题描述】:
我正在编写一个带有 swing 组件的 Java 应用程序。我有 2 个从 DefaultListModel 获取数据的 JList,它们是这 2 个:
private DefaultListModel<Module> moduleListModel;
private DefaultListModel<Module> sem1ListModel;
Module 是我创建的一个数据类。
现在的问题是,如果模块也在 sem1ListModel 中,我想从我的 moduleListModel 中删除它们。我知道 sem1ListModel 中有 3 个模块,它们也在 defaultListModel 中,我用来检查它是否包含它们的代码是:
for(int i = 0; i < sem1ListModel.getSize(); i++){
Module mod = sem1ListModel.getElementAt(i);
System.out.println(mod);
if(moduleListModel.contains(mod)){
System.out.println(mod);
moduleListModel.removeElement(mod);
}
}
这段代码应该可以工作,因为两个模块完全一样,但事实并非如此! 当我将两个 DefaultListModel 都打印到输出窗口时,我得到了这个:
System.out.println(sem1ListModel);
System.out.println(moduleListModel);
sem1ListModel:[软件开发 1 [7 学分],ICT 管理 1 [7 学分],DOA I [6 学分]] moduleListModel:[DOA I [6 学分],软件开发 1 [7 学分],ICT 管理 1 [7 学分],网页设计 2 [5 学分],软件 1 [5 学分]]
如您所见,软件开发 1 [7 学分]、ICT 管理 1 [7 学分]、DOA I [6 学分]是两个 DefaultListModel 中的 3 个模块,应该删除来自 moduleListModel,但这不会发生。
我做错了什么?
【问题讨论】:
-
如何填充模型?我想知道那些
Modules 是否是没有覆盖等于的不同对象。 -
public void LoadModules(ArrayList
modules){ moduleListModel.clear(); for(Module mod : modules){ moduleListModel.addElement(mod);模块 ArrayList 是一个用模块对象填充的 ArrayList。 sem1ListMoel 的填充方式相同。 -
请记住,具有相同的 toString() 实现(如您的日志记录所示)不足以使对象相等。你必须有 mod1.equals(mod2) == true ,如果你没有覆盖 Module 中的 equals() 方法是一样的作为 mod1 == mod2.
-
那么我不得不问你 arrayList 是否相同)回顾我的评论 -
Modules 实际上是相同的对象吗?或者您是否创建了 2 个在toString中打印出相同内容但与equals比较时不同的对象? -
你说得对,两个相同模块的 .equals() 返回 false。我将不得不覆盖等号
标签: java swing jlist defaultlistmodel