Java:如何更新自定义ListCellRenderer?

Java:如何更新自定义ListCellRenderer?,java,swing,jlist,listcellrenderer,Java,Swing,Jlist,Listcellrenderer,我为我的聊天应用程序实现了自己的ListCellRenderer。我使用JList列出所有用户。单元渲染器主要由一个图标组成,该图标显示特定用户当前处于联机或脱机状态,以及他/她的姓名。该列表由DefaultListModel控制,我使用它向JList提供必要的信息 但是,当列表模型确实更改其状态(例如,用户脱机)时,列表单元渲染器似乎不会被调用 有人知道怎么解决这个问题吗?试图在JList实例上调用updateUI(),但没有帮助 非常感谢 单元渲染器可能工作正常。不起作用的是ListMode

我为我的聊天应用程序实现了自己的ListCellRenderer。我使用JList列出所有用户。单元渲染器主要由一个图标组成,该图标显示特定用户当前处于联机或脱机状态,以及他/她的姓名。该列表由DefaultListModel控制,我使用它向JList提供必要的信息

但是,当列表模型确实更改其状态(例如,用户脱机)时,列表单元渲染器似乎不会被调用

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


非常感谢

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


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

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


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

向我们展示代码。模型更改时应调用渲染器。您可能忘记触发一个事件来表示模型已更改。请显示代码。模型更改时应调用渲染器。您可能忘记触发一个事件来表示模型已更改。非常感谢您的快速回复。我将尝试调用fireContentsChanged,因为此方法受保护,所以实际上我必须扩展DefaultListModel.btw。javadoc对JList.UpdateUI()函数说:如果当前单元渲染器是由开发人员安装的(而不是外观本身),这也会导致单元渲染器及其子级被更新。。。这不仅听起来不错,而且对我的问题也有帮助。你不这么认为吗?不。不是列表的显示会被更新,而是渲染器组件的UI委托会被更新。引用中的“…”是:“,通过对其调用{@code SwingUtilities.updateComponentTreeUI}”。这不是“重新绘制列表”之类的。如果我回答的最后一段听起来有点刺耳,我很抱歉在大多数情况下,如果您有可变的列表元素,那么最好从
AbstractTableModel
进行扩展;这样更容易实现合理的更新方法(没有太多的侦听器)。非常感谢您的快速回复。我将尝试调用fireContentsChanged,因为此方法受保护,所以实际上我必须扩展DefaultListModel.btw。javadoc对JList.UpdateUI()函数说:如果当前单元渲染器是由开发人员安装的(而不是外观本身),这也会导致单元渲染器及其子级被更新。。。这不仅听起来不错,而且对我的问题也有帮助。你不这么认为吗?不。不是列表的显示会被更新,而是渲染器组件的UI委托会被更新。引用中的“…”是:“,通过对其调用{@code SwingUtilities.updateComponentTreeUI}”。这不是“重新绘制列表”之类的。如果我回答的最后一段听起来有点刺耳,我很抱歉在大多数情况下,如果您有可变的列表元素,那么最好从
AbstractTableModel
进行扩展;这样更容易实现合理的更新方法(没有太多的侦听器)。