Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのイベントリスナーインターフェースとイベントアダプタクラスの違いを解説

EventListener(イベントリスナー)インターフェースは、特定の種類のイベントを処理するために、イベントハンドラ側で実装すべきメソッドを定義するものです。一方、イベントアダプタ(Event Adapter)クラスは、EventListenerインターフェースのデフォルト実装を提供する抽象クラスです。

本記事では、それぞれの特徴と具体的なコード例をもとに、両者の違いと使い分けのポイントを解説します。

イベントリスナー(EventListener)とは

  • イベントリスナーは、すべてのコンポーネントがイベントを処理するための中核となる仕組みです。
  • EventListenerインターフェースの各メソッドは、EventObjectクラスのサブクラスのインスタンスを1つの引数として受け取ります。
  • EventListenerインターフェースはjava.utilパッケージで定義されており、これを実装することで独自のイベント処理を組み込めます。
  • 主なEventListenerインターフェースには、ActionListenerKeyListenerMouseListenerFocusListenerItemListenerなどがあります。

コード例:KeyListenerを実装したサンプル

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyListenerTest implements KeyListener, ActionListener {
    JFrame frame;
    JTextField tf;
    JLabel lbl;
    JButton btn;
    public KeyListenerTest() {
        frame = new JFrame();
        lbl = new JLabel();
        tf = new JTextField(15);
        tf.addKeyListener(this);
        btn = new JButton("Clear");
        btn.addActionListener(this);
        JPanel panel = new JPanel();
        panel.add(tf);
        panel.add(btn);
        frame.setLayout(new BorderLayout());
        frame.add(lbl, BorderLayout.NORTH);
        frame.add(panel, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
    @Override
    public void keyTyped(KeyEvent ke) {
        lbl.setText("You have typed "+ ke.getKeyChar());
    }
    @Override
    public void keyPressed(KeyEvent ke) {
        lbl.setText("You have pressed "+ ke.getKeyChar());
    }
    @Override
    public void keyReleased(KeyEvent ke) {
        lbl.setText("You have released "+ ke.getKeyChar());
    }
    @Override
    public void actionPerformed(ActionEvent ae) {
        tf.setText("");
    }
    public static void main(String args[]) {
        new KeyListenerTest();
    }
}

実行結果

Javaのイベントリスナーインターフェースとイベントアダプタクラスの違いを解説

この例では、KeyListenerインターフェースを直接実装しているため、keyTyped()、keyPressed()、keyReleased()の3つのメソッドをすべてオーバーライドする必要があります。たとえ一部のメソッドを使わなかったとしても、空の実装を必ず記述しなければなりません。

イベントアダプタ(Event Adapter)とは

  • イベントアダプタは、さまざまなイベントを受け取るために用意された抽象クラスです。
  • イベントアダプタクラスは、EventListenerインターフェースのすべてのメソッドに対してデフォルト実装(空の実装)を提供します。
  • 主なイベントアダプタクラスには、FocusAdapterKeyAdapterMouseAdapterWindowAdapterなどがあります。

イベントアダプタを継承すれば、実際に必要なメソッドだけをオーバーライドすればよく、使わないメソッドの空実装を書く手間が省けるため、コードを簡潔に保つことができます。

コード例:KeyAdapterを利用したサンプル

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyAdapterTest {
    private JFrame frame;
    private JLabel headLabel;
    private JLabel msgLabel;
    private JPanel controlPanel;
    public KeyAdapterTest() {
        initializeUI();
    }
    private void initializeUI() {
        frame = new JFrame("KeyAdapter class");
        frame.setSize(350, 275);
        frame.setLayout(new GridLayout(3, 1));
        headLabel = new JLabel("", JLabel.CENTER);
        msgLabel = new JLabel("", JLabel.CENTER);
        msgLabel.setSize(300, 100);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });
        controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());
        frame.add(headLabel);
        frame.add(controlPanel);
        frame.add(msgLabel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    private void showMouseApapter() {
        headLabel.setText("KeyAdapter Test");
        final JTextField textField = new JTextField(10);
        JButton displayButton = new JButton("Display");
        displayButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                msgLabel.setText("You entered : " + textField.getText());
            }
        });
        textField.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    msgLabel.setText("You entered : " + textField.getText());
                }
            }
        });
        controlPanel.add(textField);
        controlPanel.add(displayButton);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        KeyAdapterTest test = new KeyAdapterTest();
        test.showMouseApapter();
    }
}

実行結果

Javaのイベントリスナーインターフェースとイベントアダプタクラスの違いを解説

この例では、KeyAdapterを匿名クラスとして利用し、必要なkeyPressed()メソッドだけをオーバーライドしています。Enterキーが押されたときに入力内容を表示する処理のみを記述しており、他のメソッドの実装は不要になっています。

まとめ:EventListenerとイベントアダプタの比較

項目EventListenerインターフェースイベントアダプタクラス
種類インターフェース抽象クラス
宣言方法implementsで実装extendsで継承
メソッドの実装すべてのメソッドの実装が必要必要なメソッドのみオーバーライド
代表例ActionListener、KeyListener、MouseListenerなどKeyAdapter、MouseAdapter、WindowAdapterなど

メソッド数が少ないインターフェース(ActionListenerなど)は直接実装し、メソッド数が多く一部の機能だけを使いたい場合はイベントアダプタクラスを継承するのが一般的な使い分けです。用途に応じて適切に選択することで、可読性と保守性の高いイベント処理を実現できます。

  1. JavaのJFrameとJDialogの違いとは?特徴と使い分けを解説

    JavaのSwingには、ウィンドウを表示するためのトップレベルコンテナとしてJFrameとJDialogが用意されています。どちらもよく似た役割を持ちますが、動作や用途には重要な違いがあります。この記事では、それぞれの特徴をサンプルコードとともに解説し、最後に使い分けのポイントをまとめます。 JFrameとは フレームに追加されたコンポーネントは「コンテンツ」として扱われ、contentPaneによって管理されます。JFrameにコンポーネントを追加する際は、フレーム本体ではなくcontentPaneに対して追加する必要があります。 JFrameは、タイトル、境界線、(オプションで)メニュ

  2. JavaのGridLayoutとGridBagLayoutの違いを徹底解説!特徴と使い分けのポイント

    JavaのAWT/Swingには複数のレイアウトマネージャーが用意されていますが、その中でもGridLayoutとGridBagLayoutは、コンポーネントを格子状(グリッド)に配置するという点でよく似ています。しかし、両者には重要な違いがあります。 GridLayoutは、すべてのコンポーネントを矩形のグリッド内に配置し、領域を同じサイズの長方形に分割して、各コンポーネントをそれぞれのセルの中に収めます。一方、GridBagLayoutは柔軟性の高いレイアウトマネージャーであり、コンポーネントのサイズを揃えることなく、縦方向・横方向に整列させて配置できます。各GridBagLayoutオブ