有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为键盘快捷键使用按键事件调度器

我想使用jframe或jdialog中的快捷键来访问组件(例如:这里我使用Ctrl+N来访问jframe的新按钮),所以我可以使用key event dispatcher来完成我的任务,但不是这样 当按下short键时,相关键事件会反复触发,我该如何停止?我怎么能做到这一次呢?这是我的密码

public void FocuseComponent(JComponent component) {

    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
        @Override
        public boolean dispatchKeyEvent(KeyEvent e) {

            switch (e.getID()) {
                case KeyEvent.KEY_PRESSED:
                    if (e.getKeyCode() == e.VK_N) {
                        component.requestFocusInWindow();
                    }
                    break;

                case KeyEvent.KEY_RELEASED:

                    break;

                case KeyEvent.KEY_TYPED:
                    break;

            }

            return false;

        }

    });

}

}


共 (1) 个答案

  1. # 1 楼答案

    下面是一个如何为窗口注册密钥绑定全局的示例:

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    import javax.swing.JTextField;
    import javax.swing.KeyStroke;
    import javax.swing.SwingUtilities;
    import javax.swing.WindowConstants;
    
    public class TestKeyHandling {
    
        private static final String CTRL_N_KEY = "nKey";
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    final JFrame frm = new JFrame("Test");
                    Action act = new AbstractAction() {
    
                        @Override
                        public void actionPerformed(ActionEvent e) {
                            JOptionPane.showMessageDialog(frm, "Ctrl + N pressed!");
                        }
                    };
                    frm.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("control N"), CTRL_N_KEY);
                    frm.getRootPane().getActionMap().put(CTRL_N_KEY, act);
                    frm.add(new JTextField(20), BorderLayout.NORTH);
                    frm.add(new JTextField(20), BorderLayout.SOUTH);
                    frm.pack();
                    frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                    frm.setLocationRelativeTo(null);
                    frm.setVisible(true);
                }
            });
        }
    }