ボタンの配置

ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin Expander等)を使って解凍して下さい。

コンポーネントの配置

ボタンとパネル等、GUI部品をまとめてコンポーネントと言います。

ボタンの作成

ボタンは、JButtonクラスをインスタンス化して作成します。
コンストラクタの引数に文字列を与えると、ボタンに表示するキャプションになります。

JButton leftButton; //オブジェクトの宣言
leftButton = new JButton("左"); //インスタンス化

作成したボタンは、パネルに載せます。
パネルのオブジェクト名を「myJPanel」とすると、

myJPanel.add(leftButton);

ボタンが押されたかどうかを監視するリスナの「ActionListener」をimplementsします。
そして、此のイベントが発生した時呼び出されるメソッド「actionPerformed」にボタンが押された時、するべき動作を定義します。
最後に、此のイベントを有効にします。
此処では、パネルクラスに「ActionListener」をimplementsする事にしましょう。
下記の様に書きます。

leftButton.addActionListener(myJPanel);

此等の一連の記述は、プログラムの初期化処理で行います。
アプレットの場合は、init()メソッドの中に書きます。

ボタンイベントの動作

目玉は、パネルに描きます。
此の時、変数「muki」が「0」で有れば左向き、「1」で有れば右向きに書く事にしましょう。
ボタンが押されたら、「muki」をそれぞれセットして、再描画を要求します。
どちらのボタンが押されたかを調べるには、getSourceメソッドを使います。
此のメソッドが、ボタンオブジェクトと「muki」の値が等しいかどうかを比較するのです。

JButton curButton = (JButton)e.getSource();
if(curButton == leftButton)

ボタンクラスの継承

ボタンクラスを継承し、新しいクラスを作ります。
此処に「ActionListener」をimplementsして、ボタンが押された時の処理を書いておきます。
こうすると、それぞれインスタンス化されたオブジェクトをターゲットに「ActionPerformed」が呼び出されます。
此処で、ボタンが押された処理とは、

mukiにどちらが押されたかを設定
再描画

上記の2つです。
オブジェクトに「此のボタンが押されたら設定する数値」をフィールドとして保持しておけば、ActionPerformedメソッドの中では、唯フィールドの数値を「muki」に代入すれば良く、どちらのボタンが押されたのかを判定する必要が無くなります。

再描画の仕組み

ボタンが押された時の処理「actionPerformed」は、ボタンを継承したクラスに書きます。
其の為には、此のクラスに「ActionListener」をimplementsしなければなりません。
此処で1つ大きな問題が有ります。
此のクラスのメソッド「actionPerformed」の中で、

repaint();

を行って再描画を要求すると、自分のクラスつまりボタンに対して再描画が要求されて終うのです。
此の侭では、目玉が描かれているパネルを再描画出来ません。
再描画させたいクラスと、再描画を要求するクラスが異なっているのです。
其れを解決する為には、repaintメソッドのターゲットとしてパネルを設定する必要が有ります。
其れには、色々な方法が有りますが、此処では「ターゲットとなるコンテナをオブジェクト内に保持」と言う汎用性の高い方法を紹介します。
ボタンのオブジェクトをインスタンス化する時に、此のボタンを載せるパネルのオブジェクトを与えて、其れをボタンクラスのフィールドに保持しておくと言う方法です。

ボタンを拡張したクラスのコンストラクタの役割

ボタンを拡張したクラスを「DirectButton」と名付ける事にしましょう。
DirectButtonクラスのコンストラクタは、以下の様な役割が有ります。

「super()」呼び出してボタンを作成
此のボタンが押された時に「muki」に設定する値を保持
此のボタンが押された時に再描画を要求するコンテナを保持
イベントを有効に

MedamaSwing.javaでは「init()」に書いていたボタンのイベントを有効にするメソッド「addActionListener」を、此処ではDirectButtonクラスのコンストラクタに書きます。
インスタンス化する為にコンストラクタが呼び出される度に此のメソッドが、それぞれのオブジェクトをターゲットに呼び出されますから、アプレットの「init()」の中で、それぞれ「addActionListener」を書く必要が無くなります。
以上の事から、コンストラクタの引数としては、「ボタンに表示される文字列」と「再描画を要求するコンテナ」と「mukiに設定する値」を与える必要が有ります。

ソース ダウンロード
MedamaSwing.java Medama11.zip MedamaSwing.html
MedamaSwingA.java MedamaSwingA.html

戻る