j2me一个小程序不懂地方求解释 谢谢
一个小程序实现4张图片的轮播代码如下:我的疑惑是这程序是如何实现轮播的里面又没有while(true){}或者什么别的循环是如何做到不停轮播的我猜测可能是paint()和...
一个小程序 实现4张图片的轮播 代码如下:
我的疑惑是这程序是如何实现轮播的 里面又没有while(true){}或者什么别的循环 是如何做到不停轮播的 我猜测可能是paint()和repaint()同步问题实现的 当我把带有**************的一行注释掉时 它就不轮播了 但是具体不清楚 求解释 谢谢
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Weather extends MIDlet implements CommandListener
{
private Display display;
private WeatherCanvas mycanvas;//对内部类WeatherCanvas的引用 扩展自Canvas
private Command cmdexit=new Command("Exit",Command.EXIT,1);
public Weather()//构造函数
{
display=Display.getDisplay(this);
mycanvas=new WeatherCanvas();
mycanvas.addCommand(cmdexit);
mycanvas.setCommandListener(this);
}
public void startApp() throws MIDletStateChangeException
{
display.setCurrent(mycanvas);
mycanvas.startAnimation();
System.out.println("startApp()");
}
public void pauseApp(){System.out.println("pauseApp()");}
public void destroyApp(boolean un){System.out.println("destroyApp()");}
public void commandAction(Command c,Displayable d)
{
if(c==cmdexit)
{
destroyApp(true);
notifyDestroyed();
}
System.out.println("commandAction()");
}
class WeatherCanvas extends Canvas implements Runnable
{
private Image img[]=new Image[4];
private int currentFrame;
public WeatherCanvas()
{
try{
for(int i=0;i<4;i++)
img[i]=Image.createImage("/"+i+".png");
}
catch(Exception e)
{System.out.println(e);}
currentFrame=0;
System.out.println("WeatherCanvas()");
}
public void paint(Graphics g)
{
g.setColor(0xff00ff);
g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(img[currentFrame],getWidth()/2,getHeight()/2,g.HCENTER|g.VCENTER);
System.out.println("paint()");
}
public void startAnimation()
{
repaint();
display.callSerially(this);
System.out.println("startAnimation()");
}
public void run()
{
try{
Thread.sleep(2000);
currentFrame=(currentFrame+1)%4;
repaint();
display.callSerially(this);//**************************
}
catch(Exception e)
{System.out.println(e);}
}
}
} 展开
我的疑惑是这程序是如何实现轮播的 里面又没有while(true){}或者什么别的循环 是如何做到不停轮播的 我猜测可能是paint()和repaint()同步问题实现的 当我把带有**************的一行注释掉时 它就不轮播了 但是具体不清楚 求解释 谢谢
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Weather extends MIDlet implements CommandListener
{
private Display display;
private WeatherCanvas mycanvas;//对内部类WeatherCanvas的引用 扩展自Canvas
private Command cmdexit=new Command("Exit",Command.EXIT,1);
public Weather()//构造函数
{
display=Display.getDisplay(this);
mycanvas=new WeatherCanvas();
mycanvas.addCommand(cmdexit);
mycanvas.setCommandListener(this);
}
public void startApp() throws MIDletStateChangeException
{
display.setCurrent(mycanvas);
mycanvas.startAnimation();
System.out.println("startApp()");
}
public void pauseApp(){System.out.println("pauseApp()");}
public void destroyApp(boolean un){System.out.println("destroyApp()");}
public void commandAction(Command c,Displayable d)
{
if(c==cmdexit)
{
destroyApp(true);
notifyDestroyed();
}
System.out.println("commandAction()");
}
class WeatherCanvas extends Canvas implements Runnable
{
private Image img[]=new Image[4];
private int currentFrame;
public WeatherCanvas()
{
try{
for(int i=0;i<4;i++)
img[i]=Image.createImage("/"+i+".png");
}
catch(Exception e)
{System.out.println(e);}
currentFrame=0;
System.out.println("WeatherCanvas()");
}
public void paint(Graphics g)
{
g.setColor(0xff00ff);
g.fillRect(0,0,getWidth(),getHeight());
g.drawImage(img[currentFrame],getWidth()/2,getHeight()/2,g.HCENTER|g.VCENTER);
System.out.println("paint()");
}
public void startAnimation()
{
repaint();
display.callSerially(this);
System.out.println("startAnimation()");
}
public void run()
{
try{
Thread.sleep(2000);
currentFrame=(currentFrame+1)%4;
repaint();
display.callSerially(this);//**************************
}
catch(Exception e)
{System.out.println(e);}
}
}
} 展开
3个回答
中智咨询
2024-08-28 广告
2024-08-28 广告
在当今竞争激烈的商业环境中,企业需要不断提高自身的竞争力,以保持市场份额和增加利润。通过人效提升,企业可以更有效地利用有限的资源,提高生产力和效益,从而实现盈利目标。中智咨询提供全方位的组织人效评价与诊断、人效提升方案等数据和管理咨询服务。...
点击进入详情页
本回答由中智咨询提供
展开全部
实现轮播,做到不停轮播的主要是通过线程来实现的, implements Runnable,实现RUN方法,
mycanvas.startAnimation();这里启动线程 Thread.sleep(2000);这是线程睡眠时间,每隔这么长时间自动调运一次run
在MIDP中,所有与用户界面有关的调用都是顺序执行的,如果同时发生,就会放到一个队列里,执行完一个再执行另一个,当调用Display.callSerially(Runnable r)时,他会调用r内部的run()方法,但是他会等到队列中的其他调用都返回后才执行,因此需要所有重绘事件都完成后再做的事情就可以放到run()方法中,并在那些重绘事件的最后面调用Display.callSerially(r)。比如画2帧动画,第二帧要在第一帧确实在手机上画完再执行,那么第二帧的代码可以放到调用r内部的run()方法中
mycanvas.startAnimation();这里启动线程 Thread.sleep(2000);这是线程睡眠时间,每隔这么长时间自动调运一次run
在MIDP中,所有与用户界面有关的调用都是顺序执行的,如果同时发生,就会放到一个队列里,执行完一个再执行另一个,当调用Display.callSerially(Runnable r)时,他会调用r内部的run()方法,但是他会等到队列中的其他调用都返回后才执行,因此需要所有重绘事件都完成后再做的事情就可以放到run()方法中,并在那些重绘事件的最后面调用Display.callSerially(r)。比如画2帧动画,第二帧要在第一帧确实在手机上画完再执行,那么第二帧的代码可以放到调用r内部的run()方法中
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-05-05
展开全部
notifyDestroyed()是退出程序用的,用于一个MIDlet来通知AMS(应用管理软件)它已经进入destroyed状态,implements CommandListener是使用CommandListener接口,以使用按键功能,不然的话,public void commandAction(Command c, Displayable s)
此方法就无法使用了
先后顺序,你可以在每个方法前面打印一些信息出来,然后就能清楚它的顺序了
这些东西能在百度上查到的
下次给分时多给点
另外,你是哪个学校的?
另外,团IDC网上有许多产品团购,便宜有口碑
此方法就无法使用了
先后顺序,你可以在每个方法前面打印一些信息出来,然后就能清楚它的顺序了
这些东西能在百度上查到的
下次给分时多给点
另外,你是哪个学校的?
另外,团IDC网上有许多产品团购,便宜有口碑
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询