WindowEvent

広告

ここではWindowEventについて見ていきます。

1.WindowEventを発生させるコンポーネント:

JDialog
JFrame

2.イベントが発生するタイミング:

フレームを閉じる、アイコン化する、など

3.対応するリスナーインターフェース:

java.awt.event.WindowListener
public interface WindowListener extends EventListener

4.コンポーネントに対するリスナーの登録メソッド:

addWindowListener
public void addWindowListener(WindowListener l)

5.アダプタークラス:

java.awt.event.WindowAdapter

public abstract class WindowAdapter extends Object 
  implements WindowListener, WindowStateListener, WindowFocusListener

WindowListenerインターフェース

WindowListenerインターフェースはフレームに関するイベントを受け取るためのリスナーインタフェースです。実装に必要なメソッドは7つあります。

windowOpened:

void windowOpened(WindowEvent e)

ウィンドウが最初に可視になったときに呼び出されます。

windowClosing:

void windowClosing(WindowEvent e)

ユーザが、ウィンドウのシステムメニューでウィンドウを閉じようとしたとき
に呼び出されます。

windowClosed:

void windowClosed(WindowEvent e)

ウィンドウに対する dispose の呼び出しの結果として、ウィンドウがクロー
ズされたときに呼び出されます。

windowIconified:

void windowIconified(WindowEvent e)

ウィンドウが通常の状態から最小化された状態に変更されたときに呼び出され
ます。多くのプラットフォームにおいて、最小化されたウィンドウは、そのウ
ィンドウの iconImage プロパティで指定されたアイコンとして表示されます。

windowDeiconified:

void windowDeiconified(WindowEvent e)

ウィンドウが最小化された状態から通常の状態に変更されたときに呼び出され
ます。

windowActivated:

void windowActivated(WindowEvent e)

Window がアクティブ Window に設定されると呼び出されます。Frame または
Dialog のみがアクティブ Window になります。ネイティブのウィンドウ処理
システムは、アクティブ Window またはその特別な装飾を持つ子 (ハイライト
されたタイトルバーなど) を表します。アクティブ Window は、常に、フォー
カスされた Window か、フォーカスされた Window の所有者である最初の 
Frame または Dialog です。

windowDeactivated:

void windowDeactivated(WindowEvent e)

Window がアクティブ Window でなくなったときに呼び出されます。Frame ま
たは Dialog のみがアクティブ Window になります。ネイティブのウィンドウ
処理システムは、アクティブ Window またはその特別な装飾を持つ子 (ハイラ
イトされたタイトルバーなど) を表します。アクティブ Window は、常に、フ
ォーカスされた Window か、フォーカスされた Window の所有者である最初の 
Frame または Dialog です。

上記のようにフレームの状態に応じて何からの処理をしたい場合に、それぞれのメソッドを使います。windowClosingとwindowClosedは似ていますが、windowClosingはフレームが閉じる前に処理されるのに対して、windowClosedは閉じた後に処理されます。閉じる前に、保存前のファイルに関して注意するなどの処理はwindowClosingメソッドを使うのではと思います。

このリスナーインターフェースの実装方法は下記のようになります。

public class myListener implements WindowListener{
  public void windowOpened(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }

  public void windowClosing(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }

  public void windowClosed(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }

  public void windowIconified(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }

  public void windowDeiconified(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }

  public void windowActivated(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }

  public void windowDeactivated(WindowEvent e){
    /* 処理したい内容をここに記述する */
  }
}

ではここで簡単なサンプルを作成して試してみます。下記では新しいフレームを1つ作り、イベントの流れを見ています。

import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.awt.Dimension;

public class SwingTest extends JFrame implements ActionListener,WindowListener{

  JTextArea textArea;
  JFrame frame;
  String newline = System.getProperty("line.separator");

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    textArea = new JTextArea("");

    JScrollPane sp = new JScrollPane();
    sp.getViewport().setView(textArea);
    sp.setPreferredSize(new Dimension(200, 80));

    JButton btn = new JButton("Window Create");
    btn.addActionListener(this);

    getContentPane().add(sp, BorderLayout.CENTER);
    getContentPane().add(btn, BorderLayout.PAGE_END);
  }

  public void actionPerformed(ActionEvent e){
    frame = new JFrame("TestWindow");
    frame.setBounds( 100, 30, 100, 100);
    frame.setVisible(false);
    frame.addWindowListener(this);
    frame.setVisible(true);
  }

  public void windowClosing(WindowEvent e) {
    textArea.append("Window closing" + newline);
  }

  public void windowClosed(WindowEvent e) {
    textArea.append("Window closed" + newline);
    System.out.println("33");
  }

  public void windowOpened(WindowEvent e) {
    textArea.append("Window opened" + newline);
  }

  public void windowIconified(WindowEvent e) {
    textArea.append("Window iconified" + newline);
  }

  public void windowDeiconified(WindowEvent e) {
    textArea.append("Window deiconified" + newline);
  }

  public void windowActivated(WindowEvent e) {
    textArea.append("Window activated" + newline);
  }

  public void windowDeactivated(WindowEvent e) {
    textArea.append("Window deactivated" + newline);
  }
}

実行結果は下記のようになります。

まず"Window Create"というボタンを押すとフレームが1つ作成されます。同時にwindowActivatedとwindowOpenedが発生します。

WindowEvent

次に元のフレームの方をクリックすると(新フレームは非アクティブになる)、windowDeactivatedが発生します。

WindowEvent

新フレームの方を再度クリックすると、windowActivatedが発生します。

WindowEvent

新フレームをアイコン化すると、windowIconifiedとwindowDeactivatedが発生します。

WindowEvent

新フレームを元に戻すと、windowDeiconifiedとwindowActivatedが発生します。

WindowEvent

新フレームを閉じると、windowClosingとwindowDeactivatedが発生します。

WindowEvent

WindowAdapterクラス

WindowListenerインターフェースにも対応するAdapterクラスが存在します。

java.lang.Object
  java.awt.event.WindowAdapter

public abstract class WindowAdapter extends Object implements WindowListener, WindowStateListener, WindowFocusListener

WindowAdapterクラスを継承し、実際に必要なメソッドだけを自分で再度定義するだけで、WindowEventを取り扱うことができます。

public class myListener extends WindowAdapter{
  public void windowClosing(WindowEvent e){
    /* 必要なメソッドだけ自分で再度定義 */
  }
}

では実際に試して見ます。

import javax.swing.*;
import java.awt.event.*;

public class SwingTest extends JFrame{

   public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    addWindowListener(new myListener());
  }

  public class myListener extends WindowAdapter{
    public void windowClosing(WindowEvent e) {
      System.out.println("Window closing");
    }
  }
}

実行結果は特に記載しないのですが、実行するとフレームが1つできますので、フレームを閉じると標準出力にメッセージが表示されます。

WindowEventクラス

ではWindowEventクラスについても見ていきます。クラス図を見て下さい。

java.lang.Object
  java.util.EventObject
    java.awt.AWTEvent
      java.awt.event.ComponentEvent
        java.awt.event.WindowEvent

public class WindowEvent extends ComponentEvent

WindowEventクラスのメソッドとしては下記のようなものが用意されています。

メソッドの概要
Window getWindow()
イベントの発生元を返します。

getWindowメソッドは下記の通り定義されています。

public Window getWindow()

イベントの発生元を返します。 

戻り値:
  イベントの発生元の Window オブジェクト

イベントの発生元を調べる際に使います。戻り値はWindowクラスのオブジェクトなのですが、JDialogもJFrameもWindowクラスのサブクラスです。

簡単なサンプルで試して見ます。

import javax.swing.*;
import java.awt.event.*;

public class SwingTest extends JFrame{

  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");

    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }

  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);

    addWindowListener(new myListener());
  }

  public class myListener extends WindowAdapter{
    public void windowClosing(WindowEvent e){
      JFrame frame = (JFrame)e.getWindow();
      System.out.println(frame.getTitle());
    }
  }
}

こちらも実行してみるとフレームが1つできますので、フレームを閉じてみてください。イベント発生元のフレームを取得し、そのタイトルを標準出力に書き出します。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。