在JDialog第一次打开时运行KeyEventDispatchher,然后将其删除



我正在做一个应用程序,它必须通过键盘读取一些字符并对其进行解释。

为了捕获密钥,我打开一个JDialog并设置一个KeyEventDispatcher,这样我就可以捕获dispatchKeyEvent方法中的字符。在JDialog中,有一个按钮可以删除KeyEventDispatcher并处理JDialog。

它有两个问题:
-第一次打开JDialog时,就像没有设置KeyEventDispatcher一样
-当我关闭和打开这个JDialog时,KeyEventDispatchers正在累积(打开第一次,没有运行;打开第二次,有一个运行,打开第三次,有两个运行,…)

KeyEventDispatchers似乎是在JDialog关闭而未删除时设置的,而不是在JDiallog打开并关闭时删除时设置。

有人能帮我了解发生了什么以及我该如何解决吗?

以下是JDialog类的简化版本(只有密钥捕获部分):

public class SequenceDialog {
    private JDialog dialog;
    private JButton finishButton;
    private DialogKeyEventDispatcher keyEventDispatcher;
    public SequenceDialog() {
        initializeDialog();
    }
    private void initializeDialog() {
        dialog = new JDialog();
        finishButton = new JButton("Finish");
        finishButton.addActionListener(new FinishButtonListener());
        dialog.setModalityType(ModalityType.APPLICATION_MODAL);
        dialog.add(finishButton);
        setKeyListener();
        dialog.setVisible(true);
        dialog.pack();
    }
    /** Adds the KeyEventDispacther */
    private void setKeyListener() {
        keyEventDispatcher = new DialogKeyEventDispatcher();
        KeyboardFocusManager manager = KeyboardFocusManager
                .getCurrentKeyboardFocusManager();
            manager.addKeyEventDispatcher(keyEventDispatcher);
    }
    private class FinishButtonListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //Removing the KeyEventDispacther
            KeyboardFocusManager manager = KeyboardFocusManager
                    .getCurrentKeyboardFocusManager();
                manager.removeKeyEventDispatcher(keyEventDispatcher);
            dialog.dispose();
        }
    }
    /** The KeyEventDispatcher to be executed */
    private class DialogKeyEventDispatcher implements KeyEventDispatcher {
        public boolean dispatchKeyEvent(KeyEvent e) {
            if(e.getID() == KeyEvent.KEY_PRESSED) {
                System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
            }
            return false;
        }
    }
}

如果有另一种捕捉钥匙的方法,我会很高兴看到的。到目前为止,我已经尝试过:

  • KeyListener,即使在我将其添加到JButton和contentPane时也不起作用
  • KeyEventPostProcessor具有与使用KeyEventDispatcher相同的效果
  • KeyBinding,不起作用,似乎不是最好的选择,因为我必须捕获键入的所有内容

无法再现未在上工作的情况。

可以复制堆叠:通过单击标题中的关闭图标关闭对话框时,不会删除分配器。在这种情况下,在对话框关闭后打印在主框中键入的笔划。

在dispose和WindowListener中(而不是在finish操作中),可以可靠地删除调度器:

    private void initializeDialog() {
        dialog = new JDialog() {
            @Override
            public void dispose() {
                KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
                manager.removeKeyEventDispatcher(keyEventDispatcher);
                LOG.info("disposed: " + manager);
                super.dispose();
            }
        };
        WindowListener l = new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
                manager.removeKeyEventDispatcher(keyEventDispatcher);
                LOG.info("closing: " + manager);
            }
        };
        dialog.addWindowListener(l);

相关内容

最新更新