[Waba WORLD] [Wabasoft] 開発:[FAQ|仕様|How-to Papers]
簡単なプログラムの書き方

はじめに、Sun JDK, Microsoft SDK for Java, Microsoft Visual J++, Symantec Cafe, IBM Visual AgeなどのJava開発ツールを準備します。

次に、Wabasoft社のウェブサイトから Waba SDKをダウンロードします。 Waba SDKはJava上でWabaプログラムを動かすためのブリッジクラス(bridge class) を含んでいます。

Wabaプログラムを書くためにJava開発ツールとWaba SDK以外に必要なツールは ありません。

ダウンロードしたWaba SDKを展開すると、その中にサブディレクトリ "classes"が見つかります。このディレクトリは標準的なJava開発ツールを 使って、Wabaプログラムを開発しデバッグするためのWabaブリッジクラス を含んでいます。

環境変数CLASSPATHにその"classes"ディレクトリを設定します。

これはWindows上でCLASSPATHに現在のディレクトリと"classes" ディレクトリを設定する例です。CLASSPATHはクラスのありかをJavaに知らせます:

> set CLASSPATH=\wabasdk.10b8\classes;.
この例ではコマンドラインからプログラムを開発することを 仮定しています。もしグラフィカルな開発ツールを使っているなら、 開発ツールのオプションの中からCLASSPATHの設定を見つけて、 それに"classes"ディレクトリを設定する必要があります。

コマンドラインからJavaを使ってWabaプログラムを実行する場合 (上記の例のように . を使って)現在のディレクトリを含めるべきです。 UNIX上で実行する場合は、CLASSPATHを設定するための区切り記号が Windowsのようにセミコロンではなくコロンであることを忘れないでください。

プログラムを書く

"HelloWorld"プログラムを書いてみましょう。 ユーザインターフェイスをもつ全てのWabaプログラムはメインウインドウをもちます。 Wabaプログラムのメインウインドウを定義するクラスは"MainWindow"と呼ばれます。

HelloWorldプログラムは画面上に"Hello World"を表示します:

import waba.ui.*;
import waba.fx.*;

public class HelloWorld extends MainWindow
{
public void onPaint(Graphics g)
  {
  g.setColor(0, 0, 0);
  g.drawText("Hello World", 0, 0);
  }
}
上記のプログラムで最初に行われていることはwaba.uiとwaba.fxパッケージの インポートです。 これらのパッケージはユーザインターフェイスをもったプログラムを作るのに 必要なユーザインターフェイスとエフェクト(effect)のクラスを含んでいます。

onPaint()ルーチンはMainWindowがその表示面を描画する ときに呼ばれます。onPaint()ルーチンはウインドウの描画に使われる Graphicsオブジェクトを引数として呼ばれます。

接頭語"on"で始まるメソッドは、あなたが表示面を描画したりイベントを 操作する処理を行うために上書きできるメソッドです。この接頭語は どのメソッドを実装すべきか、これを行うためにどのメソッドを呼ぶのかを 決定することを助けます。

onPaint()メソッドが呼ばれるとき、描画の前に背景をクリアする必要が 無いように背景がすでに描画されています。

onPaint()メソッドの1行目は現在の色を黒に設定するメソッド呼び出しです。 色は赤、緑、青の値で表現されます。それゆえ現在の色を黒に設定する メソッド呼び出しはg.setColor(0, 0, 0)となります。

色の設定後、"Hello World"はウインドウの右上である座標(0, 0)に描画されます。

プログラムをテストする

Java上でHelloWorldを実行するには以下を実行します。

> java waba.applet.Applet HelloWorld

HelloWorldはJavaアプリケーションではないので、それを直接実行できない ことに注意してください。waba.applet.Appletクラスは Wabaアプリケーション(ここではHelloWorld)を起動するmain()を与えます。

HelloWorldをJavaアプレットとして実行することもできます。 これを行うにもwaba.applet.Appletクラスを使います。 アプレットタグは次のようになります:

<applet code=waba/applet/Applet.class
 width=160 height=160>
<param name=appClass value="HelloWorld">
</applet>
上記のタグを埋め込んだ.htmlファイルを使って、 そのアプレットを表示します:
> appletviewer <filename>.html
プログラムをPalmPilotへインストールする

Java上でappをコンパイルしデバッグできたら、 それを二つのステップでPalmPilotへ移動します。

appをPalmPilotへインストールするプログラムはWabaSDKに含まれています。 "exegen"と"warp"がそのためのプログラムです。WabaSDK中のexegenとwarpは Windows (Windows95/98そしてNT)上でのみ動作します。

WabaSDK中のexegenとwarpプログラムはWindows上でのみ動作しますが、 他のプラットフォームで使えるバージョンもあります。もしSun Solarisや Linuxを使っているなら、これらのバージョンへのリンクがある 良くある質問とその答えを見てください。

exegenプログラムはアプリケーションを起動(launch)するためのPalmPilot実行 ファイルを生成します。Windows CEのための.lnkファイルも生成しますが、 PalmPilotの開発だけを行う場合はそのファイルを無視できます。

exegenプログラムは、アプリケーション名、アイコン、 メモリ量を指定するためのパラメータを持ちます。 メモリ量はプログラムが実行されるときに割当てられる量です。

プログラムに"Hello"という名前をつけると、"Hello.prc"という PalmPilot実行可能ファイルが生成されます。 この例ではプログラムのアイコン(黒い四角形)とメモリ量にデフォルト値を 使っています:

> exegen Hello HelloWorld Hello
1番目のパラメータ"Hello"は出力ファイルの名前です。 .prcは自動的に付加されます。2番目のパラメータ"HelloWorld"は MainWindowクラスの名前です。

3番目のパラメータ"Hello"はプログラムのクラスを含むwarpファイルの名前です (.pdbは自動的に付加されます)。プログラムのクラスを含むwarpファイルの作り方は 少し後で説明します。

PalmPilotの開発に熟知している方は、クリエータID(creator id)を 指定しないことに気づくでしょう。IDはプログラムの名前に基づいて 自動的に生成されます。/qオプションを指定せずにexegenを実行すると、 生成されたクリエータIDを見ることができます。

Hello.prcファイルが生成されたら、Pilotインストールツールを使って それをPalmPilotへインストールできます。すぐにHello.prcをインストールして、 それを動かしてみたいでしょう。しかしHello.prcは、まだアプリケーションの クラスをインストールしていないので、クラスが見つからないという メッセージを表示するでしょう。

また、WavaVmがそのPalmPilotにインストールされていなければ、 WavaVMが見つからないというエラーメッセージが表示されるかもしれません。 プログラムを実行するには、PalmPilotにインストールされたWabaVMが必要です。 WabaVMはWabaSDKの一部ではありません。WabaVMはこのウェブサイトから ダウンロードできます。まだインストールしていなければ、作業を続ける前に WabaVMをダウンロードしてインストールしてください。

次に、アプリケーションのクラスを含めたファイルを生成するために "warp"プログラムを使います。クラスはこのプログラムによって変更されません。 それらは単にPalmPilot PDBファイルにパッケージされるだけです。 これはWARP(Waba Application Resource Package)ファイルとして知られています。 warpファイルはクラス以外のものを含めることができます。事実、それらは いくつかのタイプのファイルを含むことができます。

ここではHelloWorldクラスを含むHelloプログラムに対するwarpファイルを生成します:

> warp c Hello HelloWorld.class
warpファイルにつける名前は、exegenを使って起動プログラムを作るときに指定した warpファイルの名前を一致していなければなりません。これが一致してないと、 起動プログラムはプログラムのクラスを含むwarpファイルを見つけることが できないでしょう。

上記の例ではPDBファイルに一つのクラス"HelloWorld.class"を追加した。 PDBファイルにカレントディレクトリにある全てのクラスを追加するには 次のコマンドラインも使えます:

> warp c Hello *.class
Hello.pdbファイルを生成した後、インストールツールを使ってPDBファイルをPalmPilotへ インストールできます。Helloアイコンをクリックすると、プログラムは実行されます。

一つ注意として、Pilotはデフォルトではメインメニュに表示されるアプリケーションの リストを更新しません。 多くの場合、(Securityなど)他のプログラムへ切り替える必要があり、それから 新しいプログラムがメインメニューに現われるように切り替える必要があります。

また、Pilot上に既にあるWabaプログラムを更新するには、新しいクラスをインストール するためにPDBファイルだけを再インストールします。PRCファイルは 再インストールする必要はありません。もちろん、プログラムの名前やアイコン、 メモリ量などを変えない場合に限ります。

Windows CEデバイスへプログラムをインストールする

HelloWorldプログラムを作成し、それをPalmPilotへインストールすることができました。 次はそれをWindows CEデバイスへインストールしてみましょう。その手順は PalmPilot上でインストールした手順と非常に似ています。

Windows CEでは二つのファイル: 起動プログラムファイルとプログラムのクラスを含むファイル を生成する必要があります。Windows CEでこれらのファイルをつくるために、 PalmPilotのために使ったプログラムと同じ"exegen"と"warp"を使います。

exegenとwarpプログラムは一度にPalmPilot用ファイルとWindows CE用ファイル の両方を自動的につくります。

PalmPilot用起動実行ファイルを作るのにexegenプログラムを実行すると、 Windows CE用.wrpファイルも作られます。.wrpファイルはWindows CE用warpファイルです。

したがって、exegenとwarpプログラムを実行することによって、 すでに.lnkと.wrpが作られているなら、Windows CEデバイスへプログラムを インストールする準備ができています。まだwarpとexegenを実行していないなら、 以下を実行します。

> exegen Hello HelloWorld Hello
> warp c Hello HelloWorld.class

これらはPalmPilot用起動ファイルとwarpファイルをつくるために使ったコマンドと 同じです。

プログラムをWindows CEデバイスへインストールするために、デバイス上の "\Program Files"にHelloディレクトリを作り、そこへHello.wrpをコピーします。 それからHello.lnkファイルをスタートメニューを含むディレクトリへコピーします。

デフォルトでは、生成された.lnkファイルはプログラムの.wrpファイルを見つけるために "\Program Files"ディレクトリ中でプログラムと同じ名前のディレクトリを探します。 .wrpファイルをその他の場所に置く場合は、exegenを使うときに/pオプションをつけて 異なるディレクトリを指定することができます。

プログラムを実行するにはWindows CEデバイスにインストールされたWabaVMも必要です。 Windows CE用WabaVMはこのウェブサイトのダウンロードセクションからダウンロードできます。

"Microsoft CE Platform SDK"のWindows CEエミュレータを使っている場合は、 .lnkと.wrpをエミュレータへコピーするために"empfile"プログラムを使います。

ユーザ入力

最初のサンプルプログラムは画面表示だけでした。 この例ではペンやキー入力などのイベントの操作方法を示します。

ユーザが画面に落書きできるScribbleと呼ぶプログラムを書いてみましょう。 以前と同様にMainWindowのサブクラスを作ることによってはじめます。

import waba.fx.*;
import waba.ui.*;

public class Scribble extends MainWindow
{
public void onPaint(Graphics g)
  {
  g.setColor(0, 0, 0);
  g.drawText("Scribble 1.0", 0, 0);
  }
}
次にいくつかの変数を追加します。ユーザはペンを動かしたとき、その位置から 描画できるようにペンを置いたxとyの位置を記憶する必要があります。 変数lastXとlastYに最後の位置を保存します。

描画のためのGraphicsオブジェクトも必要です。 onPaint()メソッド"以外で"描画する必要があるので、 描画のために独自のGraphicsオブジェクトをつくる必要があります。

public class Scribble extends MainWindow
{
Graphics g;
int lastX, lastY;

public Scribble()
  {
  g = new Graphics(this);
  }
次に、ユーザがペンを押しつけたりドラッグしたときに呼ばれるイベントハンドラを 追加します。ユーザがペン(やマウス)を押しつけたりドラッグすると、 onEvent()メソッドがPenEventを引数として呼ばれます。

onEvent()メソッドはキーイベントに対しても呼ばれますが、この例では PEN_DOWNとPEN_DRAGだけを取り扱います。

public void onEvent(Event event)
  {
  if (event.type == PenEvent.PEN_DOWN)
    {
    PenEvent pe = (PenEvent)event;
    lastX = pe.x;
    lastY = pe.y;
    }
  else if (event.type == PenEvent.PEN_DRAG)
    {
    PenEvent pe = (PenEvent)event;
    g.drawLine(lastX, lastY, pe.x, pe.y);
    lastX = pe.x;
    lastY = pe.y
    }
以上で完成です。さあ画面に落書きしてみましょう。

以下のコードは画面をクリアするボタンを追加します:

public class Scribble extends MainWindow
{
Graphics g;
int lastX, lastY;
Button clearB;

public Scribble()
  {
  g = new Graphics(this);

  clearB = new Button("Clear");
  clearB.setRect(0, this.height - 15, 40, 15);
  add(clearB);
  }

public void onEvent(Event event)
  {
  if (event.type == ControlEvent.PRESSED)
    {
    if (event.target == clearB)
      repaint();
    }
  else if (event.type == PenEvent.PEN_DOWN)
...
このコードではアプリケーションウインドウをクリアし再描画するのに repaint()を呼んでいます。repaint()メソッドはクリアボタンを含んでいる ウインドウ上の全てのものを再描画します。

ユーザインターフェイスがさらに複雑になれば、ウインドウ全体を再描画 したくないかもしれません。そこに描画し、そのコントロールだけを再描画する クリアボタンをもったコントロールを作ったほうが良いでしょう。

WabaSDKに含まれるScribbeの例はそのアプローチを採用しています。 "DrawArea"カスタムコントロールは、ユーザがそこに落書きし、 クリアボタンがアプリケーションウインドウ全体ではなくそのコントロールだけを 再描画するように作られます。

このプログラムをPalmOSやWindows CEで動かすと、ボタンの見え方が異なることに 気づくでしょう。Wabaユーザインターフェイスクラスは白黒画面用とカラー (グレイスケール)画面用の2つの見え方をもっています。

PalmOSでは白黒画面用の見え方が、Windows CEではカラー画面用の見え方が 使われます。

Java上でプログラムを開発したり実行する場合、白黒画面用の見え方が使われます。 カラー画面用の見え方を使うには、"java"コマンドラインに"/c"オプションを 指定します。

表示ウインドウの高さを変えるには"/w"、幅を変えるには"/h"を使います:

> java waba.applet.Applet /color /w 200 /h 300 Scribble

おわりに

longとdouble型、スレッドや例外が使えないことに注意してください。 さもなければあなたのWabaプログラムはネイティブなWava仮想マシン上で 動かないでしょう。

Wabaは遅い動作やメモリの大量消費がプログラミングを邪魔しないことに 注意することも重要です。小さなデバイスのためにプログラミングする場合、 依然としてデバイスの制限を心配する必要があります。

メモリを節約するためにできる限りわずかなクラスとオブジェクトを使うことが 一番良い方法です。一方、読みやすくシンプルなコードを保持することも重要です。

Think small and simple!


原文:Copyright (c) 1999 Wabasoft. Waba, WabaVM and WabaSDK are trademarks of Wabasoft Inc.