Java 中菜单快捷方式的多个击键

Multiple Key KeyStroke for Menu Shortcuts in Java

我正在开发一个程序,该程序维护用于多种不同目的的数据,例如负载、车辆服务、经纪人、客户、燃料采购以及其他类型的采购。

为此,我使用了 JMenu 来包含用于创建这些新数据项的菜单项。因此,用户可以按例如 ALT+N, L 来打开新加载向导。这只是简单的菜单导航。

是否还有一种方法可以创建键盘快捷键,例如 CTLR+N, L 可以做基本相同的事情,但无需打开菜单?

我的意思是,用户按下 CTLR+N,系统等待另一个键,L 表示新的加载,B 表示新的代理输入,等等。我正在使用一些具有这样功能的程序(我不记得是哪个程序了)。我不知道它是用什么语言编写的,但我记得我认为开发人员通过简单地等待第三个键与 [=17 分开按下来创建基于标准键盘快捷键的多个热键是很酷的=] 组合.

我一直在网上搜索如何完成这一壮举的想法,但没有看到任何接近我正在寻找的东西。为了弄清楚我要做什么,请查看以下内容:

我不确定我是否已经足够清楚地解释了我想做的事情,所以我非常愿意回答问题,以便更好地理解我的想法。即便如此,任何想法或想法都将不胜感激!

-SC

我就是这样做的。

我在用户按下 Ctrl+N 之后设置一个标志,然后如果用户按下 b,如果设置了标志,则执行适当的操作。

下面的代码只是一个 proof of concept (POC)。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.BorderFactory;
import javax.swing.InputMap;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;

public class BindKeys {
    private boolean  flag;
    private JTextField  textField;

    private JPanel createButton() {
        JPanel panel = new JPanel();
        JButton button = new JButton("Exit");
        button.addActionListener(e -> System.exit(0));
        panel.add(button);
        return panel;
    }

    private JPanel createTextField() {
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
        textField = new JTextField(12);
        InputMap im = textField.getInputMap();
        KeyStroke ctrlN = KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK);
        im.put(ctrlN, "SET_FLAG");
        KeyStroke b = KeyStroke.getKeyStroke('b');
        im.put(b, "NEW_BROKER");
        ActionMap am = textField.getActionMap();
        am.put("SET_FLAG", new CtrlNAction());
        am.put("NEW_BROKER", new BAction());
        
        panel.add(textField);
        return panel;
    }

    private void showGui() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(createTextField(), BorderLayout.PAGE_START);
        frame.add(createButton(), BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private class BAction extends AbstractAction {
        public void actionPerformed(ActionEvent event) {
            if (flag) {
                textField.setText("New broker");
            }
            else {
                textField.setText(textField.getText() + "b");
            }
        }
    }

    private class CtrlNAction extends AbstractAction {
        public void actionPerformed(ActionEvent event) {
            flag = true;
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(() -> new BindKeys().showGui());
    }
}

参考How to Use Key Bindings