最近在做一个面向对象的大作业,在用Graphics类的g.clearRect()方法时遇到了一些搞不懂的地方,希望大家给指点一下~也是很着急啊~!!!我的程序到目前为止就是在屏幕上显示一个类似于地图的方格窗口,然后里面有一个图片来代表一个人,按键盘的方向键的时候人朝四个方向转,当然这只是目前这个程序所实现的功能...我的问题是用clearRect()方法后窗口中的方格就不再被显示出来了(也就是drawline()不显示结果了),而只是有小人的图片显示,不知道clearRect()方法放在哪个方法中合适,是paint()?,update()?还是run()?迫切希望指点~!!!另外一个问题就是在运行的时候抛出异常,怀疑是线程的问题,可不知道怎么解决
下面是抛出的异常:Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at cn.com.jason.robot.Display.Display.paint(Display.java:136)
at sun.awt.RepaintArea.paintComponent(RepaintArea.java:248)
at sun.awt.RepaintArea.paint(RepaintArea.java:224)
at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:254)
at java.awt.Component.dispatchEventImpl(Component.java:4031)
at java.awt.Container.dispatchEventImpl(Container.java:2024)
at java.awt.Window.dispatchEventImpl(Window.java:1774)
at java.awt.Component.dispatchEvent(Component.java:3803) at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)源代码如下
//Jason  2007-5-28
package cn.com.jason.robot.Display;import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
 public class Display extends Frame implements Runnable,KeyListener {
/**
 * 
 */
private static final long serialVersionUID = 1L; /**
 * @param args
 */
// 画面大小的参数
int width = 420; int height = 420; int distance = 30; int tempdistance = 45; // 角色图象的参数
int LocationX = 80; int LocationY = 95; // 角色方向参数,默认为向右左
char direction = 'L'; // 绘制图象的线程
Thread graphicThread; // 建立一个Image对象
Image offscreenImage; // 建立Graphics对象
Graphics offscreenG; //
MediaTracker tracker; //
//ImageFilter filter; // 建立角色的四个方向的图片
Image roleLeft; Image roleRight; Image roleUp; Image roleDown; // public static void main(String[] args) {
//Display dp = new Display();
new Display();
} private class WindowCloser extends WindowAdapter {
public void windowClosing(WindowEvent we) {
stop();
System.exit(0);
}
} public void Start() {
if (graphicThread == null) {
graphicThread = new Thread(this);
graphicThread.start();
} } public void stop() {
if (graphicThread != null) {
graphicThread.stop();
graphicThread = null;
} } public Display() {
super("Display the Frame");
setSize(500, 550);
setResizable(false);
show();
addKeyListener(this);
this.Start();
// 建立图象缓冲区
offscreenImage = createImage(475, 475);
offscreenG = offscreenImage.getGraphics();
// 获取角色图片

tracker = new MediaTracker(this);
roleLeft = Toolkit.getDefaultToolkit().getImage("image\\left.gif");
roleRight = Toolkit.getDefaultToolkit().getImage("image\\right.gif");
roleUp = Toolkit.getDefaultToolkit().getImage("image\\up.gif");
roleDown = Toolkit.getDefaultToolkit().getImage("image\\down.gif");

tracker.addImage(roleLeft, 0);
tracker.addImage(roleRight, 1);
tracker.addImage(roleUp, 2);
tracker.addImage(roleDown, 3); // 例外处理
try {
tracker.waitForAll(); } catch (InterruptedException e) {
}
        
// 角色图象参数初始化
addWindowListener(new WindowCloser());
} public void paint(Graphics g) {
// 设置线条颜色
offscreenG.setColor(Color.black);

//设置环境
//System.out.println("开始准备画线条");
for (int i = 0; i <= (height / distance); i++) {
// 画横条的背景线
offscreenG.drawLine(30, tempdistance, width + 30, tempdistance);
// 画纵条的背景线
offscreenG.drawLine(tempdistance - 15, 45, tempdistance - 15,width + 45);
//System.out.println("画了"+i+"条背景线");
// 显示X轴边框的坐标
offscreenG.drawString(Integer.toString(i), tempdistance - 18, 40);
// 显示Y轴边框的坐标
offscreenG.drawString(Integer.toString(i), 15, tempdistance + 5);
tempdistance += distance;
}
//System.out.println("画线条完毕");
// 画边框
offscreenG.draw3DRect(30, 45, 420, 420, false);
        //绘制角色
switch (direction) {
case 'L':
offscreenG.drawImage(roleLeft, LocationX, LocationY, this);
break;
case 'R':
offscreenG.drawImage(roleRight, LocationX, LocationY, this);
break;
case 'U':
offscreenG.drawImage(roleUp, LocationX, LocationY, this);
break;
case 'D':
offscreenG.drawImage(roleDown, LocationX, LocationY, this);
break;
}
// 将缓冲区的内容一次绘入
g.drawImage(offscreenImage, 0, 0, this);
} public void update(Graphics g) {
paint(g);
} public void run() {
// TODO Auto-generated method stub
while (true) {
//offscreenG.clearRect(30, 45, width, height);
        
//offscreenG.clearRect(30, 45, width, height);
System.out.println("run()中...");
repaint();
try {
Thread.sleep(1000);
         //offscreenG.clearRect(30, 45, width, height);
} catch (InterruptedException e) {
}
}
} public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode(); if (key == KeyEvent.VK_UP) {
direction = 'U';
//offscreenG.clearRect(30, 45, width, height);
//repaint();
} else if (key == KeyEvent.VK_DOWN) {
direction = 'D';
//offscreenG.clearRect(30, 45, width, height);
//repaint();
} else if (key == KeyEvent.VK_RIGHT) {
direction = 'R';
//offscreenG.clearRect(30, 45, width, height);
//repaint();
} else if (key == KeyEvent.VK_LEFT) {
direction = 'L';
//offscreenG.clearRect(30, 45, width, height);
//repaint();
}
} public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub } public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub }
}