Java 中菜单快捷方式的多个击键
Multiple Key KeyStroke for Menu Shortcuts in Java
我正在开发一个程序,该程序维护用于多种不同目的的数据,例如负载、车辆服务、经纪人、客户、燃料采购以及其他类型的采购。
为此,我使用了 JMenu
来包含用于创建这些新数据项的菜单项。因此,用户可以按例如 ALT+N, L
来打开新加载向导。这只是简单的菜单导航。
是否还有一种方法可以创建键盘快捷键,例如 CTLR+N, L
可以做基本相同的事情,但无需打开菜单?
我的意思是,用户按下 CTLR+N
,系统等待另一个键,L
表示新的加载,B
表示新的代理输入,等等。我正在使用一些具有这样功能的程序(我不记得是哪个程序了)。我不知道它是用什么语言编写的,但我记得我认为开发人员通过简单地等待第三个键与 [=17 分开按下来创建基于标准键盘快捷键的多个热键是很酷的=] 组合.
我一直在网上搜索如何完成这一壮举的想法,但没有看到任何接近我正在寻找的东西。为了弄清楚我要做什么,请查看以下内容:
- 我有一个用于处理负载跟踪数据的模块,它带有一个用于输入新负载的向导。要启动此向导,我希望键盘快捷方式在新建...加载向导菜单项上显示为
CTRL+N, L
。当用户按下 CTRL+N
时,应用程序等待查看下一个按下的键。如果按下的下一个键是 N
,则会启动新加载向导。
- 我有一个处理经纪人数据的模块,它有一个用于输入新经纪人的数据输入对话框。要打开此对话框,我希望键盘快捷键在 New...Broker 菜单项上显示为
CTRL+N, B
。当用户按下 CTRL+N
时,应用程序等待查看下一个按下的键。如果按下的下一个键是 B
,则会显示“新建代理”对话框。
- 我有一个用于处理车辆服务、维护和修理的模块,其中有一个对话框用于输入有关这些购买的信息。我希望键盘快捷方式在新建...Service/Repair 菜单项上显示为
CTRL+N, S
。当用户按下 CTRL+N
时,应用程序等待查看下一个按下的键。如果下一个按下的键是 S
,则会打开新建 Service/Repair 对话框。
- 应用程序中其他模块的“新建”菜单下会有一个类似的菜单项,其功能应该相同。
- 如果在
CTRL+N
KeyStroke 之后按下的键不是显示在各种新菜单项上的可用单个快捷键之一,那么它将取消等待下一次按键。换句话说,如果用户按下 CTRL+N
,然后按下 Z
(没有与之关联的菜单项),则 CTRL+N
将被简单地丢弃。
我不确定我是否已经足够清楚地解释了我想做的事情,所以我非常愿意回答问题,以便更好地理解我的想法。即便如此,任何想法或想法都将不胜感激!
-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());
}
}
我正在开发一个程序,该程序维护用于多种不同目的的数据,例如负载、车辆服务、经纪人、客户、燃料采购以及其他类型的采购。
为此,我使用了 JMenu
来包含用于创建这些新数据项的菜单项。因此,用户可以按例如 ALT+N, L
来打开新加载向导。这只是简单的菜单导航。
是否还有一种方法可以创建键盘快捷键,例如 CTLR+N, L
可以做基本相同的事情,但无需打开菜单?
我的意思是,用户按下 CTLR+N
,系统等待另一个键,L
表示新的加载,B
表示新的代理输入,等等。我正在使用一些具有这样功能的程序(我不记得是哪个程序了)。我不知道它是用什么语言编写的,但我记得我认为开发人员通过简单地等待第三个键与 [=17 分开按下来创建基于标准键盘快捷键的多个热键是很酷的=] 组合.
我一直在网上搜索如何完成这一壮举的想法,但没有看到任何接近我正在寻找的东西。为了弄清楚我要做什么,请查看以下内容:
- 我有一个用于处理负载跟踪数据的模块,它带有一个用于输入新负载的向导。要启动此向导,我希望键盘快捷方式在新建...加载向导菜单项上显示为
CTRL+N, L
。当用户按下CTRL+N
时,应用程序等待查看下一个按下的键。如果按下的下一个键是N
,则会启动新加载向导。 - 我有一个处理经纪人数据的模块,它有一个用于输入新经纪人的数据输入对话框。要打开此对话框,我希望键盘快捷键在 New...Broker 菜单项上显示为
CTRL+N, B
。当用户按下CTRL+N
时,应用程序等待查看下一个按下的键。如果按下的下一个键是B
,则会显示“新建代理”对话框。 - 我有一个用于处理车辆服务、维护和修理的模块,其中有一个对话框用于输入有关这些购买的信息。我希望键盘快捷方式在新建...Service/Repair 菜单项上显示为
CTRL+N, S
。当用户按下CTRL+N
时,应用程序等待查看下一个按下的键。如果下一个按下的键是S
,则会打开新建 Service/Repair 对话框。 - 应用程序中其他模块的“新建”菜单下会有一个类似的菜单项,其功能应该相同。
- 如果在
CTRL+N
KeyStroke 之后按下的键不是显示在各种新菜单项上的可用单个快捷键之一,那么它将取消等待下一次按键。换句话说,如果用户按下CTRL+N
,然后按下Z
(没有与之关联的菜单项),则CTRL+N
将被简单地丢弃。
我不确定我是否已经足够清楚地解释了我想做的事情,所以我非常愿意回答问题,以便更好地理解我的想法。即便如此,任何想法或想法都将不胜感激!
-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());
}
}