libro
www.tuyano.com
初心者のためのJava SEプログラミング入門

グラフィックの描画 (6/6)

作成:2010-01-14 16:47
更新:2010-01-14 16:49

■MouseListener/MouseAdapterを使う

今回使うのは「マウスリスナー」というリスナークラスです。これは、マウスをクリックしたりした時のイベント処理を行なうためのものです。このマウスリスナー、「MouseListener」というものをimplementsして作るんですが、実は他にも作り方があります。「MouseAdapter」というものをextendsして作ることもできるのです。今回はこちらを使っています。

なんで2つもあるのか?ということを説明すると長くなってしまいます。実をいえばMouseListenerにはたくさんのイベントに対応したメソッドが用意されているんです。「マウスを押し下げた」「離した」「クリックした」というような具合に、それぞれの動作に応じて細かくメソッドが分かれているんですね。で、implementsでインターフェイスクラスを組み込んだ場合は、用意されているメソッド全部を書かないといけないって決まりになってます。

今回は「クリックした時」の1つだけしか使いませんから、全部書くのは面倒です。そこでこういうときのために、あらかじめ全部のメソッドを書いてある「MouseAdapter」というクラスを最初から用意しておいた、というわけなのです。――まあ、このへんはちょっとわかりにくいかも知れませんから、「2つあって、MouseListenerのときは全部のメソッドを書かないといけないのでMouseAdapterのほうが便利」ということだけ覚えておきましょう。

さて、このMouseAdapterをextendsして作ったのが「Clicked」というリスナークラスです。これのインスタンスを作り、addMouseListenerでCanvasインスタンスに組み込んでおけば、Canvasをクリックするとイベント処理が行なわれるようになりますね。

で、肝心のClickedクラスを見てみましょう。ここでは「mouseClicked」ってメソッドが用意されてます。これがマウスをクリックした時に呼び出されるものなんですね。では、mouseClickedメソッド内を見てみましょう。(下リスト参照)

これは……、ちょっと難しそうですねえ。順番に見ていくことにしましょう。まず、最初の「getGraphics」です。これは、そのコンポーネントに組み込まれているGraphicsインスタンスを返すメソッドです。これで、mc(Canvasインスタンス)のGraphicsを取り出しているんですね。

そしてその次にある「getX」「getY」というのが、イベントが発生した時のマウスの縦横の位置を取り出しているところです。このmouseClickedメソッドではMouseEventというイベントのインスタンスがパラメータとして渡されていますが、これはgetXとgetYでマウスの位置を調べることができるようになってるんですね。

○乱数の発生○
その次にある3行は、3つの乱数の値を取り出している部分です。「Math.random」っていうメソッドがあるのがわかりますか? これが乱数を返すメソッドなんですね。Mathっていうのは、数値関数を集めた、ちょっと特別なクラスなんです。この中にある関数類は、こんな具合に「Math.○○」として呼び出すことができます。

問題は、「このrandomで返すのは0~1の間の乱数である」ということなんです。つまり、実数(double)の値なんですね。でもColorで設定するRGBの値は整数(int)です。Javaでは、タイプが違う値はそのままじゃ使えません。

そこで、「実数の値を整数として取り出す」ということが必要になります。それが、その前についている (int) ってやつです。これは「キャスト(型変換)」ってもので、ある値を別のタイプに変換する時に使います。例えば、「(double)x」とかすると、xの値をdouble(つまり実数)として取り出したりできるんですね。今回は(int)ですが、これは整数として取り出します。少数以下は切り捨てられちゃうんです。

randomは0~1の乱数ですから、これを255倍すれば、0~255の(実数の)乱数が得られるわけです。で、これを(int)で整数にしておさめてやれば、0~255の整数の乱数が得られる、というわけです。わかりました?

 後は、得られた乱数を使ってnew Colorし、それから得られたマウスの位置の値を使ってfillOvalしているだけです。――おっと、最後に1つ重要なのを忘れてた。「dispose」です。

○Graphicsのdispose○
これは、「Graphicsを消去する」メソッドです。Javaは、基本的にインスタンスは作りっぱなしでいいんですが、AWTのGraphicsだけは、使い終わったら「dispose」というので破棄するのがマナーになってます。まあ、そのまま放っておいても、プログラム終了すればちゃんと消えるんであんまり心配はないんですが…。

なんでGraphicsだけdisposeしないといけないか?というと、Graphicsは「ネイティブ環境のリソースを消費する」からです。Javaのクラスは、基本的に仮想マシンで動きますから、仮想マシン内でのみメモリを消費します。が、AWTのGraphicsは、実はJava仮想マシンの外側にある、ネイティブ環境(例えばWindowsとかMac OS Xとかそういうの)にある機能を呼び出して描画をしているのです。このため、使い終わった後そのままにしておくと、ネイティブ環境のメモリなどをどんどん消費してしまうのです。そこで、使い終わったら必ずdisposeする、というのがマナーになっています。

といっても、これはgetGraphicsでインスタンスを取り出した場合には、です。paintメソッドの引数で渡されるGraphicsなどはdisposeしません。というか、しちゃダメです。


…というわけで、なんかだいぶ「オブジェクト指向プログラミング」って感じになってきましたね(笑)。よりオブジェクティブになるにつれ、なんだかわけわかんないという状態になってきます。とりあえず、ここまでのソースコードを実際に打ち込んで動かしてみて、それから自分なりにいろいろとカスタマイズしていじってみてください。何度か実際に動かしてみれば、Graphicsという抽象的で目に見えないオブジェクトがどういう働きをしているか、なんとなくイメージがつかめてくると思いますから。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

		public void mouseClicked(MouseEvent ev){
			Graphics gr = mc.getGraphics();
			int x = ev.getX();
			int y = ev.getY();
			int r = (int)(Math.random() * 255);
			int g = (int)(Math.random() * 255);
			int b = (int)(Math.random() * 255);
			gr.setColor(new Color(r,g,b));
			gr.fillOval(x  - 10,y - 10,20,20);
			gr.dispose();
		}
※関連コンテンツ

「初心者のためのJava SEプログラミング入門」に戻る