KeyEvent 不是由 JFrame java 生成的吗?

发布于 2024-11-28 00:38:52 字数 291 浏览 2 评论 0原文

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

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

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

I have a java program with a JFrame and 3 JButtons in it. I have added a keylistener to jframe. When i run the program a jframe window is opened and the first button is selected by default. My problem is that a KeyEvent is not being generated by this JFrame.
Now, besides adding a KeyListener to the jframe, i also added a KeyListener to the buttons.
Now the keyevent is being generated by the buttons.

How do I make the JFrame generate KeyEvent instead of the JButton generating them ??

Actually, my main purpose is building keyboard shortcuts for the buttons.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

櫻之舞 2024-12-05 00:38:52

请查看此处如何使用键绑定
keylistener 的替代方案。

这是一个小示例,它有一个带有焦点的按钮并处理一个 KeyEvent (F2)。
在 F2 键上单击键绑定过程中,执行一个执行 System.out 打印的 ButtonClick。

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

Have a look here How to Use Key Bindings.
An alternative to keylistener.

Here is a little Example it has a Button with focus and process a KeyEvent (F2).
On F2-clicked the Key-Binding process a ButtonClick which performed a System.out print.

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() ) );
            }
        });
    }
}
闻呓 2024-12-05 00:38:52

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

The key event is called on the currently focused component (which is usually not the JFrame)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文