Java KeyEvent.getSource()和KeyEvent.getComponent()之间的差异

Java KeyEvent.getSource()和KeyEvent.getComponent()之间的差异,java,swing,keyevent,Java,Swing,Keyevent,KeyEvent.getSource()和KeyEvent.getComponent()之间有什么区别,使用哪一个以及何时使用? 我正在使用KeyEvents创建一些UI。 我得看看有没有功能 KeyEvent.getSource() KeyEvent.getComponent() 他很好奇什么时候该用哪个。 对java api的研究结果如下: 继承了EventObject的getSource(),描述如下: “事件最初发生的对象。” getComponent()继承自ComponentEven

KeyEvent.getSource()
KeyEvent.getComponent()
之间有什么区别,使用哪一个以及何时使用? 我正在使用KeyEvents创建一些UI。 我得看看有没有功能 KeyEvent.getSource() KeyEvent.getComponent() 他很好奇什么时候该用哪个。 对java api的研究结果如下: 继承了EventObject的getSource(),描述如下: “事件最初发生的对象。” getComponent()继承自ComponentEvent “返回事件的发起人。”

现在在我看来,它们返回相同的对象,但类型不同

因此,问题是:这是正确的吗?我应该使用哪一个

getSource()
AWTEvent
中提供的一个方法,它是所有事件类的抽象类。当您想知道是什么导致了该操作时,可以调用
getSource()
方法。当您有一个可由按钮、文本字段或菜单项触发的
actionEvent
时,这将非常有用。您可能想知道是哪个项目导致了操作激发,而此调用就是这样做的


此外,
getComponent()
方法将返回事件捕获的
Component
对象。因此,在看到是什么导致动作触发的情况下,使用什么来获取与之交互的对象并没有真正的区别

来自彼此的Javadoc:


getSource():

对象java.util.EventObject.getSource()

最初发生
事件的对象

返回:
事件最初发生的对象


getComponent()

组件java.awt.event.ComponentEvent.getComponent()

返回事件的发起人

返回:引发事件的
组件
对象,如果对象不是
组件
,则返回
null


结论:

  • getSource()
    返回一个
    对象,该对象不能为
    null
    ,而
    getComponent()
    返回一个
    Component
    ,有时,如果
    事件实例of Component==false
    ,则返回
    null

  • 两者都需要铸造成您想要的类型。当然,事先检查
    实例总是好的。但是,
    getSource()
    使您的应用范围更广,而且强制转换可能需要更长的时间,但不能是
    null
    (据我所知)


  • 因此,使用
    e.getSource()
    总是更安全。

    在ComponentEvent中,KeyEvent的超类:

    public Component getComponent() {
        return (source instanceof Component) ? (Component)source : null;
    }
    
    protected transient Object  source;
    
    public Object getSource() {
        return source;
    }
    
    在EventObject中,ComponentEvent(和KeyEvent)的祖辈:

    JDK1.8.0_121附带的源代码


    可以看出,只要是
    组件
    ,两者都返回相同的对象(
    source
    ),如果不是,则
    getComponent
    返回
    null

    您是正确的。通常,您希望编写尽可能少使用强制转换的代码;在编译时而不是运行时检查类型时,代码更健壮。