【问题标题】:Using the JList .setModel() method with a class as an argument使用带有类作为参数的 JList .setModel() 方法
【发布时间】:2011-05-13 00:31:30
【问题描述】:

我的最终目标是拥有一个在运行时刷新其内容的 JList,我从这篇帖子 here on SO 中找到了一个可行的解决方案,但是我很好奇为什么我最初的想法没有。

到目前为止,我有类似这样的设置,并且可以正常工作:

DefaultListModel default = new DefaultListModel();

for(int i = 0; i < array.size() ; ++i){
   test.addElement(array.get(i));
}
list.setModel(default);

以下是我最初的计划。我希望有一个实现 ListModel 的类作为参数传递,希望它会刷新 JList。

SomeClass test = new SomeClass(); //Implements ListModel
list.setModel(test);

SomeClass test = new SomeClass(); //Implements ListModel
list = new JList(test);

这些都不起作用,这让我感到困惑。这最后两种方法能否起作用,代码更干净。

谢谢。

【问题讨论】:

  • 传递一个类 ListModel 而不是这个类的一个实例是一个编译器错误。你为什么困惑?
  • 我认为我的代码演示有点误导抱歉。这就是我正在做的,我将更改代码以使其更清晰。
  • 为什么最后两种方法不起作用?请提供您看到的错误。如果SomeClass 扩展ListModel,那么这两种方法都可以。
  • 您的 SomeClass 代码会很高兴看到。

标签: java swing jlist


【解决方案1】:

如果您正确实施 ListModel,第一种方法应该可以工作。关键是当你改变你需要调用的数据时:

fireContentsChanged(...);

来自 AbstractListModel(我假设你扩展了它)。调用此方法将告诉 JList 重新绘制自己。

第二种方法行不通,因为您只是在内存中创建了一个新的 JList 组件。创建组件不会将其添加到 GUI。因此,如果您使用这种方法,您需要从 GUI 中删除原始 JList,然后将新 JList 添加到 GUI。这不是很方便,也是不应该使用这种方法的一个很好的理由。设置模型始终是首选方法。

【讨论】:

  • fireContentsChanged() 应该是 AbstractListModel 的一部分还是自定义方法?此外,这是否只是重申所有价值观?谢谢。
  • 当您将 ListModel 添加到 JList 时,JList 会向模型添加侦听器。当您更改模型时,模型会通知视图(列表)数据已更改,以便视图可以重新绘制自己。此通知由作为 AbstractListModel 一部分的 fireXXX 方法完成。这就是为什么当您创建自定义模型时,您应该将抽象模型扩展为您不必重新发明轮子并通知视图。你所要做的就是调用适当的 fireXXX 方法。
【解决方案2】:

在我看来,第一个案例似乎是一个解决方案。你能提供一个可测试的例子吗?

第二种情况不起作用,因为您只是重用了一个变量,并没有实际更改 Gui 上的 JList。我假设您已经在前面的代码中将此列表添加到该人。

【讨论】:

    【解决方案3】:

    很可能您的 ListModel 实现是错误的。

    【讨论】:

      【解决方案4】:

      为什么不使用:

      DefaultListModel<String> lstList = new DefaultListModel<String>();
      

      【讨论】:

        猜你喜欢
        • 2016-09-30
        • 1970-01-01
        • 2021-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多