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:
windowOpened void windowOpened(WindowEvent e)
ウィンドウが最初に可視になったときに呼び出されます。
windowClosing:
windowClosing void windowClosing(WindowEvent e)
ユーザが、ウィンドウのシステムメニューでウィンドウを閉じようとしたとき に呼び出されます。
windowClosed:
windowClosed void windowClosed(WindowEvent e)
ウィンドウに対する dispose の呼び出しの結果として、ウィンドウがクロー ズされたときに呼び出されます。
windowIconified:
windowIconified void windowIconified(WindowEvent e)
ウィンドウが通常の状態から最小化された状態に変更されたときに呼び出され ます。多くのプラットフォームにおいて、最小化されたウィンドウは、そのウ ィンドウの iconImage プロパティで指定されたアイコンとして表示されます。
windowDeiconified:
windowDeiconified void windowDeiconified(WindowEvent e)
ウィンドウが最小化された状態から通常の状態に変更されたときに呼び出され ます。
windowActivated:
windowActivated void windowActivated(WindowEvent e)
Window がアクティブ Window に設定されると呼び出されます。Frame または Dialog のみがアクティブ Window になります。ネイティブのウィンドウ処理 システムは、アクティブ Window またはその特別な装飾を持つ子 (ハイライト されたタイトルバーなど) を表します。アクティブ Window は、常に、フォー カスされた Window か、フォーカスされた Window の所有者である最初の Frame または Dialog です。
windowDeactivated:
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が発生します。
次に元のフレームの方をクリックすると(新フレームは非アクティブになる)、windowDeactivatedが発生します。
新フレームの方を再度クリックすると、windowActivatedが発生します。
新フレームをアイコン化すると、windowIconifiedとwindowDeactivatedが発生します。
新フレームを元に戻すと、windowDeiconifiedとwindowActivatedが発生します。
新フレームを閉じると、windowClosingとwindowDeactivatedが発生します。
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メソッドは下記の通り定義されています。
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 )