第 2 回 GUI コンポーネントのイベント処理 GUI Component Event Handling キーポイント イベント イベントリスナー イベント処理とは何か? ActionEventとActionListenerについて ItemEventとItemListenerについて TextEventとTextListenerについて KeyEventとKeyListenerについて AdjustmentEventとadjustmentListenerについて WindowEventとWindowListenerについて MouseEventとMouseListenerについて 1
イベント処理 (Event Handling) とは フレームにコンポーネントを配置するだけでは 機能を持たない コンポーネントが何のイベントを受け取るのか指定することにより GUI に機能を持たせることができる また イベントを受け取った際の処理をリスナーと呼ばれるクラスに記述することにより イベントを処理する Button object(s) ActionEvent ActionListener ActionEvent 2
ユーザー > インタフェースー > イベントリスナーー > アクション イベント発生 イベント取得 イベント処理 TextField object(s) イベント ActionListener アクション actionperformed() { ユーザ操作 Button object(s) ItemListener itemstatechanged() { Choice object(s) TextListener textvaluechanged() { Checkbox object(s) ユーザがボタン 6 をマウスでクリックした ボタン 6 がクリックされたことを ActionListener が認識する イベント処理メソッド actionperformed を呼ばれ イベント処理 ( この場合は電卓のテキストフィールドに 6 を表示 ) する
パッケージ java.awt.event( クラス ) クラス階層図 ActionEvent java.lang.object ContainerEvent ItemEvent java.util.eventobject TextEvent FocusEvent java.awt.awtevent AdjustmentEvent ComponentEvent PaintEvent WindowEvent java.lang.object +--java.util.eventobject +--java.awt.awtevent +--java.awt.event.actionevent InputEvent KeyEvent MouseEvent AWT イベントクラス 次に説明します
パッケージ java.awt.event ( インターフェース ) インターフェース階層図 抽象メソッド!! java.lang.object ActionListener ItemListener public void actionperformed(actionevent e) public void itemstatechanged(itemevent e) java.util.eventlistener TextListener KeyListener WindowListener public void textvaluechanged(textevent e) public void keytyped(keyevent e) public void keypressed(keyevent e) public void keyreleased(keyevent e) public void windowclosing(windowevent e) AWT イベントリスナーインタフェースクラス 次に説明します AdjustmentListener MouseListener MouseMotionListener public void adjustmentvaluechanged(adjustmentevent e) public void mouseclicked(mouseevent e) public void mousepressed(mouseevent e) public void mousereleased(mouseevent e) public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) public void mousedragged(mouseevent e) public void mousemoved(mouseevent e)
GUI コンポーネント イベントクラス イベントリスナーとイベントの処理メソッド TextField Button ActionEvent ActionListener public void actionperformed(actionevent e) Choice Checkbox List ItemEvent ItemListener public void itemstatechanged(itemevent e) TextArea TextEvent TextListener public void textvaluechanged(textevent e) Key KeyEvent KeyListener public void keytyped(keyevent e) public void keypressed(keyevent e) public void keyreleased(keyevent e) Window WindowEvent WindowListener public void windowclosing(windowevent e) Scrollbar AdjustmentEvent AdjustmentListener public void adjustmentvaluechanged(adjustmentevent e) public void mouseclicked(mouseevent e) Mouse MouseEvent MouseListener public void mousepressed(mouseevent e) public void mousereleased(mouseevent e) public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) MouseMotionListener public void mousedragged(mouseevent e) public void mousemoved(mouseevent e)
ActionEvent の作成 イベント処理の流れを簡単に見るために ActionEvent を作成する import java.awt.event.*; // イベントをインポート import javax.swing.*; public class Practice02 { public static void main(string[] args){ JButton btn = new JButton("button"); // 対象となるコンポーネント ( この場合はボタン ) に addactionlistener メソッドを実行する // また 引数にはイベントを処理するリスナーのクラスを指定する btn.addactionlistener(new btnlistener()); //ActionEvent を処理するリスナーの実装 (ActionListener をインプリメントする ) class btnlistener implements ActionListener{ // イベントが発生した時に actionperformed メソッドが呼び出される public void actionperformed(actionevent e){ // ここにイベント処理を記述 7
ActionEvent の作成 (2) イベントを呼び出す元のクラスに ActionListener をインプリメントすることもできる import java.awt.event.*; import javax.swing.*; public class Practice02 implements ActionListener { Practice02(){ JButton btn = new JButton("button"); //ActionListener をインプリメントしているため 自クラスを渡す btn.addactionlistener(this); public void actionperformed(actionevent e){ // ここに処理を記述 8
ActionEvent の作成 (3) 実際にボタンのイベント処理を確認してみる public class Practice02 extends JFrame implements ActionListener { public static void main(string[] args){ new Practice02("EventTest"); public Practice02(String title){ settitle(title); setsize(300,350); setlocation(400,200); setlayout(new FlowLayout()); JButton btn1 = new JButton("button1"); btn1.addactionlistener(this); add(btn1); JButton btn2 = new JButton("button2"); btn2.addactionlistener(this); add(btn2); ボタンを動作させて コンソールの表示を確認して下さい setdefaultcloseoperation(jframe.exit_on_close); setvisible(true); public void actionperformed(actionevent e){ System.out.println(e.getActionCommand()); // 受け取ったActionEventをコンソールに表示 9
getactioncommand メソッド イベントの処理分けの手段として getactioncommand メソッド setactioncommand メソッドが用意されています public class Practice02_2 extends JFrame implements ActionListener { JLabel label; JPanel panel; public Practice02_2(String title){ JButton btn1 = new JButton("button1"); btn1.addactionlistener(this); JButton btn2 = new JButton("button2"); btn2.setactioncommand( ボタン 2 ); btn2.addactionlistener(this); panel = new JPanel(); panel.add(btn1); panel.add(btn2); label = new JLabel(""); add(panel,"north"); add(label,"center"); public void actionperformed(actionevent e){ label.settext(e.getactioncommand() + " が押されました "); ボタンを動作させて 画面の変化を確認して下さい 10
コマンド文字列を用いた条件分岐とタイムスタンプ actionperformed メソッドでコマンド文字列を用いた条件を記述できる また getwhen メソッドでタイムスタンプを利用することができる public Practice02_2(String title){ label = new JLabel(""); tlabel = new JLabel(""); add(panel,"north"); add(label,"center"); add(tlabel,"south"); public void actionperformed(actionevent e){ String cmd = e.getactioncommand(); if(cmd.equals("button1")){ label.settext(" ボタン 1 が押されました "); else if(cmd.equals("button2")){ label.settext(" ボタン 2 が押されました "); // タイムスタンプの利用 long time = e.getwhen(); ボタンを動作させ それぞれの機能を確認して下さい DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL); String timest = df.format(new Date(time)); tlabel.settext(timest); 11
テキストフィールド ラジオボタン コンボボックスの利用 その他コンポーネントの利用を考える JTextField jtf,jtf_select; JLabel label,tlabel; ButtonGroup bg_sex; JRadioButton jrb[]; JComboBox jcb; public Practice02_3(String title){ public void actionperformed(actionevent e){ String cmd = e.getactioncommand(); jtf_select.settext("selected:" + cmd); // 選択されているラジオボタンを調べる場合 String sex = ""; for(int i=0;i<jrb.length;i++){ if(jrb[i].isselected()) sex = jrb[i].gettext(); // 特定のボタンが押された時の処理 if(cmd.equals("send")){ // ここに処理を記述 ボタンを動作させ コンポーネントの動作を確認して下さい // 画面のデザイン public Practice02(String title){ jtf = new JTextField(8); jtf.settext("hosei Taro"); bg_sex = new ButtonGroup(); jrb = new JRadioButton[2]; jrb[0] = new JRadioButton("male"); jrb[0].setselected(true); jrb[0].addactionlistener(this); jrb[1] = new JRadioButton("female"); jrb[1].addactionlistener(this); bg_sex.add(jrb[0]); bg_sex.add(jrb[1]); jcb = new JComboBox(); for(int i = 1; i < 5; i++){ jcb.additem(i); JButton btn1 = new JButton("SEND"); btn1.addactionlistener(this); jtf_select = new JTextField(20); jtf.settext(""); JPanel panel = new JPanel(); panel.add(jtf); panel.add(jrb[0]); panel.add(jrb[1]); panel.add(jcb); panel.add(btn1); panel.add(jtf_select); add(panel,"center");
ItemListener の作成 コンボボックスの選択などを監視する場合 ItemListener を利用する public class Practice02_3 extends JFrame implements ActionListener, ItemListener { JTextField jtf, jtf_select; public Practice02_3(String title){ public void actionperformed(actionevent e){ String cmd = e.getactioncommand(); jtf_select.settext(cmd); public void itemstatechanged(itemevent e) { jtf_select.settext("number changed to " + jcb.getselecteditem().tostring()); ボタンを動作させて テキストの表示を確認して下さい 13
MouseEvent の作成 MouseEvent を MouseListener インターフェースを用いてマウスイベントを処理します 実装に必要なメソッドは以下の 5 つで 異なるマウスの動作に対応します mouseclicked() : コンポーネント上でマウスがクリックされた時に呼び出される mousepressed() : コンポーネント上でマウスボタンが押されると呼び出される mousereleased() : コンポーネント上でマウスボタンが離されると呼び出される mouseentered() : コンポーネントの領域にカーソルが入ると呼び出される mouseexited() : コンポーネントの領域からカーソルが出ると呼び出される public void mouseclicked(mouseevent e){ public void mousepressed(mouseevent e){ public void mousereleased(mouseevent e){ public void mouseentered(mouseevent e){ public void mouseexited(mouseevent e){ 14
MouseEvent の作成 (2) 実際に MouseEvent を作成してみる JTextField jtf,jtf_mouse; public Practice02_3(String title){ this.addmouselistener(this); jtf_mouse = new JTextField(20); jtf.settext(""); マウスの動作で表示されているテキストが変わるのを確認する public void mouseclicked(mouseevent e){ //jtf_mouse.settext( mouseclicked ); // クリック処理の場合 public void mousepressed(mouseevent e){ jtf_mouse.settext("mousepressed"); public void mousereleased(mouseevent e){ jtf_mouse.settext("mousereleased"); public void mouseentered(mouseevent e){ jtf_mouse.settext("mouseentered"); public void mouseexited(mouseevent e){ jtf_mouse.settext("mouseexited"); また これの他にマウスのドラッグなどの操作を監視する MouseMothionListener というリスナーも用意されている 15
MenuBar の作成 MenuBar のアイテムのイベント処理も可能 JMenuBar jmb; JMenu menu_file; JMenuItem jmi_new,jmi_save,jmi_open; public Practice02_3(String title){ jmb = new JMenuBar(); menu_file = new JMenu("File"); jmi_new = new JMenuItem("New"); jmi_new.addactionlistener(this); menu_file.add(jmi_new); jmi_open = new JMenuItem("Open"); jmi_open.addactionlistener(this); menu_file.add(jmi_open); jmi_save = new JMenuItem("Save"); jmi_save.addactionlistener(this); menu_file.add(jmi_save); jmb.add(menu_file); setjmenubar(jmb); 16
MenuBar の作成 (2) MenuBar でも ActionCommand の設定ができる また setmnemonic() メソッドによって各コンポーネントにはショートカットキーの設定ができる public class Practice02 extends JFrame implements ActionListener, ItemListener { JMenuBar jmb; JMenu menu_file; JMenuItem jmi_new,jmi_save,jmi_open; public Practice02_3(String title){ //ActionCommand の設定 jmi_new.setactioncommand("file -> New"); jmi_open.setactioncommand("file -> Open"); jmi_save.setactioncommand("file -> Save"); // ショートカットキーの設定 ( 操作は Alt キー + 設定したキー ) menu_file.setmnemonic('f'); jmi_new.setmnemonic('n'); jmi_open.setmnemonic('o'); jmi_save.setmnemonic('s'); Alt キー + F キー -> N キーのキーボードでの操作が可能となる 17
Exercise 2 以下の要件を満たす GUI を Ex1BasicEvent という名前のクラスで作成して下さい 前回の講義で作成した Exercise1 のプログラムを利用して下さい ( 画面のデザイン ) メニューバー 画像を配置したツールバーを作成する画面下にボタンを配置する画面中央に各コンポーネントを配置する メニューアイテム ツールバーアイテム 各コンポーネントの ActionCommand を表示するテキストフィールドを作成する マウスイベントを表示するテキストフィールドを作成する 画面の背景色を変更するラジオボタンを作成する 画面内の各コンポーネントの ActionCommand は各自で考えて作成して下さい講義スライドにあるように メニューバーのアイテムにショートカットキーを設定して下さい 18