keylistener的问题

时间:2009-06-09 09:59:36

标签: java swing

我正在使用swing并在我的主框架(JFrame)中我希望当用户按下+键时,一个窗口让我们说应该出现测试。 如果我不调用新添加的JInternalFrame的show方法,但是当我调用JInternalFrame的show方法时,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 个答案:

答案 0 :(得分:3)

听起来你想要一个热键而不是一个关键的监听器来避免焦点问题。

// 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 :(得分:1)

您需要将键侦听器添加到具有焦点的组件(许多组件实际上是复合组件)。

因此请使用条件为JComponent.registerKeyboardAction的{​​{1}}。或者,使用WHEN_IN_FOCUSED_WINDOW API文档中描述的JComponent.getInputMap(WHEN_IN_FOCUSED_WINDOW, true)JComponent.getActionMap(true)

答案 2 :(得分:0)

请检查是否抛出运行时异常。可能是你在错误的线程中显示这个对话框,或者另一个问题可能会抛出这个异常。

另外请考虑使用异步线程来显示对话框,而不是使用侦听器线程。但这只是一个想法。