前々回やったように,ボタンのような GUI部品に対するユーザ入力は,GUI部品 に関連づけられた Event Listenerによっておこなわれるが,ボタンなどの部 品に関しては,MouseEventのような低レベルのイベントではなく, ActionEventというイベントで処理する.
ボタンのような GUI部品では,mousePressを受け取ってActionEventに変換す るだけだが,テキストフィールドのようなものでは,キー入力やマウスを使っ た編集作業は内部で処理して,リターンキーが押された時に始めて, ActionEventを発生するようになっている.
また,チェックボックスのように,イベントを発生させるよりは,状態を内 部で保持しておいて,他のGUI部品を利用したイベント発生時に内部をチェッ クする使い方が主だというGUI部品もある.ただし,チェックボックスの内部 状態が変化した時に,ItemEventイベントを発生するので,それを受け取る Event Listenerを作っておけば,イベントを捕まえることができる.
import java.awt.*;
import java.awt.event.*;
public class GUITest2 extends Frame implements ActionListener,MouseListener{
// 画面に表示するメッセージの変数.空文字列 "" で初期化する必要がある.
String message="";
Button button1, button2, button3;
Checkbox check1, check2;
TextField textField;
GUITest2(){
setLayout(new FlowLayout());
// 「Check1」というラベルを持つチェックボックスを作り,window中に配置
add(check1=new Checkbox("Check1"));
// 「Button1」というラベルを持つボタンを作り,window中に配置
add(button1=new Button("Button1"));
button1.addActionListener(this);
// ラベルを持たないチェックボックスを作り,window中に配置
add(check2=new Checkbox());
// ラベルを持たないボタンを作り,window中に配置
add(button2=new Button("Button2"));
button2.addActionListener(this);
// 幅10文字分のTextField(テキスト入力用領域)を作り,window中に配置
add(textField=new TextField(10));
textField.addActionListener(this);
add(button3=new Button("Quit"));
button3.addActionListener(this);
// windowのサイズを 500 x 500 に変更
setSize(500,500);
// windowを表示する.
setVisible(true);
addMouseListener(this);
}
public static void main(String args[]){
// GUITest2クラスのインスタンスを生成
GUITest2 window=new GUITest2();
// window内部に GUI部品を置くときのレイアウトをFlowLayoutに指定
}
public void paint(Graphics g){
// 以後の描画,塗り潰しの色を黄色に指定
g.setColor(Color.yellow);
// (0,0)から幅500,高さ500で描画
g.fillRect(0,0,500,500);
// 以後の描画,塗り潰しの色を黒に指定
g.setColor(Color.black);
// 文字列 message の内容を(50,100)の座標から描画
g.drawString(message,50,100);
}
// 内部の GUI 部品以外のところでマウスが押された時に呼ばれる.
public void mousePressed(MouseEvent e){
int mx=e.getX(), my=e.getY();
// マウスが押された時に渡される Event と押された時のX座標,Y座標を表示
System.out.println("mouseDown("+e+","+mx+","+my+")");
// イベントの処理をおこなったことを表すため true を返す
}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
// GUI部品がイベントを処理して,その部品を含むクラスに処理結果を渡す
// 際に呼ばれる.
public void actionPerformed(ActionEvent e){
// イベントのターゲットは GUI 部品のオブジェクトだが,
// これが Button クラスのインスタンスかどうかのチェック
System.out.println(e);
Object source=e.getSource();
if(source instanceof Button){
String label=e.getActionCommand();
// 押されたボタンのラベルが"Button1"かどうかのチェック
if(label.equals("Quit")){
System.exit(0);
}
else if(label.equals("Button1")){
// その時は表示する messageは "Button1"
message="Button1," + "Check1 is "+check1.getState();
}
else{
// それ以外の時は表示する messageは "Unknown Button"とする.
message="Button2," + "Check2 is "+check2.getState();
}
}
// イベントのターゲットが Checkbox クラスのインスタンスかどうかのチェック
// を入れたが,チェックボックスの内容が変化した時に起きるのは
// ItemEventなので削除
// else if(source instanceof Checkbox){
// // その時は チェックボックスの内容を表示
// message="Checkbox"+(Checkbox)source;
// }
// イベントのターゲットが TextField クラスのインスタンスかどうかのチェック
else if(source instanceof TextField){
// その時は 内容を表示
message="TextField"+(TextField)source;
}
// 明示的に,書き直しをする
repaint();
}
}
実行してみると分かるが,内部のGUI部品の内側でマウスのボタンを押した時
は,外側のFrameのmouseDownは呼ばれない.