这是我的代码
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看起来正确,按钮看起来正确。当我单击按钮时,弹出对话框时会出现正确的控制器行为。(只是可见)但是当按下某个键时,键适配器的keyPressed方法根本没有被触发。
我所做的调试是首先确保JDialog首先可以聚焦,以便它可以从键盘接收键事件。
这一行我做到了System.out.println(myDialog.getFocusableWindowState());
我在控制台上得到的是真的。接下来我确保正在设置关键监听器。我用
做到了 System.out.println( myDialog.getKeyListeners());
并打印出
[Ljava.awt.event.KeyListener;@350b914b
我假设它是从堆分配的对象的正确内存地址。
然后我检查了类似的线程。我的问题不能Jbutton listener isn't triggered, why?,因为对话框出现了,我确保使用print键侦听器行添加了键侦听器。 我无法使用用户在Trying to use key Listener中所说的内容,因为我需要收听按键,然后在我的程序中使用该按键。 这对Why wont this KeyEvent work?都没有帮助 因为我需要对按键进行一般性反应以获得按下哪个键。
我知道keyPressed没有被执行,因为我在方法和这个打印语句中放了一个断点
System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
没有在控制台上打印任何东西。
有谁知道如何解决这个问题?
答案 0 :(得分:3)
您正在将KeyListener添加到JOptionPane创建的对话框中。
但是,焦点在于对话框上的JButton。 KeyEvents仅调度到具有焦点的组件,因此永远不会调用您的键侦听器代码。
为什么要尝试侦听关闭对话框的任何键?这不是用户友好的。用户不知道这是关闭对话框的方式,因为这不是标准的UI约定。用户应单击按钮关闭对话框。
如果您确实需要在对话框打开时收听任何按键,请查看Global Event Listeners,其中显示了如何使用AWTEventListener
监听任何关键事件,无论哪个组件有对焦。