java键盘监听无法触发

程序只有一个JFrame,应该不是焦点问题。

import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class GameInterface extends JFrame implements KeyListener{
Tank tank=new Tank();
Bullet bullet=new Bullet();
TankController tc=new TankController();
public GameInterface() {
this.addKeyListener(this);
this.setFocusable(true);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);

setBounds(0,0,1500,1000);
setVisible(true);

}

public void paint(Graphics g){
while(true){
tank.clearTank(g);
tank.clearMyTank(g);
tc.tankDirection();
tank.draw(g);

tank.drawMyTank(g);
bullet.draw(g);
}

}

public static void main(String[] args){
new GameInterface().repaint();
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("r");

switch(e.getKeyCode()){
case KeyEvent.VK_RIGHT:
Tank.myTank.Dirction=Tank.RIGHT;
Tank.myTank.x+=20;
break;
case KeyEvent.VK_LEFT:
Tank.myTank.Dirction=Tank.LEFT;
Tank.myTank.x-=20;
break;
case KeyEvent.VK_UP:
Tank.myTank.Dirction=Tank.UP;
Tank.myTank.y-=20;
break;
case KeyEvent.VK_DOWN:
Tank.myTank.Dirction=Tank.DOWN;
Tank.myTank.y+=20;
break;}

}

@Override
public void keyReleased(KeyEvent e) {

}

@Override
public void keyTyped(KeyEvent e) {

}

}

3个回答

我试了下你这个是可以接到键盘指令的,,不过你有几个类没有给发,,这个应该不影响,,

这个你测试的时候,要把窗口打开然后按上下左右键,要不然键盘作用的对象就不是你的窗口,,不知道说明白没,,有问题还可以继续交流

Small_Mouse0
鼠小 回复只愿不违本心: 不是,paint()和repaint()优先级问题,可以认为是一样的,但是程序得顺序执行,while(true)了就在这卡住了,,后面的拿不到CPU的执行权就只能排队等待。。,,。。。这个你可以自己测一下,会更明白,在while(true){},里面价格打印输出语句,运行,,控制台会一直输出这个语句(亲测)。。。
3 年多之前 回复
qq_27718453
庄粟 回复只愿不违本心: 人家说的很清楚了,线程被占用没法处理键盘事件,结贴吧。。。
3 年多之前 回复
qq_34228570
CavalryOuO 回复小鼠标丶:可以说 是通过中断,只不过优先级没有paint()高,但比repaint()高?
3 年多之前 回复
Small_Mouse0
鼠小 这样解释你想想对不对,,键盘指令接收到了,排队等待处理,,但是你的程序还一直在执行,(while True 了),,cpu一直被占着,没办法执行后面的指令
3 年多之前 回复
qq_34228570
CavalryOuO 监听是通过线程还是中断完成的?
3 年多之前 回复
qq_34228570
CavalryOuO 回复小鼠标丶: 也就是说监听无法中断,无法相应事件?
3 年多之前 回复
Small_Mouse0
鼠小 回复只愿不违本心: UI线程一般情况下是这种带界面程序的主线程,,监听的话应该是以中断形式完成的,,不过没有你这个while(true)里面东西优先(或者说,现在和那个优先级一样,,),,我测试的时候,你少发了几个类,我就把部分代码注释掉了,,只留下了和键盘监听有关的,所以。。。
3 年多之前 回复
qq_34228570
CavalryOuO 我试了在paint()里面只有循环什么都不做,也不能监听。
3 年多之前 回复
qq_34228570
CavalryOuO 我把重写的paint()方法里面的while循环移到外面的repaint()前面就可以监听, 这是为什么?
3 年多之前 回复

代码太乱了,建议你单独写一个类来实现KeyListener接口。

把代码整理一下吧,这样看着太乱了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐