Java ソースファイルについて |
こうして Java とのおつきあいが始まりましたが、 早いもので、 もう 9 年になります。
講義では使わなくなったものも一部ありますが、 たいていは現在も重宝していて、
時には新たに作ったり、 改訂したりしています。
アプレットのソースファイルは当初より公開しています。
これは、 ページをご覧になって興味を持たれた方が、 同様のものを作ったり、
改造してもっといいものにするときの参考になれば、 と考えてのことです。
ですので、 ここではソースファイルについて、 もう少し詳しい説明をしようと思います。
ここで使っているアプレットの多くは、 スイッチを ON - OFF したり、
電球をつけたり消したり、 画像の一部分を書き換えることが中心になっています。
最初はこれを、 どうすればすっきりと実現できるか、ずいぶん悩みました。
画像をひとつひとつのファイルにしてしまうと、 ゴミみたいなファイルが山のようにできそうで、
その管理の煩わしさを考えただけでウンザリでした。
それを解決してくれたのが、 clipRect() です。
下図は、 スイッチ(リレー)による半加算器
のページで使っているアプレットです。
スイッチをクリックすると動いて、条件が整えば電球が点きます。
下図はこのアプレットで使っている GIF ファイルです。
中心になる回路図も、部分的に表示されるスイッチや電球も、すべてひとつのファイルにまとめてあります。
次の関数 dsp_g() は、 x, y の位置にスイッチ や
電球 を表示します
(ソースファイル
参照)。
public void dsp_g(int x, int y, int n, int c) { int w=0, h=0, ox=0, oy=0; switch(c) { case 0: w= 32; h=17; ox=540; oy= 0; break; // スイッチ case 1: w= 21; h=21; ox=540; oy= 34; break; // 電球 } Graphics gx=getGraphics(); gx.clipRect(x,y,w,h); gx.clearRect(x,y,w,h); gx.drawImage(Img,x-ox,y-(oy+n*h),this); gx.dispose(); }
c = 0 のときはスイッチを、c = 1 のときは電球を、
また n = 0 であれば OFF 、n = 1 であれば ON の状態のものが表示されます。
したがって、 AND 回路のスイッチ A の位置に ON 状態のスイッチを表示するには、
dsp_g( 52, 21, 1, 0);
ON - OFF する電球を表示するには、 変数 Ax に電球の ON - OFF (0: 消灯、 1: 点灯) を代入しておいて、
dsp_g(197, 65, Ax, 1);
を実行すればいいわけです。
入力 A 、B に応じて Ax をしかるべく 0 や 1 にすれば、 ON になったり OFF になったりします。
下図はスイッチや電球を表示すべき位置などを書き加えたものです。
スイッチや電球の座標、 (540, 0) や (540, 34) が dsp_g() 中の ox, oy の値になります。
で、 clipRect() ですが、
gx.clipRect(x,y,w,h);
によって、x, y の位置に 幅 w、高さ h のクリップ領域が設定されます。
ここで、
gx.drawImage(Img, x, y, this);
を実行すると、 x, y に画像が幅 w、高さ h だけクリップされて表示されます。
しかし、それだけでは単に画像の右上の一部が表示されるだけですから、
ここに任意の画像、例えば電球を表示させるためには、 電球の座標 ox, oy だけ移動させなければなりません。
gx.clipRect(x,y,w,h); gx.drawImage(Img,x-ox,y-(oy+c*h),this);
という風に、 です。
下図で OR 回路に、 「点灯している電球」 を表示させたい場合、
dsp_g(496, 70, 1, 0);
で関数をコールすると、
gx.clipRect(496, 70, 21, 21); gx.clearRect(496, 70, 21, 21); gx.drawImage(Img, 496-540, 70-(34+1*21), this);
が実行されて、電球が表示されます。 すなわち、
gx.drawImage(Img, -44, 15, this);
要するに、 clipRect() で開いた窓にぴったり合うように、 絵をスライドさせるわけです。
こうして、 無数の画像ファイルの管理から解放されました。
あとはバカのひとつ覚え、 以後作ったアプレットは、 基本的には同じしくみのものばかりです。
1998年の時点では JDK 1.0.2 が安定しているようでしたので、 アプレットは以来ずっと、
これを使って作っています。
今となっては 1.0.2 ではソースファイルを公開しても、 参考にならないかも知れません。
いずれ機会を見て JDK もバージョンアップするつもりですが、 当分の間、 機会が見えそうにありません。