Java DefaultListModel包含奇怪元素的问题

时间:2014-05-19 16:53:05

标签: java swing jlist defaultlistmodel

我正在编写一个带有swing组件的Java应用程序。我有2个JLists从DefaultListModel获取数据,这些是2:

private DefaultListModel<Module> moduleListModel;
private DefaultListModel<Module> sem1ListModel;

模块是我创建的数据类。

现在的问题是,我想从moduleListModel中删除模块,如果它们也在sem1ListModel中。我知道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,但这不会发生。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我只是从评论中回答,所以这并不止于此。

问题是Module对象实际上是不同的实例,并且没有覆盖equals。这意味着,即使他们通过被覆盖的toString打印相同的东西,该模型也将它们视为不同的对象,并且不执行删除。

解决此问题的标准方法是覆盖equals(以及hashCode,以防您想要使用散列数据结构。)