0

さまざまな OS X バージョンの Apple JVM は、必要なときに WindowClosing イベントを生成しないという点で壊れているようです (たとえば、閉じるボタンをクリックしてアプリのメイン JFrame を閉じた場合)。

(最新の Apple Java アップデートでは、イベントを強制的に生成するプロパティを設定できますが、これは私が探しているものではありません)

私の問題は単純です。ユーザーがアプリを閉じたときに「ヒント」を表示したいと思います。ただし、(イベントが生成されないため) ユーザーがウィンドウを閉じたことを検出できません。

だから私はシャットダウンフックを使うことができると思った:

Runtime.getRuntime().addShutdownHook(...)

ただし、シャットダウン フックから JFrame を作成することには問題があるようです。シャットダウン フックが呼び出されると、EDT が既になくなっているようです。

私はいくつかのことを試しましたが、何も意味がないようです: 私の「ヒント」JFrame がすべて灰色のまま (シャットダウンフック以外の場所から呼び出されたときに正常に動作しているにもかかわらず) や、プログラムがすぐに終了するなどです。ラッチを使用して、シャットダウン フックからのラッチを待機しようとしましたが、EDT がもう存在しないかのようです。

私は現在、回避策としてツールチップを表示するためだけに 2 つ目の Java アプリを生成することを真剣に検討していますが、それは少しやり過ぎだと思います (ただし、少なくとも機能するでしょう)。

シャットダウン フックからウィンドウを作成し、EDT で何かを呼び出そうとした人はいますか?注意すべき問題はありますか? (非常に長い間知られている Apple VM のバグのため、OS X でウィンドウを閉じるイベントを確実にキャッチできないことを思い出してください)。

4

1 に答える 1

1

ウィンドウが実際に閉じており、アプリケーションが停止している場合は、何かが JFrame.dispose() メソッドを呼び出しています。これを上書きして、そこにコードを追加してください。

それ以外の場合は、ウィンドウ リスナーでクローズド メソッドをリッスンするデーモン スレッドを追加できます。デーモンはツールチップを追加してから、ウィンドウを破棄できます。ツールチップが完了するまで破棄を遅らせることができます。

このバグのことは聞いたことがありませんが、Apple が独自の jdk をリリースしていないため、状況は改善されます。

于 2011-10-13T05:18:46.647 に答える