【发布时间】:2020-03-02 17:54:55
【问题描述】:
在了解了如何处理窗口级键事件 (How to get a Key Event in a Java Swing JFrame instance which has many JTextFields?) 之后,我想定义一个可以通过以下方式附加的类:
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);
}
}
}
【问题讨论】:
-
(1-) frame.getRootPane ().registerKeyboardAction ( ... ); - 您没有阅读您不应该使用该方法的评论吗?此外,您应该使用 Action,而不是 ActionListener。当您只是复制发布的代码而不是实际阅读教程链接时,这就是问题所在。顺便说一句,您无法处理多个 KeyStroke 键绑定是将 KeyStroke 映射到 Action。
标签: java swing actionlistener keystroke actionevent