添加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();
}

09-04 20:20