如何将按键事件调度程序用于键盘快捷键



我想在我的jframe或jdialog中使用快捷键访问组件(例如:这里我使用Ctrl + N访问jframe的新建按钮(,所以我能够使用关键事件调度器完成我的任务,但事情 是当按下短键时,相关键事件递归触发我该如何阻止?我怎样才能管理一次?这是我的代码。

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

}

下面是如何为窗口注册键绑定全局的示例:

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

最新更新