Проблема с кейлистером - PullRequest
0 голосов
/ 09 июня 2009

Привет, я использую свинг, и в моем основном кадре (JFrame) я хочу, чтобы, когда пользователь нажимал кнопку +, в одном окне появлялось сообщение, что должен появиться тест. мой ключевой слушатель работает нормально, если я не вызываю метод show недавно добавленного JInternalFrame, но когда я вызываю метод show моего JInternalFrame, KeyListener прекращает прослушивание

Я много пытался ее решить, но все тщетно, поэтому любая помощь по этому поводу будет оценена. спасибо.

это мой keyListener

_mainFrameKeyListener = new KeyListener()
    {
        public void keyPressed(KeyEvent arg0) {
            // TODO Auto-generated method stub
            System.out.println("the key pressed Id is : " + arg0.getKeyCode());

            if(arg0.getKeyCode() == 107){
                test Test = new test();
                _mainDesktopPane.add(Test);
                Test.show();

            }
        }
        public void keyReleased(KeyEvent arg0) {
            // TODO Auto-generated method stub
        }

        public void keyTyped(KeyEvent arg0) {
            // TODO Auto-generated method stub
        }           
};

Ответы [ 3 ]

3 голосов
/ 09 июня 2009

Звучит так, будто вам нужна горячая клавиша вместо ключевого слушателя, чтобы избежать проблем с фокусировкой.

// Get the KeyStroke for our hot key

KeyStroke plus = KeyStroke.getKeyStroke(KeyEvent.VK_PLUS, 0, true);

// Get the input map for our component
// In this case we are interested in key strokes in the focussed window

InputMap inputMap = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

// Map the key stroke to our "action key" (see below)

inputMap.put(plus, "my_action");

// Get the action map for our component

ActionMap actionMap = panel.getActionMap();

// Add the required action listener to out action map

actionMap.put("my_action", actionListener);

http://helpdesk.objects.com.au/java/how-to-specify-a-hot-key-for-a-swing-application

1 голос
/ 09 июня 2009

Вам необходимо добавить ключевой слушатель именно к компоненту, который имеет фокус (многие компоненты на самом деле являются композитами).

Так что используйте JComponent.registerKeyboardAction с условием WHEN_IN_FOCUSED_WINDOW. В качестве альтернативы используйте JComponent.getInputMap(WHEN_IN_FOCUSED_WINDOW, true) и JComponent.getActionMap(true), как описано в документации registerKeyboardAction API.

0 голосов
/ 09 июня 2009

Пожалуйста, проверьте, генерируется ли исключение времени выполнения. возможно, вы не в той ветке для показа этого диалога, или другая проблема может вызвать это исключение.

Также, пожалуйста, подумайте об использовании асинхронного потока для показа вашего диалога вместо использования потока слушателя. Но это всего лишь мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...