第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 ユーザ ー> インタフェース ー> イベントリスナー イベント処理 イベント取得 イベント発生 イベント ユーザ操作 ー> アクション アクション actionPerformed() {……} TextField object(s) ActionListener Button object(s) ItemListener itemStateChanged() {……} Choice object(s) TextListener textValueChanged() {……} Checkbox object(s) … … … ユーザがボタン”6” をマウスでクリック した ボタン”6”がクリッ クされたことを ActionListener が認識する イベント処理メソッド actionPerformedを 呼ばれ、イベント処 理(この場合は電卓 のテキストフィール ドに6を表示)する パッケージ java.awt.event(クラス) クラス階層図 java.lang.Object ActionEvent ContainerEvent ItemEvent FocusEvent java.util.EventObject TextEvent PaintEvent java.awt.AWTEvent AdjustmentEvent WindowEvent ComponentEvent InputEvent java.lang.Object | +--java.util.EventObject | KeyEvent MouseEvent +--java.awt.AWTEvent | +--java.awt.event.ActionEvent AWT イベントクラス 次に説明します パッケージ java.awt.event (インターフェース) インターフェース階層図 抽象メソッド!! ActionListener public void actionPerformed(ActionEvent e) ItemListener public void itemStateChanged(ItemEvent e) TextListener public void textValueChanged(TextEvent e) java.lang.Object java.util.EventListener public void keyTyped(KeyEvent e) KeyListener public void keyPressed(KeyEvent e) public void keyReleased(KeyEvent e) WindowListener AdjustmentListener AWT イベントリスナー インタフェースクラス public void windowClosing(WindowEvent e) public void adjustmentValueChanged(AdjustmentEvent e) public void mouseClicked(MouseEvent e) 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) 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) public void keyTyped(KeyEvent e) Key KeyEvent KeyListener 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 public void mousePressed(MouseEvent e) MouseListener 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 テキストフィールド・ラジオボタン・コンボボックスの利用 • その他コンポーネントの利用を考える //画面のデザイン public Practice02(String title){ jtf = new JTextField(8); jtf.setText("Hosei Taro"); //省略 JTextField jtf,jtf_select; JLabel label,tlabel; ButtonGroup bg_sex; JRadioButton jrb[]; JComboBox jcb; 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); public Practice02_3(String title){ //省略 } bg_sex.add(jrb[0]); bg_sex.add(jrb[1]); jcb = new JComboBox(); for(int i = 1; i < 5; i++){ jcb.addItem(i); } public void actionPerformed(ActionEvent e){ String cmd = e.getActionCommand(); jtf_select.setText("Selected:" + cmd); JButton btn1 = new JButton("SEND"); btn1.addActionListener(this); //選択されているラジオボタンを調べる場合 String sex = ""; for(int i=0;i<jrb.length;i++){ if(jrb[i].isSelected()) sex = jrb[i].getText(); } //特定のボタンが押された時の処理 if(cmd.equals("SEND")){ //ここに処理を記述 } 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){ を監視するMouseMothionListenerというリス jtf_mouse.setText("mouseExited"); ナーも用意されている } 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
© Copyright 2024 ExpyDoc