试图让视图反映编辑者的状态

时间:2012-06-07 15:40:12

标签: java eclipse-rcp

我认为我想对编辑器中发生的事情做出反应。现在我有一个我想要的按钮,这样当点击它时,它会将视图中的数据更新为一组新的信息。我从哪里开始,我有我的选择事件,但不知道如何在两者之间进行沟通。我正在寻找松耦合解决方案。

1 个答案:

答案 0 :(得分:0)

我确信有很多方法可以做到这一点,但我过去曾使用JFace IPropertyChangeListener接口进行简单的事件传播。

使您的视图实现IPropertyChangeListener。创建一个Singleton类,您可以注册IPropertyChangeListener,并发送PropertyChangeEvent。然后在视图的构造函数中,将其注册到Singleton。

现在,您可以在编辑器中抓住您的Singleton,并启动将在您的视图中拾取的事件。

Singleton的示例代码:

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         
    }
}