- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 JFrame 类,它实现了多个 JLabels 和 JTextField,我想在焦点位于该 JFrame 上并且用户按 F1 时执行操作。
我创建了以下类来处理 KeyListener:
public class PropertiesKey implements KeyListener, ActionListener {
private Properties propertiesWindow;
public PropertiesKey(Properties p) {
propertiesWindow = p;
System.out.println("DEBUG PropertiesKey");
}
@Override
public void keyPressed(KeyEvent event) {
System.out.println("DEBUG keyPressed");
// F1 - Display Attribute Window
if (event.getKeyCode() == KeyEvent.VK_F1){
System.out.println("F1");
if(propertiesWindow.isVisible()) {
propertiesWindow.setVisible(false);
} else {
propertiesWindow.setVisible(true);
}
}
System.out.println("KEY PRESSED " + event);
}
@Override
public void keyReleased(KeyEvent event) {
System.out.println("KEY RELEASED " + event);
}
@Override
public void keyTyped(KeyEvent event) {
System.out.println("KEY TYPED " + event);
}
@Override
public void actionPerformed(ActionEvent event) {
System.out.println("ACTION PERFORMED " + event);
}
}
我使用以下方法将其附加到主 JFrame 类:
this.addKeyListener(new PropertiesKey(this));
我确信这实际上是附加的,因为在创建 Key 监听器类时我看到了 System.out 消息。
虽然此策略适用于我有 AWT 框架的程序的另一个区域,但在填充有 JTextFields 的 JFrame 的这种特定情况下,我无法设法将 KeyEvent 传播到我的监听器。
我怀疑 TextFields(JFrame 上的焦点将始终由一个 TextField 捕获)可能会拦截该事件而不是传播它。
如果是这种情况,我该如何解决?使用哪种策略/模式来捕获 JFrame 级别的关键事件?
如果不是这样,我该如何进一步解决这个问题?
最佳答案
您不应该使用 KeyListener。只能为具有焦点的组件生成按键事件。框架不会有直接焦点,只有一个组件添加到框架中。
相反,您应该使用按键绑定(bind)
。通过键绑定(bind),即使组件没有焦点,您也可以将 Key Strike
映射到 Action
。确保使用适当的InputMap
。
在这种情况下,如果您想为框架添加通用处理程序,您可以将键绑定(bind)添加到框架的“根 Pane ”。
阅读 Swing 教程中关于 How to Use Key Bindings 的部分了解更多信息。
另请阅读有关 How to Use Actions 的部分了解使用 Action
的好处。
关于java - 如何在具有多个 JTextField 的 Java Swing JFrame 实例中获取按键事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58713715/
我是一名优秀的程序员,十分优秀!