JavaのFocusListenerインターフェースとは?重要性と実装方法を解説
FocusListenerインターフェースとは
Java AWT/SwingにおけるFocusListenerは、コンポーネントがキーボードフォーカスを取得・喪失したタイミングで発生するイベントを受け取るためのリスナーインターフェースです。ユーザーがどのコンポーネントを操作しているのかを検知できるため、入力フォームのバリデーションやガイド表示など、対話的なUIを実現するうえで重要な役割を担います。
- フォーカスイベントは、コンポーネントがキーボードフォーカスを取得または喪失したときに生成されます。
- フォーカスイベントを表すオブジェクトは、FocusEventクラスから作成されます。
- FocusEventクラスに対応するリスナーインターフェースがFocusListenerインターフェースであり、FocusEventの各リスナーはこのインターフェースを実装します。
- FocusListenerインターフェースには次の2つのメソッドが定義されています。
- focusGained():監視対象のコンポーネントがフォーカスを取得した直後にAWTによって呼び出されます。
- focusLost():監視対象のコンポーネントがフォーカスを失った直後にAWTによって呼び出されます。
これらのメソッドを活用することで、例えばテキストフィールドにフォーカスが移った瞬間に入力ヒントを表示したり、フォーカスが外れた時点で入力値の妥当性をチェックしたりといった、きめ細かなユーザー体験の設計が可能になります。
構文
public interface FocusListener extends EventListener {
public void focusGained(FocusEvent fe);
public void focusLost(FocusEvent fe);
}実装例
以下は、JTextFieldにFocusListenerを実装し、フォーカスの取得・喪失をコンソールに出力するシンプルなサンプルプログラムです。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FocusListenerTest extends JPanel implements FocusListener {
private JTextField textField;
public FocusListenerTest() {
setLayout(new BorderLayout());
textField = new JTextField();
textField.addFocusListener(this);
add(textField, BorderLayout.NORTH);
}
public void focusGained(FocusEvent fe) {
System.out.println("Text field gained focus");
}
public void focusLost(FocusEvent fe) {
System.out.println("Text field lost focus");
}
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.add(new FocusListenerTest());
frame.setTitle("FocusListener Test");
frame.setSize(375, 250);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}このコードでは、パネル自身(this)をリスナーとしてテキストフィールドに登録しています。テキストフィールドがクリックされてフォーカスを取得するとfocusGained()が、Tabキーなどでフォーカスが外れるとfocusLost()がそれぞれ呼び出されます。
実行結果
プログラムを起動してテキストフィールドをクリックすると「Text field gained focus」と出力され、ウィンドウの他の部分をクリックしてフォーカスが外れると「Text field lost focus」と出力されます。


-
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()