戻る Java ソースファイルについて



私が、情報処理概論の講義で Java を使ってみようと思いたったのは 1998年3月のことです。

講義の計画を立てながら、 「黒板に書いたり消したりではなく、 OHP でもなく、 もっと、 何か…」 と考えていたときに、 「説明したいことを絵にするプログラムを作ってみては?」 という考えが浮かびました。

しかし、「C で書くのか?」 と思うと気が重くて躊躇していた頃、 Java に目が止まりました。

C だと簡単なものでも結構大きな exe ファイルになってしまいますが、 Java のバイトコードはソースファイルとほぼ同サイズのようです。

Java の "Write Once, Run Anywhere" という理念にも魅せられました。

また 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 もバージョンアップするつもりですが、 当分の間、 機会が見えそうにありません。





情報処理概論 に戻る   目次 に戻る   用語解説 に戻る   戻る


update: 2007.08.29  address