单一线程中flushGraphics的问题

时间:2008-07-24 14:49:53   来源:论坛整理  作者:  编辑:chinaitzhe
下面的代码是让屏幕每隔1秒显示一种颜色。

public class MyTest extends MIDlet {
Display d = null;
public MyTest() {
d = Display.getDisplay(this);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {

}

protected void startApp() throws MIDletStateChangeException {
// TODO Auto-generated method stub
WinCanvas w = new WinCanvas(false);
d.setCurrent(w);
//w.myPaint();这里也是可以运行成功的
}

public class WinCanvas extends GameCanvas implements Runnable {

private Graphics g;
int color[] = {0x112233,0xabcd12,0x23dffa,0x12acda,0x7641af,0x9812af,0xbbaf12};
public WinCanvas(boolean arg0) {
super(arg0);
g = this.getGraphics();
g.setColor(0x000000);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
}

public synchronized void myPaint(){
for(int i=0;i <color.length;i ){
g.setColor(color[i]);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
this.flushGraphics();
System.out.println("ok");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
}
}

public void keyPressed(int k){
k = this.getKeyStates();
if((k&GameCanvas.FIRE_PRESSED)!=0) this.myPaint();//这里调用则只是显示最后的一个颜色
if((k&GameCanvas.LEFT_PRESSED)!=0) new Thread(this).start();//这样可以 }
public void run() {
myPaint();//新开线程运行,显示正常。
}
}


我想问的,为什么会出现这样的现象,什么原理。另外eclipse的wireless Toolkit2.5.2是可以的。可以一到真机就不行了。
网友回复:此回复为自动发出,仅用于显示而已,并无任何其他非凡作用
楼主【sunceenjoy】截止到2008-07-12 23:55:51的历史汇总数据(不包括此帖):
发帖的总数量:0 发帖的总分数:0 每贴平均分数:0
回帖的总数量:0 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:0 结贴的总分数:0
无满足结贴数:0 无满足结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:---------------------结分的百分比:---------------------
无满足结贴率:---------------------无满足结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
网友回复:建议你下载你的真机的模拟器调试,用自带的模拟器有时会出现这个问题!!
网友回复:这是不是跟java的什么机制有关,有本书上说。repaint的时候其实是调用一个其他线程来进行画图,而cpu一直处于主线程,则repaint不能被立即执行。
网友回复:for(int i=0;i <color.length;i ){
g.setColor(color[i]);
g.fillRect(0, 0, this.getWidth(), this.getHeight());

-_-!!
逻辑错误吧。
你来个循环不停的赋值颜色然后画图,是画的太快了你看不到那颜色变化所以只停留到最后一种颜色,应该用另外一种循环,根据外部条件每paint一次只赋值颜色画图一次,你试试看。
int c = 0;//外部定义

if(c>color.length-1)c=0;
g.setColor(color[c]);
c =1;
g.fillRect(0, 0, this.getWidth(), this.getHeight());
网友回复:它不是立即显示的,似乎我记得是你线程一转之后显示画笔画过的所有东西,假如你想马上更新似乎得在你repaint后加一个serviceRepaints()
网友回复:回复4楼,我循环中是用了sleep(1000)的.不可能画的太快。
回复5楼,加了,没有反应.

还有没有谁指点下啊。新开线程则显示正常,直接this.myPaint();确有问题。
网友回复:sleep的是线程,你sleep一次,就paint一次,paint的那次就来往返回的画,你改成我那样试试呗
网友回复:楼上的朋友,你的意思我明白,只画一次是没有问题的。但我现在要的就是连续的画.每隔一秒画一次。这只是个例子,比如用在闪烁效果的时候.
是不是一定要在另外的线程里面进行??
网友回复:眼花了,原来那个sleep在循环之内,那就是这样了,必须启动一个线程才能sleep,你不行的那个就是canvas
里没有线程吧,
外部调用paint的时候用的是midlet的线程?所以sleep的是midlet?这个就不清楚了。
关键字:单一,线程,flushGraphics,问题,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面