エディターで何が起こるかに反応したいという見解があります。現在、クリックするとビュー内のデータが新しい情報セットに更新されるようにするボタンがあります。どこから始めればよいですか。選択イベントがありますが、2 つの間の通信方法がわかりません。疎結合ソリューションを探しています。
1 に答える
0
これを行うには多くの方法があると思いますが、私は過去に、簡単なイベント伝搬のためにJFace IPropertyChangeListenerインターフェースを使用しました。
ビューに IPropertyChangeListener を実装させます。登録できる Singleton クラスを作成し、 PropertyChangeEventIPropertyChangeListener
を送信します。次に、ビューのコンストラクターで、シングルトンに登録します。
これで、エディターでシングルトンを取得し、ビューで取得されるイベントを開始できます。
シングルトンのコード例:
public class PropertyChangeEventBus {
private static PropertyChangeEventBus s_instance = new PropertyChangeEventBus();
public static PropertyChangeEventBus instance()
{
return s_instance;
}
private Set<IPropertyChangeListener> m_listeners;
private PropertyChangeEventBus()
{
// use CopyOnWriteArraySet to prevent ConcurrentModificationExceptions
m_listeners = new CopyOnWriteArraySet<IPropertyChangeListener>();
}
public void addListener(IPropertyChangeListener listener)
{
m_listeners.add(listener);
}
public void removeListener(IPropertyChangeListener listener)
{
m_listeners.remove(listener);
}
public void fire(final PropertyChangeEvent event)
{
// run property change events in UI thread to prevent having to have lots of syncExecs in the listener methods
ViewUtils.syncExec(new Runnable()
{
@Override
public void run()
{
for (IPropertyChangeListener listener : m_listeners)
{
try
{
listener.propertyChange(event);
}
catch(Exception e)
{
//log it, present error message
}
}
}
});
}
}
ビューのコード例:
//The constructor
public MyView()
{
PropertyChangeEventBus.instance().addListener(this);
}
@Override
public void propertyChange(PropertyChangeEvent event)
{
if(event.getProperty().equals(SOME_CONSTANT))
{
// Refresh View
}
}
于 2012-06-08T16:29:57.060 に答える