添加setFocusable(true)和requestFocusInWindow()之后,JComponent对象内的KeyListener仍然无法工作。谁能找到问题?
public class Canvas extends JComponent{
public Canvas(String str) {
this.str = str;
this.setPreferredSize(new Dimension(700, 300));
setFocusable(true);
requestFocusInWindow();
addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e) {
out.println("in");
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void keyPressed(KeyEvent e) {
out.println("in");
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void keyReleased(KeyEvent e) {
out.println("in");
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
});
}
我希望当按下任何键时,“ in”将显示在控制台中。谢谢!
最佳答案
添加setFocusable(true)和requestFocusInWindow()之后,JComponent对象内的KeyListener仍然无法工作。
在将组件添加到框架或打包成可见之前,您不能要求将焦点集中在组件上。因此,在构造函数中请求焦点不会执行任何操作。
基本逻辑将需要是:
CustomComponent component = new CustomComponent(...);
frame.add( component );
frame.pack();
frame.setVisible( true );
component.requestFocusInWindow();
注意我之所以调用组件CustomCompnent,是因为已经有一个称为“ Canvas”的AWT类,这可能会造成混淆。创建类时,请使用更具描述性的名称。
另一个选择是重写类的
addNotify()
方法以调用requestFocusInWindow()
方法。@Override
public void addNotify()
{
super.addNotify();
requestFocusInWindow();
}