JFrame java未生成KeyEvent?

JFrame java未生成KeyEvent?,java,swing,jframe,keyevent,Java,Swing,Jframe,Keyevent,我有一个带有JFrame和3个JButton的java程序。我已经向jframe添加了一个keylistener。当我运行程序时,会打开jframe窗口,默认情况下会选择第一个按钮。我的问题是这个JFrame没有生成KeyEvent。 现在,除了向jframe添加一个KeyListener之外,我还向按钮添加了一个KeyListener。 现在,按键将生成keyevent 如何使JFrame生成KeyEvent而不是JButton生成KeyEvent 实际上,我的主要目的是为按钮构建键盘快捷键。

我有一个带有JFrame和3个JButton的java程序。我已经向jframe添加了一个keylistener。当我运行程序时,会打开jframe窗口,默认情况下会选择第一个按钮。我的问题是这个JFrame没有生成KeyEvent。 现在,除了向jframe添加一个KeyListener之外,我还向按钮添加了一个KeyListener。 现在,按键将生成keyevent

如何使JFrame生成KeyEvent而不是JButton生成KeyEvent


实际上,我的主要目的是为按钮构建键盘快捷键。

在当前关注的组件(通常不是
JFrame
)上调用按键事件。

看看这里。
另一种选择

下面是一个小例子,它有一个带焦点的按钮,并处理一个按键事件(F2)。
在F2上,单击键绑定过程按钮,执行
System.out
打印

public class Example {
    static public void main( String[] s ) {
        EventQueue.invokeLater( new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.getContentPane().setLayout( new BorderLayout() );
                frame.setBounds( 50, 50, 600, 600 );
                frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
                final JButton button = new JButton( new AbstractAction("MyButton") {
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        System.out.println("Button Clicked");
                    }
                });
                frame.getContentPane().add( button );
                frame.getRootPane().setDefaultButton( button );

                KeyStroke f2 = KeyStroke.getKeyStroke("F2");
                frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(f2, "clickButton");
                frame.getRootPane().getActionMap().put("clickButton", new AbstractAction() {
                    @Override
                    public void actionPerformed( ActionEvent e ) {
                        button.doClick();
                    }
                });
                frame.setVisible( true );
                // the Button has the focus
                button.requestFocus();
                // generate a KeyEvent 'F2' 
                KeyboardFocusManager.getCurrentKeyboardFocusManager().dispatchKeyEvent( new KeyEvent( frame, KeyEvent.KEY_PRESSED, 0, f2.getModifiers(), f2.getKeyCode(), f2.getKeyChar() ) );
            }
        });
    }
}

那么,有没有一种方法可以从jframe生成keyevent,即使它没有被关注??没有,您必须向任何相关组件注册一个侦听器,好的一面是,您可以注册同一个侦听器:)请参见:是的,使用键绑定,而不是KeyEvents。Swing设计为使用键绑定。感谢您的回答。。。但是你能解释一下getInputMap()方法和put()方法的作用吗。。任何帮助都将非常感谢+1,Swing设计为使用键绑定。本教程解释了这些方法。如果我们不知道您对本教程的解释感到困惑,我们将无法提供额外的帮助。也许我的小实用程序可以帮助您更好地理解使用哪个InputMap。