前々回やったように,ボタンのような 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 クラスのインスタンスかどうかのチェック else if(source instanceof Checkbox){ // その時は チェックボックスの内容を表示 message="Checkbox"+(Checkbox)source; } // イベントのターゲットが TextField クラスのインスタンスかどうかのチェック else if(source instanceof TextField){ // その時は 内容を表示 message="TextField"+(TextField)source; } // 明示的に,書き直しをする repaint(); } }実行してみると分かるが,内部のGUI部品の内側でマウスのボタンを押した時 は,外側のFrameのmouseDownは呼ばれない.