/* ダブルバッファリングのサンプル Time-stamp: "2005/10/27 Thu 21:57 hig" Saburo Higuchi 2003 http://www.math.ryukoku.ac.jp/~hig/ プログラム解説等 http://sparrow.math.ryukoku.ac.jp/~hig/course/juniors_2004/05/ */ //#define DOJA //#define MIDP #if DOJA import com.nttdocomo.ui.*; #elif MIDP import javax.microedition.midlet.*; import javax.microedition.lcdui.*; #endif import java.util.Random; #if DOJA #elif MIDP #else // DoJa/MIDP Builder を使われる方へ: // まず, プログラムの先頭で, #define DOJA // などと定義する必要があります. // 以下の define 文は, #if - #endif の中に書かれていますので, // DoJa/MIDP Builder のプリプロセッサでは処理できません. // そこで, #if - #endif はやめて, // いらない方をJava の意味でコメント文にしてください. #endif #if DOJA #define MYALIGN +0 #define MYAP IApplication #define MYSTART start #define MYBLACK Graphics.getColorOfName(Graphics.BLACK) #define MYWHITE Graphics.getColorOfName(Graphics.WHITE) #define MYBLUE Graphics.getColorOfName(Graphics.BLUE) #define MYRED Graphics.getColorOfName(Graphics.RED) #define MYGREEN Graphics.getColorOfName(Graphics.GREEN) #define MYYELLOW Graphics.getColorOfName(Graphics.YELLOW) #define MYMAGENTA Graphics.getColorOfName(Graphics.MAROON) #define MYCYAN Graphics.getColorOfName(Graphics.AQUA) #define MYDIALOG Dialog #define MYLABEL Label #define MYADD add #define MYTEXT Text #elif MIDP #define MYALIGN ,Graphics.LEFT|Graphics.BOTTOM #define MYAP MIDlet #define MYSTART startApp #define MYBLACK 0,0,0 #define MYWHITE 255,255,255 #define MYBLUE 0,0,255 #define MYRED 255,0,0 #define MYGREEN 0,255,0 #define MYYELLOW 255,255,0 #define MYMAGENTA 255,0,255 #define MYCYAN 0,255,255 #define MYDIALOG Alert #define MYLABEL StringItem #define MYADD append #define MYTEXT String #endif /** マルチスレッドのサンプル */ public class DoubleBufferSample extends MYAP { /** 起動するときに呼ばれる メソッド. 必須. */ #if DOJA public void start(){ DoubleBufferCanvas cc=new DoubleBufferCanvas(this); Display.setCurrent(cc); } #elif MIDP public void startApp(){ DoubleBufferCanvas cc = new DoubleBufferCanvas(this); Display.getDisplay(this).setCurrent(cc); } public void pauseApp(){} public void destroyApp(boolean unconditional){} #endif } /** キャンバスを継承するクラス */ class DoubleBufferCanvas extends Canvas implements Runnable { DoubleBufferSample parent; private int width; private int height; final private int size=20; // 正方形の一辺 private int nx; // 横方向の正方形の数 private int ny; // 縦方向の正方形の数 /** コンストラクタ. 最初に1回だけ実行される */ DoubleBufferCanvas(DoubleBufferSample m){ this.parent=m; width=getWidth(); height=getHeight(); nx=width/size; ny=height/size; /* このクラスの run に制御を移す */ Thread th=new Thread(this); th.start(); } public void run(){ while(true){ // 無限ループ // 決り文句. ループの回る速さを決める try { Thread.sleep(20); } catch ( Exception e ) { // 割り込みがあっても何もしない. } repaint(); } } public void paint(Graphics g){ #if DOJA // g.lock(); // ダブルバッファリング g.setColor(MYWHITE); g.fillRect(0,0,width,height); // 画面を消す g.setColor(MYBLUE); for(int y=0; y