【发布时间】:2020-03-01 23:12:34
【问题描述】:
我有一个 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 框架的程序的另一个区域,但在填充有 JTextField 的 JFrame 的这种特定情况下,我无法设法将 KeyEvent 传播到我的侦听器。
我怀疑 TextFields - JFrame 上的焦点将始终被一个 TextField 捕获 - 可能会拦截事件而不是传播它。
如果是这种情况,我该如何解决?使用哪种策略/模式来捕获 JFrame 级别的关键事件?
事实并非如此,我该如何进一步解决这个问题?
【问题讨论】:
标签: java swing events awt keylistener