java 键盘事件可以读入组合键吗? 15
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN: y += 10;break;
case KeyEvent.VK_UP: y-=10;break;
case KeyEvent.VK_LEFT: x-=10;break;
case KeyEvent.VK_RIGHT: x+=10;break;
}
}
});
上面的只能读入上下左右中的一个,我想要比如“上左”两个键组合,但是不知道怎么弄。请大家帮帮忙,谢谢 展开
给后来的人看看吧,这个是方法已经测试过了可用;
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
public void eventDispatched(AWTEvent event) {
if (((KeyEvent) event).getID() == KeyEvent.KEY_PRESSED) {
// 放入自己的键盘监听事件
// ((KeyEvent) event).getKeyCode();// 获取按键的code
// ((KeyEvent) event).getKeyChar();// 获取按键的字符
if (((InputEvent) event).isControlDown() && ((KeyEvent) event).getKeyCode() == 49) {
System.out.println("**");
}
System.out.println("" + event.getSource());
}
}
}, AWTEvent.KEY_EVENT_MASK);
只允许同时按下是修饰键alt, ctrl, shift,加一个键。
但你这个功能可以自己实现,
当UP键‘按下keypressed’事件时,用一个状态变量记录下来,up=true;
当UP键‘松开keypressed’事件时,用一个状态变量记录下来,up=false;
同理,也记录Left键的状态。left=true/false;以及记录上下左右所有控制键的状态。
统一在一处方法中根据‘自己记录的状态’来处理其他坐标等因素。
自己记录的上和左是按下的,就按上左处理,而不再以键盘响应码为判断依据。
那switch语句怎么读入两个键的统一码?
up down两个键的输入是有先和后的,不是同时输入。
但你就要自己另行记录这种状态。当前一个键没有松开release事件之前,
你的程序就假定认为2个键在同时按下,进程只管按按下的情况执行。比如坐标斜向移动。
一旦有一个键有release事件后,认为2个键同时按下的状态解除。
就需要自己设计一个状态记录和执行机制。.超越键盘监听器的低层框架。
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN: y += 10;
case KeyEvent.VK_UP: y-=10;
case KeyEvent.VK_LEFT: x-=10;
case KeyEvent.VK_RIGHT: x+=10;
default : break;
}
}
});
其实把break放在default就行啦,前面就能把每个事件都遍历了再执行break,而前面的如果没输入也不会触发,这个break本来就是跳出switch用的,最简单的是把break都扔了-.-不过这不是好的习惯而已,下面就是了
addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
switch(e.getKeyCode()){
case KeyEvent.VK_DOWN: y += 10;
case KeyEvent.VK_UP: y-=10;
case KeyEvent.VK_LEFT: x-=10;
case KeyEvent.VK_RIGHT: x+=10;
}
}
});
可是如果像你说的那样的话,“下”和“左”就都作用不了了。因为如果按了“下”,还会经过下面那句case KeyEvent.VK_UP: y-=10; 那就是先加再减,那坐标就不会改变
给你分析一下,然后你实践一次就明白了Switch break的道理了
先说明一下 case 后面的是触发条件,
如果KeyEvent.VK_DOWN成立,则进入KeyEvent.VK_DOWN后面的语句:y += 10;
如果不发生,则跳过KeyEvent.VK_DOWN:后面的语句,查看下一个触发条件是否成立;
另一方面,break语句是跳出switch:case循环的指令语句,在如果case KeyEvent.VK_DOWN成立
进入后面语句中带有break,如: y += 10; break;则在这里跳出了switch:case,不再遍历后面的语句;
对于你的意思推测一下:
你所说的情况是同是按了down和up才会发生,如果只按down和left,up语句不会的触发的哟~