我还不清楚JPanel
的super.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(),该方法用于使组件获得输入焦点。这意味着,如果您按下任何类型的键或进行任何输入,该组件的相应侦听器都会听到输入。
因此,在您提到的代码中,面板在其初始化期间请求构造函数中的焦点是合乎逻辑的,以便可以将其上的任何类型的输入注册到其指定的事件侦听器。