0

简单的问题:

摆动框架可以完全模态(阻止所有其他窗口)吗?

我尝试了以下,但我仍然可以点击其他应用程序窗口(比如这个浏览器)

JDialog myDialog  = .... 
myDialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);

如果可能,请粘贴一些代码。

4

3 回答 3

3

对话框并不意味着是全局模式的。每个现代操作系统都强烈反对其 HIG 中的全局模式,他们甚至可能已经弃用了该功能(正如您无法让它工作的事实所表明的那样)。你的应用不应该整个系统中窃取事件;这不仅是糟糕的设计,而且在我的书中几乎是犯罪。

忽略大多数人喜欢在多个应用程序之间执行多任务这一事实,您打开全局模式对话框然后您的应用程序冻结的场景呢?Ctrl+Alt+Del 应该可以在 Windows 上杀死应用程序,但我不确定 Mac 上的 Cmd+Opt+Escape 是否有全局模式对话框(Cocoa 甚至全局模式吗?)。正如您所建议的那样,所有 Linux 平台都没有任何很好的方法来杀死已经完全控制 UI 的应用程序(您必须完全杀死 X11 并从头开始一个新实例)。

我的回答:另辟蹊径。 我不在乎你的客户要求什么,他们不想要这个。

于 2008-11-20T17:27:53.450 回答
2

JFrame 并非设计为模态的。使用 JDialog,但这样做会丢失一些 JFrame 功能。如果您无法忍受损失,则必须阻止 EventQueue 并将其替换为您自己的,以便仅接受来自阻塞的事件。

有关使用内部框架的解释,请参阅创建模态内部框架,该内部框架也应该适用于 JFrame。

编辑:哎呀,我的回答似乎有点不对劲,因为您的代码示例显示您已经为此使用了 Dialog 子类。

于 2008-11-20T09:11:40.737 回答
1

我不知道全局模式,但这是一个想法。

  1. 截取桌面截图。
  2. 进入全屏。
  3. 弹出你的对话框。

由于桌面是假截图,你可以忽略任何点击它的尝试。

全屏示例

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

于 2008-11-20T08:57:42.060 回答