文档

Java™ 教程
隐藏目录
如何在对话框中使用模态
路径: 使用Swing创建GUI
课程: 使用其他Swing特性

如何在对话框中使用模态性

Java™ SE 6已解决了在早期版本中出现的模态问题。新的模态模型使开发人员能够对对话框的模态阻塞进行范围或限制。

在继续使用新的模态模型之前,请查看以下术语:

在Java SE 6中,模态和非模态对话框的行为已经更改,以便它们始终出现在其父窗口和所有阻塞窗口的顶部。

Java SE 6支持以下模态类型:

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


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

ModalityDemo示例演示了上面提到的四种模态类型中的前三种。

展示不同模态类型的四个框架
此图已经缩小以适应页面。
点击图像以查看其原始大小。

尝试一下: 
  1. 点击“Launch”按钮,使用Java™ Web Start运行ModalityDemo(下载JDK 7或更高版本)。或者,要自己编译和运行示例,请参考示例索引启动ModalityDemo应用程序
  2. 将出现以下对话框:
    • Book 1(父框架)
    • Book 2(父框架)
    • Feedback(父框架)
    • Classics(排除框架)
  3. 切换到Book 1框架,选择书的Biography标题,然后选择OK。
  4. Biography标题将显示在对话框的标题中。在文本字段中输入名称,例如-“John”。
  5. 切换到Book 1框架,将标题更改为Funny Tale,然后选择OK。由于输入名称的对话框是非模态的,您可以轻松切换到其框架。

    注意: 非模态对话框的标题已更改为Funny Tale。
  6. 在非模态对话框中选择OK。
  7. 将显示Funny tale文档模态对话框。
  8. 在文本字段中键入一些文本。注意它由您在非模态对话框中输入的名称签名。
  9. 切换到非模态对话框并尝试更改您的名称。您将无法这样做,因为文档模态对话框会阻塞其父层次结构中的所有窗口。
  10. 对于Book 2父框架,执行相同的操作序列(步骤3-9)。
  11. 尝试切换到不同的对话框。您会注意到您可以切换到Classics框架或Feedback框架,以及Book 1框架或Book 2框架的对话框。
  12. 切换到Feedback父框架。选择Rate Yourself。
  13. 将出现确认对话框。尝试切换到不同的对话框。您只能切换到Classics对话框,因为标准的确认对话框是一个应用程序模态对话框,它会阻塞来自同一应用程序的所有窗口。但是,您会注意到您可以在Classics框架中选择您最喜欢的古典作家。此框架使用了APPLICATION_EXCLUDE模态排除类型,可以防止任何应用程序模态对话框阻塞所有顶层窗口。

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

//图书1父框架
f1 = new JFrame("图书1(父框架)");

...

//非模态对话框
d2 = new JDialog(f1);

...
        
//文档模态对话框
d3 = new JDialog(d2, "", Dialog.ModalityType.DOCUMENT_MODAL);

...

//图书2父框架
f4 = new JFrame("图书2(父框架)");

...

//非模态对话框
d5 = new JDialog(f4);

...

//文档模态对话框
d6 = new JDialog(d5, "", Dialog.ModalityType.DOCUMENT_MODAL);
        
...

//排除框架
f7 = new JFrame("经典著作(排除框架)");
f7.setModalityExclusionType(Dialog.ModalExclusionType.APPLICATION_EXCLUDED);
        
...

//反馈父框架和确认对话框
f8 = new JFrame("反馈(父框架)");
...

JButton b8 = new JButton("评价自己");
b8.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showConfirmationDialog(null,
                                           "我真的喜欢我的书",
                                           "问题(应用程序模态对话框)", 
                                           JOptionPane.YES_NO_OPTION,
                                           JOptionPane.QUESTION_MESSAGE); 
    }
});

ModalityDemo.java文件中可以找到完整的示例代码。

在Java SE 6中,您可以创建一个没有父级的文档模态对话框。因为Dialog类是Window类的子类,所以如果一个Dialog实例没有所有者,它会自动成为文档的根。因此,如果这样的对话框是文档模态的,它的阻塞范围为空,它的行为就像一个非模态对话框。

模态API

JDialog类的构造函数可以创建不同模态类型的对话框。

构造函数 目的
JDialog(Dialog owner) 创建一个指定Dialog所有者但没有标题的非模态对话框。
JDialog(Dialog owner, boolean modal) 创建一个具有指定Dialog所有者和模态性的对话框。
JDialog(Dialog owner, String title) 创建一个指定Dialog所有者和标题的非模态对话框。
JDialog(Dialog owner, String title, boolean modal) 创建一个具有指定Dialog所有者、标题和模态性的对话框。
JDialog(Dialog owner, String title, boolean modal, GraphicsConfiguration gc) 创建一个具有指定Dialog所有者、标题、模态性和图形配置的对话框。
JDialog(Frame owner) 创建一个指定Frame所有者但没有标题的非模态对话框。如果所有者的值为null,则将设置一个共享的隐藏框架作为对话框的所有者。
JDialog(Window owner, String title, Dialog.ModalityType modalityType) 创建一个具有指定Window所有者、标题和模态性的对话框。

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

方法 目的
getModalityType 返回此对话框的模态类型。
setModalityType 设置此对话框的模态类型。请参见ModalityType以获取可能的模态类型。如果给定的模态类型不受支持,则使用MODELESS类型。要确保模态类型已设置,请在调用此方法后调用getModalityType()方法。

使用模态API的示例

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

示例 所述位置 注释
ModalityDemo 本节 创建不同模态类型的对话框,演示了这些类型的作用域阻塞。

上一页: 如何使用键绑定
下一页: 如何打印表格