我有一个观点,我想对编辑器中发生的事情做出反应。现在我有一个我想要的按钮,以便在单击它时将视图中的数据更新为一些新的信息集。我从哪里开始,我有我的选择活动,但不知道如何在两者之间进行沟通。我正在寻找一种松散耦合的解决方案。
问问题
78 次
1 回答
0
我确信有很多方法可以做到这一点,但我过去曾使用 JFace IPropertyChangeListener接口来进行简单的事件传播。
让您的视图实现 IPropertyChangeListener。创建一个可以注册的 Singleton 类IPropertyChangeListener
,并向其发送PropertyChangeEvent。然后在您的视图的构造函数中,将其注册到您的单例中。
现在,您可以在编辑器中获取 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
}
}
于 2012-06-08T16:29:57.060 回答