[求助] Component类里的createImage(int w, int h) 怎么理解?

qq-dabins 2008-05-21 06:42:24

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();

}

}
...全文
192 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fing_ming 2010-12-31
  • 打赏
  • 举报
回复
三楼以后这样的废话能不能不要说???OK???
cyberpeng 2008-05-21
  • 打赏
  • 举报
回复
貌似楼主的问题我回答过……
fosjos 2008-05-21
  • 打赏
  • 举报
回复
public boolean isDisplayable()
确定此组件是否可以显示。当组件连接到一个本机屏幕资源时是可以显示的。
将组件添加到一个可显示的包含层次结构时,或者其包含层次结构变成可显示时,该组件才成为可显示的组件。当包含层次结构的祖先窗口被打包或变为可见时,它才成为可显示的。

从可显示的包含层次结构中移除某个组件,或者该组件的包含层次结构变成不可显示时,该组件就成为不可显示的组件。当包含层次结构的祖先窗口被移除时,它才变成不可显示的。

public static boolean isHeadless()
测试此环境是否支持显示器、键盘和鼠标。如果此方法返回 true,则从依赖于显示器、键盘或鼠标的 Toolkit 和 GraphicsEnvironment 区域抛出 HeadlessException。

返回:
如果此环境无法支持显示器、键盘和鼠标,则返回 true;否则返回 false


我觉得jdk文档已经很清楚了
jdlsfl 2008-05-21
  • 打赏
  • 举报
回复
何谓“如果组件是不可显示的”?
是没有执行paint方法之前

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧