高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1363
Unsolicited About Boxes

Q: 私の Java 1.4 アプリケーションは、handleAbout メソッドを使った ApplicationListener を提供していますが、アプリケーションメニューから「About MyApp」が選択されたときに、独自のバージョン表示ボックスは表示されず、依然としてデフォルトのボックスが表示されます。 なぜでしょうか?

A: ここでの問題は、handleAboutで受け取った ApplicationEvent が、処理済みの状態にセットされる必要があるというこです。そうしないと、eAWT は、リクエストが実際に処理されたことを認識しません。 これについては、eAWT javadocs に説明されていますが、見落としがちです。

以下に、正しい handleAbout メソッドの簡単な例を示します。 メソッドの最後に、ApplicationEvent.setHandled(true) の呼び出しが行われています。 この呼び出しがないと、システムは、イベントが実際には処理されておらず、独自のデフォルトのバージョン表示ボックスを使うものと想定します。

リスト 1. setHandled(true) を使ってデフォルトの aboutBox の表示を抑制

public void handleAbout(ApplicationEvent e) {
   new AboutBox().show();
   // eAWT に、デフォルトのバージョン表示ボックスを無効にしてこのリクエストを処理したことを伝える
   e.setHandled(true);
}

handleQuit メソッドに関して同じような問題が生じることがあります。この場合は、実際には ApplicationEvent.setHandled(true) を呼び出してアプリケーションを終了することができます。 つまり、終了リクエストを正しく処理した後で、デフォルトのハンドラが続行する準備ができます。

リスト 2. setHandled(true) を使って終了を承認

public void handleQuit(ApplicationEvent e) {
   cleanupResources();
   // 終了リクエストが処理され、アプリケーションの終了を始める
   e.setHandled(true);
}

たとえば終了処理を完全に制御し、自分自身で System.exit を呼び出したいなどの場合は、handleQuit メソッドでイベントの状態を false(偽)に設定しておきます。 ApplicationEvent のデフォルトの処理状態は false ですが、希望の動作を確実にするために、明示的に状態を設定しておくことをお勧めします。

リスト 3. setHandled(true) を使って終了を拒否

public void handleQuit(ApplicationEvent e) {
   // 終了リクエストを拒否して適切と思われるとおりに処理
   e.setHandled(false);
   String msg = "Are you sure you want to quit?"
   int result = JOptionPane.showConfirmDialog(mainFrame, msg);
   if (result == JOptionPane.YES_OPTION) {
      System.exit(0);
   }
}

注意: この Q&A では、Mac OS X の Java 1.4.1 で導入された eAWT API について取り上げています。 For information on quit events in Java 1.3 での終了イベントについては、テクニカル Q&A 1187 を参照してください。

注意: バージョン表示イベントと終了イベントは、唯一処理を必要とする eAWT イベントです。handlePrefshandleOpenFile などの他のメソッドの場合は、正しく処理されるために、イベントの状態を変更する必要はありません。

ドキュメントの改訂履歴

日付メモ
2004-08-31コードリストの書式の変更
2004-08-25最初のバージョン

掲載日: 2004-08-31