質問
簡単な質問:
スイングフレームは完全にモーダル(他のすべてのウィンドウをブロック)できますか?
以下を試しましたが、他のアプリウィンドウ(このブラウザーなど)をクリックすることはできます
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
可能であれば、コードを貼り付けてください。
解決
JFrameは、モーダルになるように設計されていません。それにはJDialogを使用しますが、そうするとJFrame機能の一部が失われます。 損失に耐えられない場合は、EventQueueをブロックし、それを自分のものに置き換えて、ブロックしているイベントからのイベントのみを受け入れる必要があります。
内部フレームを使用した説明については、モーダル内部フレームの作成を参照してください。 JFrameにも適用できるはずです。
編集: おっと、私の答えは少しずれているようです。コード例では、このためにすでにDialogサブクラスを使用していることが示されているからです。
他のヒント
ダイアログはグローバルにモーダルになることを意図していません。現代のすべてのOSは、そのHIGでグローバルモダリティを強く推奨しておらず、機能を非推奨にしている場合もあります(動作させることができないという事実によって示されます)。アプリはシステム全体からイベントを盗まないでください 。それはデザインが悪いだけでなく、私の本ではほぼ犯罪的です。
ほとんどの人が複数のアプリ間でマルチタスクを行うことを好むという事実を無視して、グローバルモーダルダイアログを開いてからアプリケーションがフリーズするシナリオについてはどうでしょうか? Ctrl + Alt + DelはWindows上で動作してアプリを終了しますが、MacでCmd + Opt + Escapeがグローバルモーダルダイアログを使用するかどうかはわかりません(Cocoaはグローバルモダリティでもありますか?)。 Linuxプラットフォームには、提案されているようにUIの完全な制御を引き継いだアプリを強制終了する良い方法はありません(X11を完全に強制終了して新しいインスタンスをゼロから開始する必要があります)。
私の答え:別の方法を見つけます。クライアントが何を求めているかは気にしません。彼らはこれを望んでいません。
グローバルモーダルについては知りませんが、ここにアイデアがあります。
- デスクトップのスクリーンショットを撮ります。
- 全画面表示。
- ダイアログを開きます。
デスクトップは偽のスクリーンショットであるため、クリックしようとしても無視できます。
private void toggleFullScreenWindow() {
GraphicsEnvironment graphicsEnvironment
= GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice graphicsDevice
= graphicsEnvironment.getDefaultScreenDevice();
if(graphicsDevice.getFullScreenWindow()==null) {
dialog.dispose(); //destroy the native resources
dialog.setUndecorated(true);
dialog.setVisible(true); //rebuilding the native resources
graphicsDevice.setFullScreenWindow(dialog);
}else{
graphicsDevice.setFullScreenWindow(null);
dialog.dispose();
dialog.setUndecorated(false);
dialog.setVisible(true);
dialog.repaint();
}
requestFocusInWindow();
}
FYI:フルスクリーン排他モードAPI 。