addNotify()和requestFocus()是如何在Java中使用JPanel工作的



我还不清楚JPanelsuper.addNotify()requestFocus()方法一般是如何工作的,特别是在下面的代码中:

public class Panel extends JPanel 
implements keyListener, MouseListener, MouseMotionListener {
    public Panel() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setFocusable(true);
        requestFocus();
}
    public void addNotify() {
        super.addNotify();
        if (thread == null) {
            addKeyListener(this);
            addMouseListener(this);
            addMouseMotionListener(this);
            thread = new Thread(this);
            thread.start();
        }
    }
    // Some unrelated code follows
}
谁能给我解释一下吗?

Component被添加到Container时,addNotify()被调用。因此,这个方法可以用来获得父类信息,而不会有null父类的风险,这在构造函数中是很可能发生的。

requestFocus()请求将给定的Component设置为聚焦状态。这个方法要求组件是可显示的、可聚焦的、可见的,并且它的所有祖先也是可见的。最好调用requestFocusInWindow(),因为该方法不依赖于平台。

在代码示例中,您的JPanel发送一个请求进行聚焦。这很有用,因为KeyLisener的实现要求面板处于聚焦状态。对于addNotify(),它只添加侦听器。这将希望只被调用一次,尽管在这个代码示例中不做保证。

看一下addNotify()的正确解释:什么是addNotify();?

对于requestFocus(),该方法用于使组件获得输入焦点。这意味着,如果您按下任何类型的键或进行任何输入,该组件的相应侦听器都会听到输入。

因此,在您提到的代码中,面板在其初始化期间请求构造函数中的焦点是合乎逻辑的,以便可以将其上的任何类型的输入注册到其指定的事件侦听器。

最新更新