2012-01-22 1 views
4

Я делаю приложение, которое должно читать некоторые символы с клавиатуры и интерпретировать их.Запуск 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 работать и не кажется лучшим выбором, так как я должен захватить все напечатанное
+1

Для лучшей помощи раньше, опубликовать [SSCCE] (Http: // sscce. орг /). В стороне, почему подход к этому пути вместо того, чтобы использовать привязки клавиш или (действительно, действительно дикие здесь), 'JTextArea' в диалоговом окне, чтобы принять нажатия клавиш? –

+1

достаточно интересный, чтобы дать ему представление, если вы можете предоставить SSCCE :-) Без всего лишь несколько комментариев: а) убедитесь, что первый init произошел на EDT. B) удалите диспетчера в распоряжение или windowListener. Для отладки, проверьте, произошло ли добавление/удаление в том же экземпляре focusManager – kleopatra

ответ

4

Невозможно воспроизвести нерабочее первое.

Может воспроизводить укладку: диспетчер не удаляется при закрытии диалогового окна, нажав на значок закрытия в заголовке. В этом случае штрихи, напечатанные в основном кадре, печатаются после закрытия диалога.

Диспетчера может быть надежно удален, так как в утилизации и WindowListener (а не в действии финишного):

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); 
+0

Он работал отлично. Большое спасибо. Извините, что не отвечал ранее, здесь были некоторые проблемы. Еще раз спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^