再次求java 键盘事件问题 KeyListener

关于java键盘事件,keyPressed,可不可以同时收听两个按键呢?比如:我按下方向键(上、下、左、右)的同时也按下空格键等其他键,我用keyPressed来做的话,... 关于java键盘事件,keyPressed,可不可以同时收听两个按键呢?比如:我按下方向键(上、下、左、右)的同时也按下空格键等其他键,我用keyPressed来做的话,总是失败,每次只能收听一个键位,要么只收听方向键,空格键没反应,要么只收听空格键,方向键没反应。。
要同时听两个以上的按键事件,应该怎么实现?就像射击游戏那样,一直按着某键不放来发射子弹,同时又能操控方向键来改变对象的方向。应该怎么做呢?下面是个小例子,一次只能收听一个键位,怎么改成以上说的同时收听两个以上的呢?
因为字数问题,另外JFrame类就不说了
//用JPanel来实现动画的类
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.DefaultEditorKit.InsertBreakAction;
@SuppressWarnings("serial")
public class myGamePanel extends JPanel implements KeyListener, Runnable {
int bombNumber=4,NConst=0;
int countX,countY,ImageWidth,ImageHeight;
int x=150,y=430,dx,dy;
int bx,by,dbx,dby=-15,flag=0;
int []xx=new int[bombNumber];
int []yy=new int[bombNumber];
Image img,imgBomb,imgFly;
Image []imgs=new Image[bombNumber];
MediaTracker MT;
public myGamePanel()
{
countX=5;
countY=5;
Toolkit tk=Toolkit.getDefaultToolkit();
imgFly=tk.getImage(myGamePanel.class.getResource("fly40.png"));
MT=new MediaTracker(this);
MT.addImage(imgFly,0);
try{
MT.waitForAll();
}
catch(InterruptedException E){}
ImageWidth=img.getWidth(this);
ImageHeight=img.getHeight(this);
this.setLayout(null);
this.requestFocus();
this.setSize(ImageWidth*countX,ImageHeight*countY);
//enableEvents(AWTEvent.KEY_EVENT_MASK);
}

public void run() {
// TODO Auto-generated method stub

while(true){
if(by<=0)by=-12;
if(flag==1)by=by+dby;
repaint();
try{
Thread.sleep(10);
}catch(InterruptedException e){}

}
}

public void paint(Graphics g){
super.paint(g);
g.setColor(Color.red);
for(int i=0;i<(countX*countY);i++){
g.drawImage(img, i%countX*ImageWidth, i/countY*ImageHeight, this);
}
g.drawImage(imgs[NConst], bx, by,this);
g.drawImage(imgFly,x,y,this);
}
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {//键盘按键按下事件
// TODO Auto-generated method stub
switch(e.getKeyCode())
{
case KeyEvent.VK_RIGHT:
dx=5;dy=0;
break;
case KeyEvent.VK_LEFT:
dx=-5;dy=0;
break;
case KeyEvent.VK_UP:
dx=0;dy=-5;
break;
case KeyEvent.VK_DOWN:
dx=0;dy=5;
break;
case KeyEvent.VK_SPACE:
dx=0;dy=0;
bx=x+13;
by=y-5;
flag=1;
default:
dx=0;dy=0;
}
x=x+dx;
y=y+dy;

}

public void keyReleased(KeyEvent e) {

}
}
展开
 我来答
话说GIF
2011-04-07 · 超过12用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:44.7万
展开全部
一个事件源,多个监听器。这么做比较容易解决。你给事件源添加两次监听器,两个不同的监听器。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cuidesheng114
2011-04-07 · 知识很杂,但是都是平时可能用得到的
cuidesheng114
采纳数:9 获赞数:7

向TA提问 私信TA
展开全部
public boolean onKey(View v, int keyCode, KeyEvent event) {

if(event.getAction()==KeyEvent.ACTION_DOWN){
int shu ;
NoteDebug((String) Text_hide7.getText());
switch (keyCode) {
case KeyEvent.KEYCODE_0:
numberOnClick("0");
break;
case KeyEvent.KEYCODE_1:
numberOnClick("1");
break;
case KeyEvent.KEYCODE_2:
numberOnClick("2");
break;
case KeyEvent.KEYCODE_3:
numberOnClick("3");
break;
case KeyEvent.KEYCODE_4:
numberOnClick("4");
break;
case KeyEvent.KEYCODE_5:
numberOnClick("5");
break;
case KeyEvent.KEYCODE_6:
numberOnClick("6");
break;
case KeyEvent.KEYCODE_7:
numberOnClick("7");
break;
case KeyEvent.KEYCODE_8:
numberOnClick("8");
break;
case KeyEvent.KEYCODE_9:
numberOnClick("9");
break;
case KeyEvent.KEYCODE_PERIOD:
edittext.setText(edittext.getText() + ".");
edittext.setSelection(edittext.length());
shu = Integer.parseInt(String.valueOf( Text_hide7.getText()));
Text_hide7.setText(String.valueOf(shu +1));
break;
default:
shu = Integer.parseInt(String.valueOf( Text_hide7.getText()));
Text_hide7.setText(String.valueOf(shu +1));
break;
}
if(keyCode==event.KEYCODE_TAB){

}else if(keyCode==27){

}
}
return true;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zx_perfect
2011-04-06 · TA获得超过105个赞
知道小有建树答主
回答量:143
采纳率:0%
帮助的人:93.8万
展开全部
利用线程就能实现你所说的哈
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式