2012-06-07 20 views
1

我有一種觀點,我想對編輯器中發生的情況做出反應。現在我有一個我想要的按鈕,當點擊它時,它將視圖中的數據更新爲一些新的信息。我從哪裏開始,我有我的選擇活動,但不知道如何溝通這兩者。我正在尋找一種鬆耦合解決方案。試圖讓視圖反映編輯的狀態

回答

0

我確信有很多方法可以做到這一點,但我過去使用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   
    } 
} 
+0

你想給某種反饋對我的回答?我花了一些時間在這裏,它會爲你提供你所需要的。 –