写了一个键盘监听类:
class myKeyListener implements KeyListener{}
用来为一个窗口JFrame加入键盘监听:
但是,KeyListener()只能捕获当前键盘焦点所在的控件Fire出来的事件。
现在这个Frame里有几个Panel,每个Panel里面很多的控件。所以单独为每个焦点可能达到的控件添加键盘监听是不实际的。
但是如果面板里有可以获得焦点的控件,如button,为面板添加的键盘监听就没有效果,只响应Tab或者shift Tab来移动焦点。
但是我希望不管当前焦点在哪里,我按下F1~F12都要能够捕获到键盘事件然后响应。
各位,应该有比较简单的办法吧?
谢谢啦!
class myKeyListener implements KeyListener{}
用来为一个窗口JFrame加入键盘监听:
但是,KeyListener()只能捕获当前键盘焦点所在的控件Fire出来的事件。
现在这个Frame里有几个Panel,每个Panel里面很多的控件。所以单独为每个焦点可能达到的控件添加键盘监听是不实际的。
但是如果面板里有可以获得焦点的控件,如button,为面板添加的键盘监听就没有效果,只响应Tab或者shift Tab来移动焦点。
但是我希望不管当前焦点在哪里,我按下F1~F12都要能够捕获到键盘事件然后响应。
各位,应该有比较简单的办法吧?
谢谢啦!
try {
Toolkit toolkit = Toolkit.getDefaultToolkit();
toolkit.addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent e) {
if (((KeyEvent) e).getKeyCode() == KeyEvent.VK_F1)
System.out.println("F1");
if (((KeyEvent) e).getKeyCode() == KeyEvent.VK_F2)
System.out.println("F2");
}
}, AWTEvent.KEY_EVENT_MASK);
Thread thread = new Thread(new Runnable() {
public void run() {
try {
File music = new File(iSystemConstants.muiscfile);
Player player = new Player(new FileInputStream(music));
player.play();
} catch (FileNotFoundException ex) {
} catch (JavaLayerException ex) {
} }
});
//thread.start(); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR",
JOptionPane.ERROR_MESSAGE);
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "ERROR",
JOptionPane.ERROR_MESSAGE);
}
如何通过按ESC键,退出本Frame?
http://blog.csdn.net/bovy/archive/2007/04/04/1552003.aspx
不过看这个:
public class MyKeyEventPostProcessor implements KeyEventPostProcessor {
public boolean postProcessKeyEvent(KeyEvent event) {// why must be public? if (KeyEvent.VK_ESCAPE == event.getKeyCode()) {
System.exit(0);
} if (KeyEvent.VK_F1 == event.getKeyCode()) {
System.out.println("F1 be pressed!");
}
return true;
}
}
为什么System.out.println("F1 be pressed!");执行了两次?
貌似按键按下和松开各fire了一个KeyEvent。而且按住不放的时候会不断的执行!
但是我只要他能响应按下事件就可以了,按住不放以及松开都不处理。(如果按住不放不断处理的话很恐怖,假设按F1是做一个数据库查询显示操作,那就恐怖啦。)
要如何做?
// TODO Auto-generated method stub
if (KeyEvent.VK_F1 == event.getKeyCode()) {
System.out.println("F1 be pressed!");
}
} public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
} public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
就是想KeyListener这样做,可以只对一次按下事件响应,其余忽略。
if(KeyEvent.KEY_PRESSED==event.getID()){
System.out.println("F2 be pressed!");
return true;
}
}
原来event的getID方法返回的就是键盘事件类型啊,真笨。
谢谢各位啦,结贴咯!