如何在对话框中使用模态

Java™SE 6 解决了平台早期版本中出现的 Pattern 问题。新的模态模型使开发人员可以限制或限制对话框的模态阻塞。

在 continue 使用新的 Pattern 模型之前,请查看以下术语:

  • 对话框-一个带有标题和边框的顶级弹出窗口,通常需要用户 Importing 某种形式的信息。对话框可以是 Pattern 对话框,也可以是非 Pattern 对话框。有关对话框的更多信息,请参见如何制作对话框页中的对话框概述

  • 模态对话框-阻止 Importing 到应用程序中其他一些顶级窗口的对话框,但以该对话框作为其所有者创建的窗口除外。模态对话框将catch窗口焦点,直到其关闭为止,通常是响应于按钮的按下。

  • 无 Pattern 对话框-一个对话框,使您可以在显示此对话框时与其他窗口一起使用。

在 Java SE 6 中,Pattern 对话框和无 Pattern 对话框的行为均已更改,因此它们不仅总是出现在其父窗口以及所有阻止的窗口的顶部。

Java SE 6 支持以下 Pattern 类型:

  • 无 Pattern 类型 -无 Pattern 对话框在可见时不会阻止任何其他窗口。

  • 文档 Pattern 类型 —文档 Pattern 对话框阻止同一文档中的所有窗口,但其子层次结构中的窗口除外。在这种情况下,文档是共享公共祖先的窗口层次结构,称为文档根,这是没有所有者的最接近的祖先窗口。

  • 应用程序 Pattern 类型 -应用程序 Pattern 对话框将阻止来自同一应用程序的所有窗口,但其子层次结构中的窗口除外。如果在浏览器环境中启动了多个 Servlets,则允许浏览器将它们视为单独的应用程序或单个应用程序。此行为取决于实现。

  • 工具箱 Pattern 类型 —工具箱 Pattern 对话框会阻止在同一工具箱中运行的所有窗口,但其子层次结构中的窗口除外。如果启动了多个 Servlets,则所有 Servlets 都将使用相同的工具箱运行。因此,从 Servlets 显示的工具箱 Pattern 对话框可能会影响其他 Servlets 以及嵌入该工具箱 Java 运行时环境的浏览器实例的所有窗口。

此外,您可以设置模态排除 Pattern:

  • 排除 Pattern -可以将任何顶级窗口标记为不被 Pattern 对话框阻止。此属性使您可以设置“Pattern 排除”Pattern。 Dialog.ModalExclusionType枚举指定可能的 Pattern 排除类型。

Note :

新的 Pattern 模型没有实现系统 Pattern,该系统 Pattern 会在 Pattern 对话框处于活动状态时阻止在桌面上显示的所有应用程序(包括 Java 应用程序)。

ModalityDemo 示例演示了上述四种 Pattern 类型中的前三种。

此数字已减少至适合页面大小。
单击图像以其自然尺寸查看.

Try this:

  • 单击启动按钮以使用Java™Web 开始(下载 JDK 7 或更高版本)运行 ModalityDemo。另外,要自己编译和运行示例,请查阅example index

  • 将出现以下对话框:

  • 书 1(父级画框)

  • 书 2(父级框架)

  • 反馈(父框架)

  • 经典作品(不含镜架)

  • 切换到“书本 1”框架并选择书的传记标题,然后选择“确定”。

  • 传记标题将显示在对话框的标题中。在文本字段中 Importing 名称,例如“ John”。

  • 切换到 Book 1 框架,然后将标题更改为 Funny Tale,然后选择 OK。由于 Importing 名称的对话框是* modeless ,因此您可以轻松切换到其 parent *框架。

Note :

无 Pattern 对话框标题已更改为“滑稽故事”。

  • 在无 Pattern 对话框中选择确定。

  • 出现童话文档 Pattern 对话框。

  • 在文本字段中 Importing 一些文本。请注意,它由您在无 Pattern 对话框中 Importing 的名称签名。

  • 切换到无 Pattern 对话框,然后try更改您的名称。您将无法执行此操作,因为文档 Pattern 对话框会阻止其父层次结构中的所有窗口。

  • 对 Book 2 父框架执行相同的操作序列(步骤 3-9)。

  • try切换到其他对话框。您会注意到,您可以切换到“经典”框架或“反馈”框架,也可以切换到“书本 1”框架或“书本 2”框架的对话框。

  • 切换到“反馈”父框架。选择 evaluation 自己。

  • 出现确认对话框。try切换到其他对话框。仅允许您切换到“经典”对话框,因为标准确认对话框是应用程序 Pattern 对话框,并且它阻止来自同一应用程序的所有窗口。但是,您会注意到,您可以在“古典”框架中选择自己喜欢的古典作者。该框架是使用APPLICATION_EXCLUDE模态排除类型创建的,该类型可以防止所有顶级窗口被任何应用程序 Pattern 对话框阻止。

下面的代码片段显示了如何创建不同 Pattern 类型的对话框:

//The Book 1 parent frame
f1 = new JFrame("Book 1 (parent frame)");

...

//The modeless dialog box
d2 = new JDialog(f1);

...
        
//The document-modal dialog box
d3 = new JDialog(d2, "", Dialog.ModalityType.DOCUMENT_MODAL);

...

        //The Book2 parent frame
f4 = new JFrame("Book 2 (parent frame)");

...

//The modeless dialog box
d5 = new JDialog(f4);

...

//The document-modality dialog box
d6 = new JDialog(d5, "", Dialog.ModalityType.DOCUMENT_MODAL);
        
...

//The excluded frame
f7 = new JFrame("Classics (excluded frame)");
f7.setModalityExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDED);
        
...

//The Feedback parent frame and Confirm Dialog box
f8 = new JFrame("Feedback (parent frame)");
...

JButton b8 = new JButton("Rate yourself");
b8.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showConfirmationDialog(null,
                                           "I really like my book",
                                           "Question (application-modal dialog)", 
                                           JOptionPane.Yes_NO_OPTION,
                                           JOptionPane.QUESTION_MESSAGE); 
    }
});

ModalityDemo.java文件中找到演示的完整代码。

在 Java SE 6 中,您可以创建一个没有父级的文档 Pattern 对话框。由于Dialog类是Window类的子类,因此Dialog实例(如果没有所有者)将自动成为文档的根。因此,如果这种对话框是文档 Pattern 的,则其阻止范围为空,并且其行为就像是无 Pattern 的对话框一样。

PatternAPI

JDialog类构造函数使您可以创建各种 Pattern 类型的对话框。

ConstructorPurpose
JDialog(Dialog owner)创建一个具有指定的Dialog所有者但没有标题的无 Pattern 对话框。
JDialog(对话框所有者,布尔 Pattern)创建一个具有指定的Dialog所有者和方式的对话框。
JDialog(对话框所有者,字符串 标题)创建一个具有指定的Dialog所有者和标题的无 Pattern 对话框。
JDialog(对话框所有者,字符串 标题,布尔 Pattern)创建一个具有指定的Dialog所有者,标题和方式的对话框。
JDialog(对话框所有者,字符串 标题,布尔 Pattern,GraphicsConfiguration gc)创建一个具有指定的Dialog所有者,标题,模态和图形配置的对话框。
JDialog(Frame owner)创建一个没有标题的具有指定的Frame所有者的无 Pattern 对话框。如果所有者的值为 null,则将共享的隐藏框架设置为对话框的所有者。
JDialog(窗口所有者,字符串 标题,Dialog.ModalityType modalityType)创建一个具有指定的Window所有者,标题和方式的对话框。

下表列出了从java.awt.Dialog类继承的方法。

MethodPurpose
getModalityType返回此对话框的模态类型。
setModalityType设置此对话框的 Pattern 类型。有关可能的方式类型,请参见ModalityType。如果不支持给定的模态类型,则使用MODELESS类型。为确保已设置模态类型,请在调用此方法后调用getModalityType()方法。

使用 PatternAPI 的示例

下表列出了在对话框中使用模态的示例。

ExampleWhere DescribedNotes
ModalityDemoThis section创建不同 Pattern 类型的对话框,演示这些类型的作用域阻止。