2012-09-04 76 views
3

如果我錯過了實例,如何從SWT中刪除所有聽衆StyledText?我試圖使用StyledText.getListeners(int)方法獲取所有實例,之後可以將其刪除。但是,找到所有必需的int值很耗盡。這是最簡單的方法嗎?謝謝!SWT從StyledText中刪除所有聽衆

這裏是我的臨時解決方案:

public void removeAllListener(StyledText st) { 
    int[] eventTypes = { 3007, 3011, SWT.Resize, SWT.Move, SWT.Dispose, 
      SWT.DragDetect, 3000, SWT.FocusIn, SWT.FocusOut, SWT.Gesture, 
      SWT.Help, SWT.KeyUp, SWT.KeyDown, 3001, 3002, SWT.MenuDetect, 
      SWT.Modify, SWT.MouseDown, SWT.MouseUp, SWT.MouseDoubleClick, 
      SWT.MouseMove, SWT.MouseEnter, SWT.MouseExit, SWT.MouseHover, 
      SWT.MouseWheel, SWT.Paint, 3008, SWT.Selection, SWT.Touch, 
      SWT.Traverse, 3005, SWT.Verify, 3009, 3010 }; 

    for (int eventType : eventTypes) { 
     Listener[] listeners = st.getListeners(eventType); 
     for (Listener listener : listeners) { 
      st.removeListener(eventType, listener); 
     } 
    } 
} 

我不得不復制一些價值觀,因爲它們是用默認的修飾符聲明StyledText類的一部分。所以我無法訪問它們。

我希望,我沒有錯過任何INT值;)

回答

3

一般情況下,沒有任何機制來做到這一點。但是,我設法通過繼承StyledText來實現它。新班級名爲StyledTextWithListeners。你可以重新命名它,如果你想要的話;)。然而,你將不得不使用

styledText.addListenerByUser(int eventType, Listener listener); 

加你Listener真是讓人不是

styledText.addListener(int eventTyle, Listener listener); 

這是必要的,你和那些在創建時由SWT添加添加Listener S之間進行區分。

要刪除用戶添加的所有聽衆(你)只需要調用

styledText.removeAllListeners(); 

下面是代碼:

import java.util.HashMap; 

import org.eclipse.swt.SWT; 
import org.eclipse.swt.custom.StyledText; 
import org.eclipse.swt.layout.GridLayout; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Listener; 
import org.eclipse.swt.widgets.Shell; 

public class MiniExample { 

    public static void main(String[] args) { 
     Display display = Display.getDefault(); 
     final Shell shell = new Shell(display); 
     shell.setLayout(new GridLayout(1, false)); 

     StyledTextWithListeners text = new StyledTextWithListeners(shell, SWT.BORDER); 

     text.setText("TEXT"); 

     text.addListenerByUser(SWT.Verify, new Listener() { 

      @Override 
      public void handleEvent(Event arg0) { 

      } 
     }); 

     text.removeAllListeners(); 

     shell.pack(); 
     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) 
       display.sleep(); 
     } 
    } 

    public static class StyledTextWithListeners extends StyledText 
    { 
     HashMap<Integer, Listener> listeners; 
     public StyledTextWithListeners(Composite parent, int style) { 
      super(parent, style); 
     } 

     public void addListenerByUser(int eventType, Listener listener) 
     { 
      addListener(eventType, listener); 
      System.out.println("Adding: " + listener.getClass().toString()); 

      if(listeners == null) 
       listeners = new HashMap<Integer, Listener>(); 

      listeners.put(eventType, listener); 
     } 

     public void removeAllListeners() 
     { 
      for(Integer type : listeners.keySet()) 
      { 
       System.out.println("Removing: " + listeners.get(type).getClass().toString()); 
       removeListener(type.intValue(), listeners.get(type)); 
      } 
      listeners = new HashMap<Integer, Listener>(); 
     } 
    } 
} 

它基本上保存所有Listener是你在HashMap添加並在撥打removeAllListeners時將其刪除。

記住,我沒拿,你用相同的eventType添加第二個ListenerStyledText爲之前完成的情況下照顧。在這種情況下,舊的Listener將在HashMap中替換,但不會從StyledText中刪除。如果這種情況可能發生在您的方案中,請自行添加一些代碼。

+0

+1使用事件地圖。 –

+0

當我嘗試用'Text'做同樣的事情時,我得到一個SWTException表示不允許使用子類化(Eclipse 3.6),但我不使用StyledText時。爲什麼?我如何克服這一點?另外,他們可能有一天會拋出相同的異常,當試圖子類StyledText,使這不可能? – MrMas

+0

我通過添加此方法得到了SubClassing異常:protected void checkSubclass(){} –