import java.awt.*;
import java.awt.event.*;public class TankClient extends Frame {
// 实现创建一个窗口 ,位置据左上角,400,300 高度 800,600 public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGHT = 600;
int x = 50, y = 50; Image offScreenImage = null;// 定义一张背景图片,paint类首先调用paint方法中update方法,我们在update中把图片铁记过去 public void paint(Graphics g) {// 绘图类
Color c = g.getColor();// 获取当前前景色
g.setColor(Color.RED);// 设置颜色为红色
g.fillOval(x, y, 30, 30);// 画一个圆,四个参数,50.50为这个方框距离左上角的位置,30为width,30为height
g.setColor(c);// 还原前景色
} public void update(Graphics g) {
if (offScreenImage == null) {// 如果背景图片为空,则创建背景图片,如果要在这个图片上作画,必须获取一个画笔
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();// 创建一个画笔gOffScreen
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);// 绘制背面图片
g.drawImage(offScreenImage, 0, 0, null);// 将创建的图片一次性话到前面来就要使用update参数内g这只画笔
} public void lauchFrame() {
this.setLocation(400, 300);// 设置位置
this.setSize(GAME_WIDTH, GAME_HEIGHT);// 设置高度
this.setTitle("TankWar");// 设置标题
this.addWindowListener(new WindowAdapter() {// 添加事件监听的内部类,内部类无类名,直接通过new
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
this.setResizable(false);
this.setBackground(Color.GREEN);
setVisible(true);// this.addKeyListener(new KeyMonitor()); new Thread(new PaintThread()).start();// 继承runable启动线程调用start方法
} public static void main(String[] args) {
TankClient tc = new TankClient();
tc.lauchFrame(); } public class PaintThread implements Runnable {// 内部类启动线程机制
public void run() {
while (true) {
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public class KeyMonitor extends KeyAdapter {// 键盘监听类
public void KeyPressed(KeyEvent e) {// 键盘事件
int key = e.getKeyCode();// 获取键盘的虚拟键
switch (key) {// 对虚拟键分析是否
case KeyEvent.VK_LEFT:
x -= 5;
break;
case KeyEvent.VK_UP:
y -= 5;
break;
case KeyEvent.VK_RIGHT:
x += 5;
break;
case KeyEvent.VK_DOWN:
y += 5;
break;
}
}
}
}

解决方案 »

  1.   

    addKeyListener(new KeyMonitor()); 问题出在这里:KeyMonitor这个类方法的问题,应该是这样的。public class KeyMonitor implements KeyListener
    {// 键盘监听类 
    public void KeyPressed(KeyEvent e) {// 键盘事件 
    int key = e.getKeyCode();// 获取键盘的虚拟键 
    switch (key) {// 对虚拟键分析是否 
    case KeyEvent.VK_LEFT: 
    x -= 5; 
    break; 
    case KeyEvent.VK_UP: 
    y -= 5; 
    break; 
    case KeyEvent.VK_RIGHT: 
    x += 5; 
    break; 
    case KeyEvent.VK_DOWN: 
    y += 5; 
    break; 



      

  2.   

    你的意思是KeyMonitor这个类不能继承KeyAdapter类
    而必须直接实现KeyListener这个接口?但是我按你的
    方法改了后编译就出错了啊!!
    再说要直接实现KeyListener接口的话,那不是要实现
    KeyListener接口里所有的方法?
      

  3.   

    晕死  害我看了半天,public void KeyPressed(KeyEvent e) 写错了,方法名首字母小写 是keyPressed
      

  4.   

    还有 应该继承KeyAdapter类,而不是实现接口,实现接口太麻烦了.
      

  5.   

    public class KeyMonitor extends KeyAdapter {// 键盘监听类 
    你这代码用CSDN提供的代码块来框住啊,看起来太难看了。
    3楼是正解,还有遇到这种继承的时候最好用
    @Override把要重写的方法标记,这样就不会出错了。