gpt4 book ai didi

java - 为什么 JDialog 不触发关键监听器的 keyPressed 方法?

转载 作者:行者123 更新时间:2023-11-30 08:18:51 26 4
gpt4 key购买 nike

这是我的代码

 JToolBar customizeKeys = new JToolBar();
customizeKeys.add(new ChangeKeyListen("left"));
private class ChangeKeyListen extends AbstractAction{
private JDialog myDialog;
class KeyGetter extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
super.keyPressed(e);
OtherPanel.this.map(
KeyEvent.getKeyText(e.getKeyCode()),
keyAction);
myDialog.setVisible(false);
myDialog.removeKeyListener(getKeyListeners()[0]);
}
};
public ChangeKeyListen(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
myDialog = new JOptionPane().createDialog("Press a key");
myDialog.setVisible(true);
myDialog.requestFocusInWindow();
System.out.println(myDialog.getFocusableWindowState());
myDialog.addKeyListener(new KeyGetter());
System.out.println( myDialog.getKeyListeners());
}
}

我在这里尝试做的是,当用户单击添加到 JToolBar 及其操作属性的 JButton 时,系统将提示用户使用我自己定制的对话框。然后用户可以按任意键关闭对话框。(它实际上只是不可见的)。当我运行应用程序时,一切看起来都很好。 JToolBar 看起来不错,按钮看起来也不错。当我单击该按钮时,弹出对话框时会出现正确的 Controller 行为。(只是可见)但是当我按下一个键时,键适配器的 keyPressed 方法根本不会被触发。

为了调试它,我所做的是首先确保 JDialog 可以首先获得焦点,以便它可以从键盘接收按键事件。我用这行

System.out.println(myDialog.getFocusableWindowState());

我在控制台上得到的是真实的。接下来,我确保设置了关键监听器。我用

 System.out.println( myDialog.getKeyListeners());

然后打印出来

[Ljava.awt.event.KeyListener;@350b914b

我认为这是从堆中分配的对象的正确内存地址。

然后我检查了类似的主题。

我的问题不可能是Jbutton listener isn't triggered, why?因为对话框出现了,我确保关键监听器是用 print key listeners 行添加的。我无法使用用户在 Trying to use key Listener 中所说的内容因为我需要监听按键并稍后在我的程序中使用该按键。这也无济于事 Why wont this KeyEvent work?因为我需要对按键的一般 react 才能知道按下了哪个键。

我知道 keyPressed 没有被执行,因为我在方法和这个打印语句中放置了一个断点

   System.out.println(KeyEvent.getKeyText(e.getKeyCode()));  

没有在控制台上打印任何内容。

有谁知道我该如何解决这个问题?

最佳答案

您正在将 KeyListener 添加到 JOptionPane 创建的对话框中。

但是,焦点在对话框上的 JButton 上。 KeyEvents 仅分派(dispatch)给具有焦点的组件,因此您的关键监听器代码永远不会被调用。

为什么要尝试监听关闭对话框的任意键?这不是用户友好的。用户不知道这是关闭对话框的方式,因为这不是标准的 UI 约定。用户应单击按钮关闭对话框。

如果您确实需要在对话框打开时聆听任何按键的声音,请查看 Global Event Listeners它展示了如何使用 AWTEventListener 来监听任何按键事件,而不管哪个组件具有焦点。

关于java - 为什么 JDialog 不触发关键监听器的 keyPressed 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27175404/

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