2013-05-17 67 views
1

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

回答

3

我相信这个关键在于你的ListModel。据推测,这扩展了AbstractListModel。模型应该听取或者被通知模型中包含的测试对象的变化,然后需要调用模型的fireContentsChanged(...)方法。这样做会通知视图,该视图监听模型,它必须重绘其本身的一部分。

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

要实现这一点:

  • 测试类应该有一个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对象的索引,然后调用fireContentChanged(...)
+0

我发现SwingWorker实际上为你做了大部分工作:) – Aman