Swing のイベント処理の基本

イベントソースとイベントリスナー ~ Swing で採用されているイベント委任モデル

Swing では委譲イベントモデル (event delegation model、イベント委任モデル) と呼ばれるパターンのイベント処理機構を採用しています。

イベントを発生させるオブジェクト(これをイベントソースと呼びます)に対して、イベントリスナーオブジェクト(event listener)を指定します。 イベントリスナーオブジェクトは、リスナーインターフェイス(listener interface)を実装したオブジェクトです。

Swing のイベントリスナーの具体例

具体的には、リスナーインターフェイスは ActionListener というインターフェイスで、actionPerformed というメソッドが定義されます。 例えば ButtonListener というクラス名をつけると、次のようなコードになります。

class ButtonListener implements ActionListener {

  public void actionPerformed(ActionEvent event) {
    ...
  }

}

このイベントリスナーオブジェクト (ButtonListener) を、イベントソースとなるボタンにセットするには、次のようにします。

JButton button1 = new JButton("button 1");
ActionListener listener = new ButtonListener();
button1.addActionListener(listener);

あるいは、匿名内部クラスを用いて次のように記述する事も可能です。

JButton button1 = new JButton("button 1");    
button1.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e) {
    JOptionPane.showMessageDialog(null, "Hello, Event Test!");
  }
});

実行例

それでは実際に動作確認可能なコードを示します。

以下のコードを実行すると、ボタンがひとつ配置されたウィンドウが表示され、ボタンをクリックすると上のスクリーンショットのように、メッセージボックスが表示されます。


import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;


public class EventTest1 {
  
  public static void main(String[] args){

    EventQueue.invokeLater(new Runnable(){

      public void run(){
        ButtonFrame frame = new ButtonFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }
      
    });

  }
}


@SuppressWarnings("serial")
class ButtonFrame extends JFrame {

  public ButtonFrame(){
  
    setTitle("Event Test");
    setSize(400300);
    
    JButton button1 = new JButton("button 1");    
    button1.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(null, "Hello, Event Test!");
      }
    });
    
    buttonPanel = new JPanel();
    buttonPanel.add(button1);
    add(buttonPanel);
    
  }
  
  private JPanel buttonPanel;

}

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門