2

我有一个带有 JFrame 和 3 个 JButton 的 java 程序。我在 jframe 中添加了一个 keylistener。当我运行程序时,会打开一个 jframe 窗口,并且默认选择第一个按钮。我的问题是这个 JFrame 没有生成 KeyEvent。现在,除了向 jframe 添加 KeyListener 之外,我还向按钮添加了 KeyListener。现在按键事件正在由按钮生成。

如何让 JFrame 生成 KeyEvent 而不是 JButton 生成它们?

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

4

2 回答 2

4

看看这里如何使用键绑定keylistener
的替代方案。

这是一个小示例,它有一个带焦点的按钮并处理一个 KeyEvent (F2)。
在 F2-clicked Key-Binding 过程中,一个 ButtonClick 执行了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() ) );
            }
        });
    }
}
于 2011-08-03T06:02:50.887 回答
4

在当前聚焦的组件(通常不是JFrame)上调用关键事件

于 2011-08-03T05:53:46.900 回答