1.现在我们只是画了一个正方向但是还不能操作,添加窗口事件的接口
this.addKeyListener(new MyKeyListener());
2.然后我们要写一个类叫键盘监听处理类
//继承Frame类,方便重写里面的方法
public class TankFrame extends Frame {
public TankFrame(){
setSize(800,600);//设置窗口大小
setResizable(false);//设置为false后不能改变大小
setTitle("tank war");//设置窗口标题为tank war
setVisible(true);//设置是否显示
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() { //创建一个监听器如果用户点击X后调用windowClosing
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
g.fillRect(200,200,50,50);
}
//新建一个键盘监听处理类
class MyKeyListener extends KeyAdapter {
}
}
3.然后重写MyKeyListener类中的两个方法
class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
keyPressed会在一个键被按下去的时候调用
keyReleased会在一个键被抬起的的时候调用
然后我们修改代码测试一下方法
class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
System.out.println("key pressed");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("key released");
}
}
再次运行可以看到我们只要按下任意一个键,键盘按下时调用了keyPressed方法在控制台打印出了key pressed,键盘抬起时调用了keyReleased方法在控制台打印出了 key released
4.然后需要实现让我们按下一个键的时候方块能动一下
5.修改代码把方块的位置定义为变量增加一个x和y值
当键盘按下的时候x的值增加200
//继承Frame类,方便重写里面的方法
public class TankFrame extends Frame {
public int x=200;
public int y=200;
public TankFrame(){
setSize(800,600);//设置窗口大小
setResizable(false);//设置为false后不能改变大小
setTitle("tank war");//设置窗口标题为tank war
setVisible(true);//设置是否显示
this.addKeyListener(new MyKeyListener());
addWindowListener(new WindowAdapter() { //创建一个监听器如果用户点击X后调用windowClosing
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@Override
public void paint(Graphics g) {
g.fillRect(x,y,50,50);
}
class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
x += 200;
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("key released");
}
}
}
再次运行可以看到当我们按下键盘上面的一个按键方块的位置没有变化,但是我们把窗口最小化再打开可以发现窗口的位置改变了,这是因为我们没有改变位置后没有重新画出方块,但我再打开窗口的时候矩形会重新绘制
6.再次修改代码,让每次按下按键时方块向右移动200像素
class MyKeyListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
x += 200;
repaint();
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("key released");
}
}
repaint这个方法每次调用的时候都会重新调用paint方法画出方块
7.要有一办法让它自动的不断的刷新(不能我按一下键盘,我动一下、再按一下键盘、敌人也跟着动一下)
8.有个最简单的办法能解决这个问题,来到Main类里的main方法增加一个循环让它每隔50毫秒刷新一次
public class Main {
public static void main(String[] args) throws InterruptedException{
TankFrame tf = new TankFrame();
while (true){
Thread.sleep(50);
tf.repaint();
}
}
}