Я делаю приложение, которое должно читать некоторые символы с клавиатуры и интерпретировать их.Запуск KeyEventDispacther при первом запуске JDialog и его удалении
Чтобы захватить ключи, я открываю JDialog и устанавливаю KeyEventDispatcher, поэтому я могу захватить символы в методе dispatchKeyEvent. В JDialog есть кнопка, которая удаляет KeyEventDispatcher и удаляет JDialog.
Есть две проблемы, связанные с ней:
- первый раз при открытии JDialog, это походит на KeyEventDispatcher не был установлен
- Когда я закрываю и открыть эту JDialog, то KeyEventDispatchers являются сложении (открыть ситемы 1-й раз, там нет бега, откройте второй раз, один работает, откройте в третий раз, там 2 работает, ...)
Кажется, что KeyEventDispacthers устанавливаются, когда JDialog закрыт и не удален, вместо этого когда JDialog открывается и удаляется, когда он закрывается.
Someneone мог бы помочь мне понять, что происходит и как я могу это исправить?
Вот упрощенная версия класса 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, Ждут» t работать и не кажется лучшим выбором, так как я должен захватить все напечатанное
Для лучшей помощи раньше, опубликовать [SSCCE] (Http: // sscce. орг /). В стороне, почему подход к этому пути вместо того, чтобы использовать привязки клавиш или (действительно, действительно дикие здесь), 'JTextArea' в диалоговом окне, чтобы принять нажатия клавиш? –
достаточно интересный, чтобы дать ему представление, если вы можете предоставить SSCCE :-) Без всего лишь несколько комментариев: а) убедитесь, что первый init произошел на EDT. B) удалите диспетчера в распоряжение или windowListener. Для отладки, проверьте, произошло ли добавление/удаление в том же экземпляре focusManager – kleopatra