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(400, 300); 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; }