【问题标题】:Java: How to update custom ListCellRenderer?Java:如何更新自定义 ListCellRenderer?
【发布时间】:2012-02-23 19:37:21
【问题描述】:

我为我的聊天应用实现了自己的 ListCellRenderer。我使用 JList 列出所有用户。单元格渲染器主要由一个图标组成,该图标显示特定用户当前是在线还是离线,以及他/她的姓名。该列表由 DefaultListModel 控制,我使用它为 JList 提供必要的信息。

但是当列表模型确实改变了它的状态时(例如用户下线),列表单元渲染器似乎没有被调用?

有人知道如何解决这个问题吗?尝试在 JList 实例上调用 updateUI(),但没有帮助。

非常感谢!

【问题讨论】:

  • 向我们展示代码。模型更改时应调用渲染器。您可能忘记触发一个事件来表明模型已更改。

标签: java swing jlist listcellrenderer


【解决方案1】:

单元格渲染器可能工作正常。不工作的是 ListModel。 DefaultListModel 不检测模型对象内部状态的变化。您需要在列表模型上调用fireContentsChanged。可能您需要向模型对象添加侦听器,甚至可能需要扩展 DefaultListModel;因为我没有看到它的代码,所以我不知道你的样子。

您不应该只调用一个听起来不错的名称的随机方法(updateUI 做了一些非常不同的事情)。

【讨论】:

  • 非常感谢您的快速回复。我会尝试调用 fireContentsChanged,因为这个方法是受保护的,我实际上必须扩展 DefaultListModel。
  • 顺便说一句。 javadoc 对 JList.UpdateUI() 函数的说明如下:如果当前单元格渲染器是由开发人员安装的(而不是外观本身),这也会导致单元格渲染器及其子级被更新......这不是听起来不错,但对我的问题也有帮助。你不觉得吗?
  • 没有。不会更新列表的显示,而是渲染器组件的 UI 委托。引用中的“...”是:“通过调用 {@code SwingUtilities.updateComponentTreeUI} 就可以了。”。那不是“重新绘制列表”之类的。如果我回答的最后一段听起来有点刺耳,我很抱歉。 / IMO 大多数情况下,如果您有可变列表元素,最好从AbstractTableModel 扩展;以这种方式更容易实现合理的更新方法(没有太多听众)。
猜你喜欢
  • 2011-02-19
  • 1970-01-01
  • 2011-08-19
  • 2011-12-14
  • 1970-01-01
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多