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

时间:2014-11-27 16:41:04

标签: java swing keylistener jdialog

这是我的代码

 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()));  

没有在控制台上打印任何东西。

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

1 个答案:

答案 0 :(得分:3)

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

但是,焦点在于对话框上的JButton。 KeyEvents仅调度到具有焦点的组件,因此永远不会调用您的键侦听器代码。

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

如果您确实需要在对话框打开时收听任何按键,请查看Global Event Listeners,其中显示了如何使用AWTEventListener监听任何关键事件,无论哪个组件有对焦。