1
我有一種觀點,我想對編輯器中發生的情況做出反應。現在我有一個我想要的按鈕,當點擊它時,它將視圖中的數據更新爲一些新的信息。我從哪裏開始,我有我的選擇活動,但不知道如何溝通這兩者。我正在尋找一種鬆耦合解決方案。試圖讓視圖反映編輯的狀態
我有一種觀點,我想對編輯器中發生的情況做出反應。現在我有一個我想要的按鈕,當點擊它時,它將視圖中的數據更新爲一些新的信息。我從哪裏開始,我有我的選擇活動,但不知道如何溝通這兩者。我正在尋找一種鬆耦合解決方案。試圖讓視圖反映編輯的狀態
我確信有很多方法可以做到這一點,但我過去使用JFace IPropertyChangeListener接口進行簡單事件傳播。
使您的視圖實現IPropertyChangeListener。創建一個Singleton類,你可以註冊你的IPropertyChangeListener
,併發送一個PropertyChangeEvent到。然後在你的視圖的構造函數中,用你的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
}
}
你想給某種反饋對我的回答?我花了一些時間在這裏,它會爲你提供你所需要的。 –