ActionEvent

広告

ここではActionEventについて見ていきます。

1.ActionEventを発生させるコンポーネント:

JButton
JCheckBox
JRadioButton
JToggleButton

JMenuItem
JCheckBoxMenuItem
JRadioButtonMenuItem

JTextField
JPasswordField
JFormattedTextField

JComboBox
JFileChooser

2.イベントが発生するタイミング:

・ボタン関係はボタンがクリックされた場合
・メニューアイテム関係はメニューが選択された場合
・テキストフィールド関係は文字入力をしている場合にEnterキーが押された場合
・コンボボックスは項目が選択されるか入力エリアでEnterキーが押された場合
・JFileChooserは中に含まれているボタンが押された場合

3.対応するリスナーインターフェース:

java.awt.event.ActionListener
public interface ActionListener extends EventListener

4.コンポーネントに対するリスナーの登録メソッド:

addActionListener
public void addActionListener(ActionListener l)

ActionListenerインターフェース

ActionListenerインターフェースはアクションイベントを受け取るためのリスナーインタフェースです。アクションイベントを処理するクラスを用意する場合にはこのインタフェースを実装します。実装に必要なメソッドはactionPerformedつだけで、アクションイベントが発生すると、このactionPerformed メソッドが呼び出されます。

アクションが発生すると呼び出されます。

引数には発生したアクションイベントのオブジェクトが渡されてきます。このリスナーインターフェースの実装方法は今までにも記載していますが下記のようになります。

public class myListener implements ActionListener{
  public void actionPerformed(ActionEvent e){
    /* 処理したい内容をここに記述する */
  }
}

ではここで一番簡単なサンプルを作成して試してみます。下記では自分自身にActionListenerをインプリメントしています。

import javax.swing.*;
import java.awt.event.*;

public class SwingTest extends JFrame implements ActionListener{
  JLabel label;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    label = new JLabel("");

    JButton btn = new JButton("Push");
    btn.addActionListener(this);

    JPanel p = new JPanel();
    p.add(label);
    p.add(btn);

    getContentPane().add(p);
  }

  public void actionPerformed(ActionEvent e){
    label.setText("Push");
  }
}

実行結果は下記のようになります。

ActionEvent

ボタンを押すとラベルに文字が表示されます。

ActionEvent

ActionEventクラス

ではActionEventクラスについても見ていきます。クラス図を見て下さい。

  • java.lang.Object
  • java.util.EventObject
  • java.awt.AWTEvent
  • java.awt.event.ActionEvent
  • public class ActionEvent extends AWTEvent

ActionEventクラスのオブジェクトはactionPerformedメソッドの引数として渡されてきます。ActionEventクラスのメソッドとしては下記のようなものが用意されています。

メソッドの概要
String getActionCommand()
アクションに関連したコマンド文字列を返します。
int getModifiers()
アクションイベントの発生中に押された修飾キーを返します。
long getWhen()
このイベントが発生した時点のタイムスタンプを返します。

1つ1つ見てみましょう。

getActionCommandメソッド

getActionCommandメソッドは下記の通り定義されています。

アクションに関連したコマンド文字列を返します。この文字列は、「モーダル
な」コンポーネントがその状態に応じて、いくつかのコマンドのうちから 1 
つを指定することができます。たとえば、単一のボタンで「詳細表示」と「詳
細非表示」を切り替えられます。発生元のオブジェクトとイベントはそれぞれ
の場合について同一ですが、コマンド文字列は意図したアクションを示します。 

null コマンド文字列をこの ActionEvent のコンストラクタに渡した場合、こ
のメソッドは null を返します。

戻り値:
  このイベントに対するコマンドを識別する文字列

getActionCommandメソッドはコンポーネント側で設定した"コマンド文字列"を読み取ります。

ではコンポーネント側ではどのように"コマンド文字列"を設定するかというと、例えばJButtonクラスでは親クラスのAbstractButtonクラスにおいてsetActionCommandメソッドが用意されています。

ボタンのアクションのコマンドを設定します。 

パラメータ:
  actionCommand - このボタンのアクションのコマンド

"コマンド文字列"と書かれていますが、要はアクションイベント発生時に文字列を渡せると考えて下さい。例えばメソッドの説明に書かれているように、ボタンの現在の状況を設定しておいてもいいですし、単にボタンの名前を登録しておいてもいいかと思います。ボタンの名前を登録しておけば、アクションイベントから"コマンド文字列"を取り出して、どのボタンからこのアクションイベントが発生したかを判別するのにも使えます。

実際の使い方は下記のようになります。

public class SwingTest extends JFrame implements ActionListener{

  JButton btn = new JButton("Push");
  btn.addActionListener(this);
  btn.setActionCommand("btn_push");

  public void actionPerformed(ActionEvent e){
      String cmd = e.getActionCommand();
  }
}

では簡単なサンプルで試して見ます。

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;

public class SwingTest extends JFrame implements ActionListener{
  JLabel label;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    label = new JLabel("");
    label.setHorizontalAlignment(JLabel.CENTER);

    JButton btn1 = new JButton("Button 1");
    btn1.addActionListener(this);
    btn1.setActionCommand("Button 1");

    JButton btn2 = new JButton("Button 2");
    btn2.addActionListener(this);
    btn2.setActionCommand("Button 2");

    JPanel p = new JPanel();
    p.add(btn1);
    p.add(btn2);

    getContentPane().add(p, BorderLayout.CENTER);
    getContentPane().add(label, BorderLayout.PAGE_END);
  }

  public void actionPerformed(ActionEvent e){
    String cmd = e.getActionCommand();

    if (cmd.equals("Button 1")){
      label.setText("ボタン1が押されました");
    }else if (cmd.equals("Button 2")){
      label.setText("ボタン2が押されました");
    }
  }
}

実行結果は下記のようになります。

ActionEvent

ボタン1を押すと

ActionEvent

ボタン2を押すと

ActionEvent

のようになります。

getModifiersメソッド

getModifiersメソッドは下記のように定義されています。

アクションイベントの発生中に押された修飾キーを返します。

戻り値:
  修飾子の定数のビット単位の論理和

ボタンを押すなどのアクションイベントが発生した際に、"Shiftキー"や"Ctrlキー"を押していたかどうかを判定するために使います(実際に、そんな利用は想像が付かないのですが)。

4つの値が定義されています。

java.awt.event.ActionEvent
public static final int ALT_MASK 8
public static final int CTRL_MASK 2
public static final int META_MASK 4
public static final int SHIFT_MASK 1

メソッドからの戻り値と上記の値をビット演算してみることで、それぞれのキーが押されたかどうか判別できます。

使い方としては下記のような感じです。

public class SwingTest extends JFrame implements ActionListener{

  JButton btn = new JButton("Push");
  btn.addActionListener(this);

  public void actionPerformed(ActionEvent e){
    int modifiers = e.getModifiers();

    if ((modifiers & ActionEvent.ALT_MASK) == ActionEvent.ALT_MASK){
      label.setText("ALTが押されています");
    }
  }
}

では簡単なサンプルで試して見ます。

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;

public class SwingTest extends JFrame implements ActionListener{
  JLabel label;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    label = new JLabel("");
    label.setHorizontalAlignment(JLabel.CENTER);

    JButton btn = new JButton("Push!");
    btn.addActionListener(this);

    JPanel p = new JPanel();
    p.add(btn);

    getContentPane().add(p, BorderLayout.CENTER);
    getContentPane().add(label, BorderLayout.PAGE_END);
  }

  public void actionPerformed(ActionEvent e){
    int modifiers = e.getModifiers();

    StringBuffer sb = new StringBuffer();
    sb.append("ボタンクリック ");
    if ((modifiers & ActionEvent.ALT_MASK) == ActionEvent.ALT_MASK){
      sb.append("ALT ");
    }

    if ((modifiers & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK){
      sb.append("CTRL ");
    }

    if ((modifiers & ActionEvent.META_MASK) == ActionEvent.META_MASK){
      sb.append("META ");
    }

    if ((modifiers & ActionEvent.SHIFT_MASK) == ActionEvent.SHIFT_MASK){
      sb.append("SHIFT");
    }

    label.setText(new String(sb));
  }
}

実行結果は下記のようになります。
単にクリックすると下記のようになります。

getModifiers

"SHIFTキー"を押しながらクリックすると

getModifiers

"ALTキー"と"CTRLキー"を同時に押しながらクリックすると

getModifiers

のようになります。

getWhenメソッド

getWhenメソッドは下記のように定義されています。

このイベントが発生した時点のタイムスタンプを返します。ActionEvent が高
レベルのセマンティックイベントであるため、通常、タイムスタンプは基本と
なる InputEvent と同じになります。 

戻り値:
  このイベントのタイムスタンプ

イベントが発生した時間を時間を取得できます。戻り値はlong型の値なのでDateクラスなどを使って適切な時間に変更してください。

これもサンプルで試してみます。

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.text.DateFormat;
import java.util.Date;

public class SwingTest extends JFrame implements ActionListener{
  JLabel label;

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    label = new JLabel("");
    label.setHorizontalAlignment(JLabel.CENTER);

    JButton btn = new JButton("Push!");
    btn.addActionListener(this);

    JPanel p = new JPanel();
    p.add(btn);

    getContentPane().add(p, BorderLayout.CENTER);
    getContentPane().add(label, BorderLayout.PAGE_END);
  }

  public void actionPerformed(ActionEvent e){
    long time = e.getWhen();

    DateFormat df = 
      DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL);
    String clickTime = df.format(new Date(time));

    label.setText(clickTime);
  }
}

実行結果は下記のようになります。

getWhen

クリックすると、クリックした時間をラベルに表示します。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)