Java 2 - Lesson01

第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