我已经创建了类start,当按下右箭头键时,一个矩形块将会移动。但此代码仅在添加setFocusable(true)时有效。我阅读了Java Doc,以及之前的许多Stack Overflow问题,但我仍然不知道为什么setFocusable如此重要。请回答我解释这个代码只。
public class start extends JPanel{
int x=0, xa=1;
public start() {
addKeyListener(new KeyListener(){
public void keyPressed(KeyEvent ke){
if(ke.getKeyCode()==KeyEvent.VK_RIGHT){
xa=xa+1;
repaint();
}
}
public void keyTyped(KeyEvent ke){}
public void keyReleased(KeyEvent ke){}
});
setFocusable(true);
}
public void paint(Graphics g){
super.paint(g);
g.fillRect(x+xa,100,40,50);
}
}发布于 2015-04-21 00:38:20
,但我仍然不知道为什么setFocusable如此重要。
事件仅调度到具有焦点的组件。所以你的KeyEvent只有在它是“可聚焦的”并且有焦点的时候才会被分派到面板上。
有关此主题的详细信息,请参阅Motion Using the Keyboard,其中包括两种不同的解决方案。
发布于 2015-04-20 22:04:54
当显示一个框架/窗口时,默认情况下,FocusTraversalPolicy默认组件被赋予焦点。如果组件是可聚焦的并且isFocusTraversableOverridden为真,或者如果它的peer是可聚焦的,则DefaultFocusTraversalPolicy接受该组件。
当调用setFocusable(true)时,标志isFocusTraversableOverridden被设置为FOCUS_TRAVERSABLE_SET,因此这将选出一个component,DefaultFocusTraversalPolicy将其选为默认组件。因此,即使JPanel在默认情况下是可聚焦的,显式调用也会使其被选为默认组件以获得焦点。
无论如何,这不是通过requestFocus连接到Component的正确方式。一旦Component可见,您应该尝试使用requestFocus或requestFocusInWindow。
另外,考虑覆盖paintComponent而不是paint。
发布于 2015-04-20 20:55:15
focusable标志指示组件是否可以获得焦点。默认情况下,JPanel组件是可聚焦的,因此当您将其设置为true时,将不会有任何更改。此外,setFocusable本身也不会设置焦点。
https://stackoverflow.com/questions/29748284
复制相似问题