1

エディターで何が起こるかに反応したいという見解があります。現在、クリックするとビュー内のデータが新しい情報セットに更新されるようにするボタンがあります。どこから始めればよいですか。選択イベントがありますが、2 つの間の通信方法がわかりません。疎結合ソリューションを探しています。

4

1 に答える 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 に答える