←前頁 | 次頁→ |
---|
その6(アプレット2)
今度の例題は、アプレットというよりは、イベントの扱いかたです。
マウスクリックの処理の仕方を見ておいて下さい。
それと、前回作成したRdxAppletクラスを拡張(extends)して今回は作成します。
JAVAの場合追加機能分だけを作成すればよいということが、わかってくれるかな。
本アプレットは、ロゴをクリックする毎に色を変えます。
/** RDXアプレットプログラム クリックする毎に色を変えます HTML例↓ <applet code="RdxApplet2.class" codebase="." width="320" height="120"> </applet> @author 服部建作 @version 1.0 1999/10/11 */ //アプレットを定義する為のパッケージ(必須) import java.applet.*; //描画関係のパッケージ import java.awt.*; //イベント関係のパッケージ import java.awt.event.*; public class RdxApplet2 extends RdxApplet{ //変数宣言のうち色の宣言を追加 Color[] rainbow = {Color.red, Color.orange, Color.yellow, Color.green, Color.cyan, Color.blue, Color.magenta}; //色情報の配列 int color_no = 0; //次に表示する色番号 //Appletの初期化処理(1度しか呼ばれない) public void init(){ //親クラスと同じ初期処理を行う super.init(); //このアプレットのマウスクリックのイベント処理を登録 this.addMouseListener(new MouseAdapter(){ //MouseAdapterクラスのマウス押下メソッドのみをオーバーライド public void mousePressed(MouseEvent e){ //実際の処理は、アプレットのメソッドとして定義する ChangeColor(); } }); } //マウスイベント時の実際の動作 void ChangeColor(){ ++color_no; if( color_no >= rainbow.length){ color_no = 0; } color = rainbow[color_no]; repaint(); //再描画するAppletクラスのデフォルトメソッド } }複数のjavaファイルのコンパイルの仕方
- 今回は、前回のクラスを参照しているので、コンパイル時にRdxApplet.javaファイルを RdxApplet2.javaファイルと同一ディレクトリに置いてコンパイルします。
- javac RdxApplet2.java とやると、RdxApplet.javaもコンパイルしてくれます。
- RdxApplet.classファイルがあるとRdxApplet.javaをコンパイルしないので ソースファイルがなくても.classファイルさえあれば大丈夫。
- 最新のRdxApplet.javaファイルがあるとRdxApplet.classも作り直してくれるようです。 (JDK1.2.2の場合)
イベント処理について
- JAVAのイベント処理は、リスナーと呼ばれるイベントを処理するルーチン (インターフェース)を登録することで行います。
- よく使うイベントには、ActionEvent,MouseEvent,WindowEvent等があり、 それぞれ、ActionListener,MouseListener,WindowListenerというリスナが対応します。
- でもって、複数のメソッドを持つリスナには、アダプタというクラスが存在し、 上記の例でいうと、MouseAdapter,WindowsAdapterというそれぞれデフォルトの(なにもしない) メソッドを備えたクラスが存在します。
- 丁寧にコーディングすれば、
this.addMouseListener(new MyMouseAdapter(this));となり、たいへんわずらわしい。(ChangeColorメソッドもpublicにしなければならない)
...
public class MyMouseAdapter extends MouseAdapter{ private RdxApplet rdxApp; public MyMouseAdapter(RdxApplet r){ rdxApp = r; } public void mousePressed(MouseEvent e){ r.ChangeColor(); } }- 通常は、例題のように、無名の内部クラスをいきなり定義してしまいます。
- 今回は、イベント内での処理が短いので、
this.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent e){ ++color_no; if( color_no >= rainbow.length){ color_no = 0; } color = rainbow[color_no]; repaint(); //再描画するAppletクラスのデフォルトメソッド } });なんていう風に中身まで一気にコーディングすることもできます。修飾子public,private,protectedについて
- メソッドや変数には、public,private,protectedの修飾子をつけることができます。
- 修飾子をなにもつけない、メソッド・変数はそのクラス定義の内部からのみ 呼出すことができます。
- publicをつけると、他のクラスからも参照することができます。
- privateをつけると、そのクラスのメソッドからしか参照できません。
- protectedをつけると、そのクラスから派生(extends)したクラスからは 参照することができます。(継承されたクラスからのみpublic)
- パッケージという概念があり、(私のイメージ的には同一ライブラリー群) 同一パッケージで参照できるできないという表現をしないと正確ではありませんが、 詳しくは本を読んでね。(私もわかりきっていない)
- 今回、ChangeColor()は、クラス定義の内部サブクラスから参照されるだけなので publicとかつけていません。
superとthisについて
- thisは現在参照しているオブジェクト自身を表します。
- staticでないメッソドは必ず、オブジェクト変数.メソッド()の形式で 呼ばれるので、ドットの前のオブジェクトがthisという名前の引数として デフォルトで渡されると考えると分かり易いかと。
- プログラマ(正確にはコンパイラ)が紛らわしくない場合は、メソッド内で 同じオブジェクトのメッソドや変数にthisを付ける必要はありません。
- 今回はthisをつけなくてもよいのですが、superとの比較でわかり易いようにつけてあります。
(迷った時は、付ければよい。)- superは、親クラスのメソッド・変数を参照したい時に使います。
- 今回のようにオーバーライドしたメソッドの親クラス側を参照したい 時に使います。(extends機能と併せてコードの再利用にたいへん便利)
インターフェース(interface):
←前頁 次頁→
- システム間の情報交換の規約。(と言ってしまえば元も子もない?)
- JAVAではクラスと似たような扱いなのですが、クラスは具体的なオブジェクト の定義、インターフェースは抽象的な定義という違いがあります。
(と言っても多分よくわからない?)- たとえ話として、人間とか熊とかゴキブリというクラスがあったとします。
これらのクラスが「死すべきもの」というインターフェース(寿命)を持つとします。
「死すべきもの」というインターフェースを持てば、平均寿命とか、死亡率
と言ったクラス間で共通のメソッドを定義することができます。
逆に、プログラムコードというクラスに寿命が定義できれば、それは「死すべきもの」 というインターフェースを持つことになります。
となれば、プログラムの平均寿命や死亡率を求めることができ、保険金メソッド だって実行できちゃう。というわけです。- わかるかな?わっかんねーだろうな。←古いギャグです。!^_^