コードの記述 その1 StarJetプロジェクト作成

Notepad++のほうに視点を移します。今回は「タイマリスナを追加」にチェックを付けていますので、生成されたソースコードの12,13行目にimport文が2行と、38行目から42行目までタイマー関係のコードが、62,63行目にtimerExpired( )という関数が追加されています。

12,13行目のimport文は「タイマー関係のクラスライブラリを使います」という宣言になります。

38行目から42行目までで、タイマーの設定を行っています。このコードは1000ミリ秒(ちょうど1秒ですね)ごとにtimerExpired( )という関数を呼び出すよ、という記述になっています。1秒間隔では長すぎるので1000を20に書き換えて、呼び出し間隔を20ミリ秒にしておきましょう。

        Timer tm = new Timer();
        tm.setTime(20);
        tm.setRepeat(true);
        tm.setListener((TimerListener)this);
        // tm.start();

呼び出されるtimerExpired( )関数は62行目以降に、中身が空っぽの状態で用意されているわけです。

さて、42行目の tm.start( );の行ですが、スラッシュ2個( // )で始まっていて緑っぽい色になっていますね。このスラッシュ2個は、「そこからこの行の最後までは、コメントとしてプログラムには含めないよ」という意味になります。コメントとはどういう意図でこのコードを書いているのかっていうことを、人間の言葉でわかりやすく説明するためのものなのですが、ここでは、tm.start( )関数を無効にするためにコメントとして扱っています。tm.start( )は無効なので、実はtimer.Expired( )は呼び出されないのでした。

それでは、ソースコードの変更点を1つずつあげていきますので、順番に変更していってください。

まず、6行目から10行目までのimport文を1行にまとめましょう。

import com.nttdocomo.ui.IApplication;
import com.nttdocomo.ui.Canvas;
import com.nttdocomo.ui.Graphics;
import com.nttdocomo.ui.Frame;
import com.nttdocomo.ui.Display;

を以下のように変更します。

import com.nttdocomo.ui.*;

次に38行目を

        // tm.start();

から、以下のように変更します。ようは、「コメントではなくて、有効なコードだよ」と変更するわけです。つまり、timer.Expired( )関数が呼び出されるようになるというわけです。

        tm.start();

以前のGraphDraw.javaのコードでは、描画ルーチンとしてpaint( )関数が使われていましたが、今回は、timer.Expired( ) 関数の中で描画を行うように変更します。現状でtimer.Expired( )関数は20ミリ秒ごとに呼び出されることになっていますので、画面の書き換えも20ミリ秒ごとに行われるということになるわけです。では、42行目以降のpaint( )関数の中身を空っぽにしましょう。

    public void paint(Graphics g) {
        g.lock();
        g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
        g.setColor(Graphics.getColorOfName(Graphics.WHITE));
        g.drawString("Start IApplication", Display.getWidth() / 4, Display.getHeight() / 2);
        g.unlock(true);
    }

の内部の5行分を削除して、以下のようにします。

    public void paint(Graphics g) {
    }

次に53行目以降のtimer.Expired( )関数の中身を記述しましょう。まだ、完全ではないのですが、とりあえず、以下のように変更してください。

    public void timerExpired(Timer source) {
        g.lock();
        g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
        g.unlock(true);
    }

最後に28から30行目の部分に1行追加します。

class MainCanvas extends Canvas implements TimerListener{
    Graphics g = getGraphics();

    MainCanvas() {

一応ここまでで、これまでの変更を保存して、携帯電話エミュレータの「ビルド」ボタンを押してみてください。もし何らかのエラーが表示されるようでしたら、タイプミスと思われますので、変更点をじっくり見なおして、正しく修正してください。


念のため、ここまでのコードを全部表示しておきます。コメント内部の日付などは違っているでしょうが、無視しておいてください。

/*
 * StarJet.java
 *
 * DATE : 2008/08/18 19:14
 */
import com.nttdocomo.ui.*;

import com.nttdocomo.util.Timer;
import com.nttdocomo.util.TimerListener;

/**
 * StarJet
 *
 * @author NAME
 */
public class StarJet extends IApplication {

    public void start() {
        Display.setCurrent((Frame)(new MainCanvas()));
    }

}

/**
 * MainCanvas
 * 
 */
class MainCanvas extends Canvas implements TimerListener{
    Graphics g = getGraphics();
    
    MainCanvas() {
        setSoftLabel(SOFT_KEY_1, "END");
        setBackground(Graphics.getColorOfName(Graphics.BLUE));

        Timer tm = new Timer();
        tm.setTime(20);
        tm.setRepeat(true);
        tm.setListener((TimerListener)this);
        tm.start();
        
    }

    public void paint(Graphics g) {
    }

    public void processEvent(int type, int param) {
        if (type == Display.KEY_RELEASED_EVENT) {
            if (param == Display.KEY_SOFT1) {
                (IApplication.getCurrentApp()).terminate();
            }
        }
    }

    public void timerExpired(Timer source) {
        g.lock();
        g.clearRect(0, 0, Display.getWidth(), Display.getHeight());
        g.unlock(true);
    }
    
}