簡単な質問:
スイング フレームを完全にモーダルにする (他のすべてのウィンドウをブロックする) ことはできますか?
次のことを試しましたが、他のアプリ ウィンドウ (このブラウザなど) をクリックすることはできます。
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
可能であれば、いくつかのコードを貼り付けてください。
簡単な質問:
スイング フレームを完全にモーダルにする (他のすべてのウィンドウをブロックする) ことはできますか?
次のことを試しましたが、他のアプリ ウィンドウ (このブラウザなど) をクリックすることはできます。
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
可能であれば、いくつかのコードを貼り付けてください。
ダイアログは、グローバルにモーダルになることを意図したものではありません。最新のOSはすべて、HIGのグローバルモダリティを強く推奨しておらず、機能を非推奨にしている可能性もあります(動作させることができないという事実によって示されています)。アプリがシステム全体からイベントを盗むことは決してありません。それは悪いデザインであるだけでなく、私の本ではほぼ犯罪的です。
ほとんどの人が複数のアプリ間でマルチタスクを実行することを好むという事実を無視して、グローバルモーダルダイアログを開いてからアプリケーションがフリーズするシナリオはどうでしょうか。Ctrl + Alt + DelはWindowsで動作してアプリを強制終了するはずですが、グローバルモーダルダイアログを備えたMacのCmd + Opt + Escapeについてはよくわかりません(Cocoaにはグローバルモダリティさえありますか?)。あなたが提案しているように、どのLinuxプラットフォームにも、UIの完全な制御を引き継いだアプリを強制終了する優れた方法はありません(X11を完全に強制終了し、新しいインスタンスを最初から開始する必要があります)。
私の答え:別の方法を見つけてください。 私はあなたのクライアントが何を求めているかは気にしません、彼らはこれを望んでいません。
JFrame は、モーダルになるように設計されていません。これには JDialog を使用しますが、JFrame の一部の機能が失われます。損失に耐えることができない場合は、EventQueue をブロックし、それを独自のものに置き換えて、ブロックしているイベントからのイベントのみを受け入れる必要があります。
JFrame にも適用できる内部フレームを使用した説明については、モーダル内部フレームの作成を参照してください。
編集:おっと、私の答えは少しずれているようです。コード例では、これに Dialog サブクラスを既に使用していることを示しています。
グローバルモーダルについてはわかりませんが、ここにアイデアがあります。
デスクトップは偽のスクリーンショットであるため、クリックしようとしても無視できます。
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();
}
参考までに:フルスクリーン エクスクルーシブ モード API。