【问题标题】:Java DefaultListModel weird element-containing issueJava DefaultListModel 奇怪的包含元素的问题
【发布时间】: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


【解决方案1】:

我会从 cmets 那里得到答案,所以这不会挂起。

问题在于Module 对象实际上是不同的实例,并且没有覆盖equals。这意味着,即使它们通过覆盖的toString 打印了相同的内容,模型仍将它们视为不同的对象并且不执行删除。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2013-08-19
    • 2011-10-05
    • 1970-01-01
    相关资源
    最近更新 更多