简单的问题:
摆动框架可以完全模态(阻止所有其他窗口)吗?
我尝试了以下,但我仍然可以点击其他应用程序窗口(比如这个浏览器)
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
如果可能,请粘贴一些代码。
简单的问题:
摆动框架可以完全模态(阻止所有其他窗口)吗?
我尝试了以下,但我仍然可以点击其他应用程序窗口(比如这个浏览器)
JDialog myDialog = ....
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
如果可能,请粘贴一些代码。
对话框并不意味着是全局模式的。每个现代操作系统都强烈反对其 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。