JavaのWindowListenerインターフェースとは?重要性と基本的な使い方を徹底解説
JavaでGUIアプリケーションを開発する際、ウィンドウの開閉やアクティブ化といったWindowEvent(ウィンドウイベント)を適切に処理することは非常に重要です。WindowEventを処理するクラスはWindowListenerインターフェースを実装する必要があり、addWindowListener()メソッドを使用することで、そのクラスのオブジェクトをコンポーネントに登録できます。
特に、ウィンドウの「×」ボタンが押された際の終了処理を制御できるため、ユーザーが意図しないタイミングでのデータ損失を防ぐなど、アプリケーションの信頼性を高めるうえで欠かせないインターフェースです。
WindowListenerインターフェースの主なメソッド
WindowListenerインターフェースは、ウィンドウイベントを処理するための7つのメソッドを定義しています。
- void windowActivated(WindowEvent we) – ウィンドウがアクティブになったときに呼び出されます。
- void windowDeactivated(WindowEvent we) – ウィンドウが非アクティブになったときに呼び出されます。
- void windowOpened(WindowEvent we) – ウィンドウが初めて表示(オープン)されたときに呼び出されます。
- void windowClosed(WindowEvent we) – ウィンドウがdispose()によって完全に閉じられた後に呼び出されます。
- void windowClosing(WindowEvent we) – ユーザーがウィンドウを閉じようとしたときに呼び出されます。
- void windowIconified(WindowEvent we) – ウィンドウが最小化されたときに呼び出されます。
- void windowDeiconified(WindowEvent we) – 最小化されていたウィンドウが元の状態に復元されたときに呼び出されます。
構文
public interface WindowListener extends EventListener
実装例
以下は、WindowListenerインターフェースを実装し、ウィンドウを閉じる際にアプリケーションを終了させるサンプルコードです。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class WindowListenerTest extends JFrame implements WindowListener {
JLabel l1, l2;
JTextField t1;
JPasswordField p1;
JButton b1;
public WindowListenerTest() {
super("WindowListener Test");
setLayout(new GridLayout(3, 2));
l1 = new JLabel("Name");
l2 = new JLabel("Password");
t1 = new JTextField(10);
p1 = new JPasswordField(10);
b1 = new JButton("Send");
add(l1);
add(t1);
add(l2);
add(p1);
add(b1);
addWindowListener(this);
}
public static void main(String args[]) {
WindowListenerTest wlt = new WindowListenerTest();
wlt.setSize(375, 250);
wlt.setResizable(false);
wlt.setLocationRelativeTo(null);
wlt.setVisible(true);
}
public void windowClosing(WindowEvent we) {
this.setVisible(false);
System.exit(0);
}
public void windowActivated(WindowEvent we) {
}
public void windowDeactivated(WindowEvent we) {
}
public void windowOpened(WindowEvent we) {
}
public void windowClosed(WindowEvent we) {
}
public void windowIconified(WindowEvent we) {
}
public void windowDeiconified(WindowEvent we) {
}
}
実行結果

補足:WindowAdapterクラスの活用
WindowListenerインターフェースを実装する場合、実際には使わないメソッドも含めて、すべての7つのメソッドを定義する必要があります。必要なメソッドだけをオーバーライドしたい場合は、各メソッドの空実装があらかじめ用意されているWindowAdapter抽象クラスを継承すると、コードをより簡潔に記述できます。
-
JavaのSwingWorkerクラスとは?GUIアプリで非同期処理を行う重要性と使い方を解説
SwingWorkerクラスは、時間のかかる処理(長時間実行タスク)などをワーカースレッド上で非同期に実行し、その結果に基づいてイベントディスパッチスレッド(EDT)からSwingコンポーネントを安全に更新するための仕組みを提供します。このクラスはJava 1.6で導入されました。Swingでは、すべてのUI更新はEDT上で行う必要があります。しかし、EDT上で重い処理を直接実行すると画面がフリーズしてしまい、ユーザー体験を大きく損ないます。SwingWorkerを使えば、バックグラウンドでの処理とUIの更新を適切に分離できるため、応答性の高いデスクトップアプリケーションを実現できます。Swi
-
JavaのSwingUtilitiesクラスとは?invokeAndWait()とinvokeLater()で実現するスレッドセーフなGUI操作
JavaのSwingでは、コンポーネントが画面に表示された後、それらを操作できるのは「イベントディスパッチスレッド(Event Handling Thread)」と呼ばれる単一のスレッドだけです。これはSwingの重要な設計原則であり、複数のスレッドから同時にGUIを操作すると不整合や予期しない動作が発生するため、すべての描画・更新処理をこのスレッドに集約することで安全性を確保しています。開発者は、別途作成したコードブロックの参照をイベントディスパッチスレッドに渡すことができます。SwingUtilitiesクラスには、そのための2つの重要なstaticメソッド、invokeAndWait()