2013-12-18 18 views
1
的事件

請幫助我瞭解Listener界面對的<Selection/Key/Focus>Listener接口<Selection/Key/Focus>EventhandleEvent之間的差異。提前致謝。差異與具體<選擇/按鍵/焦點><選擇/按鍵/焦點>偵聽器接口

我所遇到handleEvent方法與Event參數,其中所述使用是SWT.FocusInSWT.FocusOutListener接口。然後還有focusGained/focusLostFocusEvent參數。

同樣它與SWT.SelectionhandleEvent方法中使用的相同,然後還有的KeyListener接口keyPressed/keyReleasedKeyEvent

同樣它與在handleEvent方法中使用SWT.KeyDownSWT.KeyUp相同,然後還有的SelectionListener接口widgetSelected/widgetDefaultSelectedSelectionEvent

這些在我看來是相同的/重複的。爲什麼我們應該使用一種與其他產品有什麼不同?

+0

我的答案解決了你的問題嗎?如果是這樣,請接受它。如果沒有,請告訴我。 – Baz

回答

3

您發現的內容有鍵入無類型事件。

正如你已經發現,有一個連接。該類型的事件是這個樣子的那些:

button.addSelectionListener(new SelectionListener() 
{ 
    @Override 
    public void widgetSelected(SelectionEvent e) {} 

    @Override 
    public void widgetDefaultSelected(SelectionEvent e) {} 
}); 

儘管非類型化的事件是這樣的:

button.addListener(SWT.Selection, new Listener() 
{ 
    @Override 
    public void handleEvent(Event e) {} 
}); 

如果你看看Button源代碼,你會看到:

public void addSelectionListener (SelectionListener listener) { 
    checkWidget(); 
    if (listener == null) error(SWT.ERROR_NULL_ARGUMENT); 
    TypedListener typedListener = new TypedListener(listener); 
    addListener(SWT.Selection, typedListener); 
    addListener(SWT.DefaultSelection, typedListener); 
} 

正如你所看到的,addSelectionListener只是調用addListener


結論:這是一種多餘的,但它使源更可用。如果您想要處理與選擇有關的所有情況,請添加SelectionListener。如果你只是想照顧SWT.Selection,請加上Listener

這真的是一個味道的問題。我更喜歡添加無類型的事件偵聽器,因爲當我只想處理一個事件時,我發現自己經常沒有使用SelectionListenerMouseListener的所有方法。


最後:Here是什麼,如果你想了解更多的(與已輸入和非類型化的事件之間的映射)來讀取。

特別是這部分:

在SWT的早期版本中,只有無類型的聽衆。經過Eclipse實現者,SWT用戶社區和開發人員的大量討論後,決定引入更多「類似JavaBeans」的偵聽器機制。有人認爲,這將減輕已經熟悉AWT/Swing的開發人員向SWT的過渡。非類型化偵聽器仍然是SWT中事件處理的實現機制。鍵入的偵聽器是根據它們定義的。

+0

謝謝!這很有幫助。我有一個額外的說明,我注意到我們可以爲每個單獨的小部件實現 Listener,或者它可以由WizardPagesSubClass實現,併爲所有三個小部件實現widgetSelected&widgetDefaultSelected的一個實現。我們應該選擇其中一種方法的原因是什麼?僅僅是爲了避免在類似的小部件中重複使用相同的功能?或者還有其他原因嗎?提前致謝。 – ravikanth

+0

@rkanth取決於WizardPagesSubClass是否實際觸發<選擇/鍵/焦點>事件。我個人更喜歡把'Listener'附加到單個實體上。如果他們都這樣做,我使用相同的'Listener'實例。 – Baz

+0

謝謝!澄清,「如果他們都這樣做,我使用相同的偵聽器實例。」 - 爲此,我應該創建MyCustomListener,擴展 Listener接口以實現通用功能,然後使用該實例。這是對的還是別的嗎?提前致謝。 – ravikanth