我正在使用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
}
};
答案 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)
请检查是否抛出运行时异常。可能是你在错误的线程中显示这个对话框,或者另一个问题可能会抛出这个异常。
另外请考虑使用异步线程来显示对话框,而不是使用侦听器线程。但这只是一个想法。