监听器接口的HandleEvent与特定<select key =“”focus =“”> <selection key =“”focus =“”>监听器接口</selection> </selection>的事件之间的区别

时间:2013-12-18 12:20:12

标签: java eclipse event-handling swt listener

请帮助我理解handleEvent Listener接口与<Selection/Key/Focus>Event接口的<Selection/Key/Focus>Listener之间的区别。在此先感谢。

我遇到了handleEvent方法,Event参数的用法为SWT.FocusInSWT.FocusOut用于Listener接口。然后还有focusGained / focusLost FocusEvent参数。

类似地,它与SWT.Selection方法中使用的handleEvent相同,然后还有keyPressed / keyReleased KeyEvent KeyListener接口

SWT.KeyDown方法中使用的SWT.KeyUphandleEvent相同,然后还有widgetSelected / widgetDefaultSelected SelectionEvent SelectionListener界面。

这些在我看来是相同/重复的。我们应该使用一个与其他一个有什么区别或原因吗?

1 个答案:

答案 0 :(得分: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中事件处理的实现机制。键入的侦听器是根据它们定义的。