我有一个对象“Test”的 JList,它使用自定义 ListCellRenderer 来显示测试的名称和旁边的图标。该图标代表测试的状态(警告、就绪、运行、完成)。Test 有一个返回 int 的 getStatus() 方法。当测试状态发生变化时,如何让 GUI 知道重新绘制?
问问题
102 次
1 回答
3
我相信关键在于您的 ListModel。大概这扩展了 AbstractListModel。模型应该监听或通知模型中包含的测试对象的更改,然后fireContentsChanged(...)
需要调用模型的方法。这样做会通知监听模型的视图,它必须重新绘制自身的一部分。
侦听更改的一种方法是使用 SwingPropertyChangeSupport 对象使您的状态成为“绑定”属性,然后让模型将 PropertyChangeListeners 添加到它持有的项目中。
要实现这一点:
- Test 类应该有一个 SwingPropertyChangeSupport 对象。
- Test 类应该同时具有 addPropertyChangeListener 和 removePropertyChangeListener 方法,然后将侦听器添加到 SwingPropertyChangeSupport 对象或从 SwingPropertyChangeSupport 对象中删除。
- Test 类将有一个
setStatus(...)
调用firePropertyChange(...)
它持有的 SwingPropertyChangeSupport 对象的方法。 - 为您的 ListModel 提供一个
addItem(...)
方法,该方法不仅将 Test 对象添加到模型的核心,而且还将 PropertyChangeListener 添加到 Test 对象。您可以并且可能应该对列表中的所有项目使用相同的 PropertyChangeListener。 - 当然这个方法也会调用
fireIntervalAdded(...)
. - 同样,为此类提供一个
removeItem(...)
方法,该方法删除相同的 PropertyChangeListener 并调用fireIntervalRemoved(...)
. - 考虑为您的 ListModel 提供一个 PropertyChangeListener 的内部类,并在该类的 propertyChange 方法中,通过该
getSource()
方法确定哪个 Test 对象发生了更改,找到该 Test 对象的索引,然后调用fireContentChanged(...)
.
于 2013-05-17T21:39:43.990 回答