如何根据状态更新GUI

时间:2013-05-17 21:25:05

标签: java swing events jlist

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

1 个答案:

答案 0 :(得分:3)

我相信的钥匙在于你的ListModel。据推测,这扩展了AbstractListModel。模型应该监听或通知模型中包含的Test对象的更改,然后需要调用模型的fireContentsChanged(...)方法。执行此操作将通知侦听模型的视图,它必须重新绘制其自身的一部分。

监听更改的一种方法是使用SwingPropertyChangeSupport对象使您的状态成为“绑定”属性,然后让模型将PropertyChangeListeners添加到它所拥有的项目中。

实现这个:

  • Test类应该有一个SwingPropertyChangeSupport对象。
  • Test类应该同时包含addPropertyChangeListener和removePropertyChangeListener方法,然后在SwingPropertyChangeSupport对象中添加或删除侦听器。
  • Test类将有一个setStatus(...)方法,在它所持有的SwingPropertyChangeSupport对象上调用firePropertyChange(...)
  • 为ListModel提供一个addItem(...)方法,不仅可以将Test对象添加到模型的核心,还可以将PropertyChangeListener添加到Test对象。您可以并且可能应该对列表中的所有项使用相同的PropertyChangeListener。
  • 当然这种方法也会调用fireIntervalAdded(...)
  • 同样,为此类提供一个removeItem(...)方法,该方法删除相同的PropertyChangeListener并调用fireIntervalRemoved(...)
  • 考虑为ListModel提供PropertyChangeListener的内部类,并在该类的propertyChange方法中,通过getSource()方法识别哪个Test对象已更改,找到此Test对象的索引,然后调用{{1 }}。