1

我有一个对象“Test”的 JList,它使用自定义 ListCellRenderer 来显示测试的名称和旁边的图标。该图标代表测试的状态(警告、就绪、运行、完成)。Test 有一个返回 int 的 getStatus() 方法。当测试状态发生变化时,如何让 GUI 知道重新绘制?

4

1 回答 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 回答