1

カスタムListCellRendererを使用してテストの名前とその横にアイコンを表示するオブジェクト「Test」のJListがあります。アイコンは、テストのステータス (警告、準備完了、実行中、完了) を表します。Test には、int を返す getStatus() メソッドがあります。テストのステータスが変化したときに再描画するように GUI に知らせるにはどうすればよいですか?

4

1 に答える 1

3

私が信じている鍵は、あなたの ListModel にあります。おそらく、これは AbstractListModel を拡張します。モデルは、モデルに含まれる Test オブジェクトへの変更をリッスンするか、通知を受ける必要があります。その後、モデルのfireContentsChanged(...)メソッドを呼び出す必要があります。これを行うと、モデルをリッスンするビューに、それ自体の一部を再描画する必要があることが通知されます。

変更をリッスンする 1 つの方法は、SwingPropertyChangeSupport オブジェクトを使用してステータスを「バインドされた」プロパティにし、モデルが保持するアイテムに PropertyChangeListeners を追加することです。

これを実装するには:

  • Test クラスには SwingPropertyChangeSupport オブジェクトが必要です。
  • Test クラスには addPropertyChangeListener メソッドと removePropertyChangeListener メソッドの両方が必要です。これらのメソッドは、SwingPropertyChangeSupport オブジェクトに対してリスナーを追加または削除します。
  • Test クラスには、それが保持する SwingPropertyChangeSupport オブジェクトsetStatus(...)を呼び出すメソッドがあります。firePropertyChange(...)
  • addItem(...)Test オブジェクトをモデルのコアに追加するだけでなく、PropertyChangeListener を Test オブジェクトに追加するメソッドを ListModel に与えます。リスト内のすべての項目に同じ PropertyChangeListener を使用できますし、使用する必要があります。
  • もちろん、このメソッドは も呼び出しますfireIntervalAdded(...)
  • 同様に、このクラスにremoveItem(...)、同じ PropertyChangeListener を削除して も呼び出すメソッドを指定しますfireIntervalRemoved(...)
  • ListModel に PropertyChangeListener の内部クラスを与えることを検討し、そのクラスの propertyChange メソッドで、getSource()メソッドを介して変更された Test オブジェクトを特定し、この Test オブジェクトのインデックスを見つけて、 を呼び出しますfireContentChanged(...)
于 2013-05-17T21:39:43.990 に答える