2013-08-12 89 views
0

我想添加一個選擇監聽器到我的自定義控件,其中包含幾個按鈕,以便無論何時點擊一個按鈕,都應該由控件執行特定的功能。問題是:我想將監聽器添加到控件本身,而不是單獨添加到其每個子按鈕。我該怎麼辦?如何將偵聽器添加到自定義控件?

+0

如果您的控件是面板或框架本身,則可以將偵聽器添加到其中。 – Paniz

+0

@Paniz我使用SWT,所以基本上我的自定義控件是一個複合 – Anas

回答

1

從文章Creating Your Own Widgets using SWT

SWT事件機制

SWT提供了一個低級別的監聽機制,以及「輸入」監聽器通常的Java。每個SWT小部件都理解addListener(int eventType,Listener listener)和notifyListeners(int eventType,Event event)。 eventType常量在類SWT中定義。發生事件時,窗口小部件會創建一個包含適當類型常量的SWT Event對象。 notifyListeners方法爲Listener調用handleEvent(Event event)。如果您需要重用現有的SWT事件,則通常會使用此機制。

例如,如果你的widget實現了評選活動,你可以實現你的「類型」添加和刪除方法如下:

public void addSelectionListener(SelectionListener listener) { 
    addListener(SWT.Selection, new TypedListener(listener)); 
} 

public void removeSelectionListener(SelectionListener listener) { 
    removeListener(SWT.Selection, listener); 
} 

當「評選活動」在你的widget發生時(比如說當, child1被選中),你使用notifyListeners通知應用程序的選擇監聽器。

child1.addListener(SWT.Selection, new Listener() { 
    public void handleEvent(Event e) { 
     notifyListeners(SWT.Selection, new Event()); 
    } 
}); 

請注意,當我們添加偵聽器時,我們首先將它包裝在TypedListener中。這是因爲TypedListener的handleEvent(Event event)方法根據Event中的類型創建適當的TypedEvent子類,然後爲類型化事件調用適當的方法。通過這種方式,應用程序可以將Java類型的偵聽器添加到窗口小部件,但窗口小部件實現可以使用更高效的低級偵聽器機制。但是,確保您的小部件實現提供了一個類型化的偵聽器API。應用程序不應該調用低級偵聽器方法。類型化的偵聽器方法可以防止意外的編程錯誤,例如假定所有的小部件都可以處理所有類型的事件,或者Event類中的所有字段對所有事件均有效。

相關問題