Java 侦听器接口的HandleEvent与Specific之间的差异<;选择/关键点/焦点>;事件<;选择/关键点/焦点>;侦听器接口

Java 侦听器接口的HandleEvent与Specific之间的差异<;选择/关键点/焦点>;事件<;选择/关键点/焦点>;侦听器接口,java,eclipse,event-handling,swt,listener,Java,Eclipse,Event Handling,Swt,Listener,请帮助我了解Listener接口的handleEvent与Listener接口的Event之间的区别。提前谢谢 我遇到过handleEvent方法,其中Event参数的用法是SWT.FocusIn或SWT.FocusOut用于Listener接口。然后还有focusgound/focusLostFocusEvent参数 类似地,这与SWT.Selection中使用的handleEvent方法相同,然后还有KeyListener界面的按键按下/按键释放按键事件 类似地,它与handleEvent方

请帮助我了解
Listener
接口的
handleEvent
Listener
接口的
Event
之间的区别。提前谢谢

我遇到过
handleEvent
方法,其中
Event
参数的用法是
SWT.FocusIn
SWT.FocusOut
用于
Listener
接口。然后还有
focusgound
/
focusLost
FocusEvent
参数

类似地,这与
SWT.Selection中使用的
handleEvent
方法相同,然后还有
KeyListener
界面的
按键按下
/
按键释放
按键事件

类似地,它与
handleEvent
方法中使用的
SWT.KeyDown
SWT.keydup
相同,然后还有
SelectionListener
界面的
widgetSelected
widgetDefaultSelected
SelectionEvent


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

您发现有类型化事件和非类型化事件

正如您已经发现的,这是一种联系。类型化事件如下所示:

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.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) {}
});

如果查看
按钮的源代码,您将看到:

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.选择
,请添加
侦听器

这确实是一个品味的问题。我更喜欢添加非类型化的事件侦听器,因为我发现自己通常不使用
SelectionListener
MouseListener
的所有方法,因为我只想处理一个事件


最后:如果您想了解更多信息(并在类型化事件和非类型化事件之间建立映射),可以阅读

特别是这一部分:

在SWT的早期版本中,只有非类型的侦听器。在Eclipse实现者、SWT用户社区和开发人员之间进行了大量讨论之后,决定包括一个更“类似JavaBeans”的侦听器机制。有人认为,对于已经熟悉AWT/Swing的开发人员来说,这将简化向SWT的过渡。非类型化侦听器仍然是SWT中事件处理的实现机制。类型化侦听器是根据它们定义的


我的回答解决了你的问题吗?如果是,请接受。如果没有,请告诉我。谢谢!这很有帮助。我有一个额外的澄清,我注意到我们可以实现每个小部件的侦听器,或者它可以由WizardPagesSubClass实现,并为所有三个小部件实现一个widgetSelected&widgetDefaultSelected。为什么我们应该选择一种方法而不是另一种?这只是为了避免在类似的小部件中重复使用相同的功能吗?或者还有其他原因吗?提前谢谢。@rkanth取决于WizardPagesSubClass是否实际触发事件。我个人更喜欢将
侦听器
附加到各个实体。如果它们都做相同的事情,我将使用相同的
侦听器
实例。谢谢!为了澄清,“如果它们都做相同的事情,我使用相同的侦听器实例。”——为此,我应该创建MyCustomListener,扩展侦听器接口以实现公共功能,然后使用该实例。这是对的还是别的什么?提前谢谢。@rkanth您应该创建该侦听器的实例,即实现它的新类或匿名类。