gpt4 book ai didi

java - 如何在具有多个 JTextField 的 Java Swing JFrame 实例中获取按键事件?

转载 作者:行者123 更新时间:2023-12-02 09:20:42 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com