java - 如何在 Java Swing 中的 Action Listener 的同一 actionPerformed 方法中处理多个 KeyStroke?
问题描述
在了解了如何处理窗口级键事件(如何在具有许多 JTextField 的 Java Swing JFrame 实例中获取键事件?)之后,我想定义一个可以通过以下方式附加的类:
frame.getRootPane ().registerKeyboardAction ( ... );
该类包含在下面,它打算在主窗口和所有子窗口中使用。这个想法是,无论您是在主窗口中还是在其中一个子窗口中,Fx 键都将单独显示/隐藏子窗口(即,所有应用程序都将以相同的方式响应 Fx 键击)。构造函数包括当前窗口和包含所有窗口的主窗口。
我的问题是我不知道如何识别方法中按下了哪个键actionPerformed
。欢迎任何有关如何识别KeyStroke.getKeyStroke(KeyEvent.VK_Fxx,0)
触发 actionPerformed 的提示。
public class ApplicationLevelKeys implements ActionListener {
private MainWindow mainWindow;
public ApplicationLevelKeys(JFrame frame, MainWindow mw) {
mainWindow = mw;
frame.getRootPane().registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_F2,0), JComponent.WHEN_IN_FOCUSED_WINDOW);
frame.getRootPane().registerKeyboardAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_F12,0), JComponent.WHEN_IN_FOCUSED_WINDOW);
}
@Override
public void actionPerformed(final ActionEvent e) {
// F12 - Display Attribute Window
System.out.println("F12");
if(mainWindow.propertiesWindow.isVisible()) {
mainWindow.propertiesWindow.setVisible(false);
} else {
mainWindow.propertiesWindow.setVisible(true);
}
// F2 - Display Period Window
System.out.println("F2");
if(mainWindowperiodWindow.isVisible()) {
mainWindow.periodWindow.setVisible(false);
} else {
mainWindow.periodWindow.setVisible(true);
}
}
}
解决方案
我刚刚浏览了一些项目,发现了一个使用 anInputMap
和 anActionMap
来存储 KeyStroke 及其相应操作的示例;
private void initKeyBindings(final JComponent c)
{
final InputMap iMap = c.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
final ActionMap aMap = c.getActionMap();
String key;
key = "f1";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0), key);
aMap.put(key, showHelpAction);
key = "f2";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F2, 0), key);
aMap.put(key, saveTableAction);
key = "f5";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0), key);
aMap.put(key, loadTableAction);
key = "f6";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F6, 0), key);
aMap.put(key, focusDefaultCommandsAction);
key = "f7";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F7, 0), key);
aMap.put(key, focusProtocolCommandsAction);
key = "f11";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0), key);
aMap.put(key, loadDokuFilesAction);
key = "f12";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F12, 0), key);
aMap.put(key, startSignalplanAction);
key = "Ctrl+R";
iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_DOWN_MASK), key);
aMap.put(key, openRevisorAction);
}
在您的actionPerformed()
方法中,您现在可以遍历aMap
并与aMap.getKey()
您按下的键进行比较,然后通过aMap.getValue()
.
推荐阅读
- xml - 当 xml 有“-”(连字符)时,数据加载期间 XML 数据丢失
- python - (Python 多处理)如何访问与 multiprocessing.shared_memory.SharedMemory 共享的数组?
- installation - 安装 QGroundControl 的问题
- r - 在 R 中使用 plotly 时与工作目录相关的错误
- php - 如果不是所有字段都有值,如何从数据库中选择最小匹配?
- reactjs - 用回调反应 useState 钩子
- c - 如何比较忽略注释l的两个c代码文件夹?
- r - r 如何使用这些约束重新调整一系列数字?
- c# - C# Websocket-Client 给出无意义的错误消息
- ag-grid-react - 使用 TypeScript React 为 ag 网格获取数据时出错