Swing app全局模态

时间:2008-11-20 08:06:01

标签: java swing modal-dialog

简单问题:

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

我尝试了以下操作,但我仍然可以点击其他应用程序窗口(例如此浏览器)

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

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

3 个答案:

答案 0 :(得分:3)

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

忽略大多数人喜欢在多个应用程序之间进行多任务的事实,打开全局模式对话框然后应用程序冻结的情况怎么样? Ctrl + Alt + Del应该可以在Windows上杀死应用程序,但我不确定Mac上的Cmd + Opt + Escape是否具有全局模态对话框(Cocoa甚至全局模态?)。没有一个Linux平台有任何好的杀死应用程序的方法,这些应用程序已经完全控制了UI(你必须完全杀死X11并从头开始新的实例)。

我的回答:找到另一种方式。我不在乎客户要求的是什么,他们不想要这个。

答案 1 :(得分:2)

JFrame并非设计为模态。使用JDialog,但你会失去一些JFrame功能。 如果您不能忍受损失,您必须阻止EventQueue并将其替换为您自己的事件,以仅接受来自阻止事件的事件。

有关使用适用于JFrame的内部框架的说明,请参阅Creating Modal Internal Frames

编辑: Oups,我的回答似乎有些偏差,因为您的代码示例显示您已经在使用Dialog子类。

答案 2 :(得分:1)

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

  1. 截取桌面的屏幕截图。
  2. 全屏。
  3. 弹出对话框。
  4. 由于桌面是虚假的屏幕截图,您可以忽略任何点击它的尝试。

    Full screen sample

    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();
    }
    

    仅供参考:Full-Screen Exclusive Mode API