public Image createImage(int width, int height)创建一幅用于双缓冲的、可在屏幕外绘制的图像。 返回:
一幅屏幕外可绘制的图像,可用于双缓冲。如果组件是不可显示的,则返回值可能为 null。如果 GraphicsEnvironment.isHeadless() 返回 true,则始终发生这种情况.
上面API中的这段话看不懂啊。何谓“如果组件是不可显示的”?  这个方法该怎么用?其实我是在学着写Tank.java雏形时,有一句关于createImage()的代码不理解,所以才问这个问题的。请就下面的问题讲讲createImage()吧。将原代码中的A句和B段去掉,在A处直接写Image offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
为何运行后小球就不向下走了,这是哪里的问题?请讲详细写啊,初学者我。===Tank.java=== 
import java.awt.*;
import java.awt.event.*;public class TankClient extends Frame {
    
int x, y = 50;
public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGHT = 600;
Image offScreenImage = null;    //A

public void paint(Graphics g) {
Color c = g.getColor();
g.setColor(Color.red);
g.fillOval(x, y, 30, 30);
g.setColor(c);
}

public void update(Graphics g) {
if(offScreenImage == null) {                                         //B
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);  //B
}                                                                    //B
Graphics imageG = offScreenImage.getGraphics();
Color c = imageG.getColor();
imageG.setColor(Color.green);
imageG.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
imageG.setColor(c);
paint(imageG);
g.drawImage(offScreenImage, 0, 0, null);

} public void launchFrame() {
setBounds(400, 300, GAME_WIDTH, GAME_HEIGHT);
setResizable(false);
setTitle("TankWar");
setBackground(Color.green);
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

    addKeyListener(new KeyMonitor());
    setVisible(true);

new Thread(new PaintThread()).start();
}

private class PaintThread implements Runnable {
        public void run() {
    while(true) {
repaint();
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

private 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_RIGHT:
     x += 5;
     break;
    case KeyEvent.VK_UP:
     y -= 5;
     break;
    case KeyEvent.VK_DOWN:
     y += 5;
     break;
    }
}

}

public static void main(String[] args) {
TankClient tc = new TankClient();
tc.launchFrame();

}}

解决方案 »

  1.   

    何谓“如果组件是不可显示的”?
    是没有执行paint方法之前
      

  2.   

    public boolean isDisplayable()
    确定此组件是否可以显示。当组件连接到一个本机屏幕资源时是可以显示的。 
    将组件添加到一个可显示的包含层次结构时,或者其包含层次结构变成可显示时,该组件才成为可显示的组件。当包含层次结构的祖先窗口被打包或变为可见时,它才成为可显示的。 从可显示的包含层次结构中移除某个组件,或者该组件的包含层次结构变成不可显示时,该组件就成为不可显示的组件。当包含层次结构的祖先窗口被移除时,它才变成不可显示的。 public static boolean isHeadless()
    测试此环境是否支持显示器、键盘和鼠标。如果此方法返回 true,则从依赖于显示器、键盘或鼠标的 Toolkit 和 GraphicsEnvironment 区域抛出 HeadlessException。 返回:
    如果此环境无法支持显示器、键盘和鼠标,则返回 true;否则返回 false
    我觉得jdk文档已经很清楚了