这些Java教程是针对JDK 8编写的。本页面中描述的示例和实践不利用后续版本引入的改进,并且可能使用不再可用的技术。
请参阅Java语言更改,了解Java SE 9及其后续版本中的更新语言功能的摘要。
请参阅JDK发布说明,了解所有JDK版本的新功能、增强功能以及已删除或已弃用选项的信息。
Java™ SE 6已解决了在早期版本中出现的模态问题。新的模态模型使开发人员能够对对话框的模态阻塞进行范围或限制。
在继续使用新的模态模型之前,请查看以下术语:
在Java SE 6中,模态和非模态对话框的行为已经更改,以便它们始终出现在其父窗口和所有阻塞窗口的顶部。
Java SE 6支持以下模态类型:
此外,您可以设置模态排除模式:
Dialog.ModalExclusionType枚举指定可能的模态排除类型。ModalityDemo示例演示了上面提到的四种模态类型中的前三种。

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实例没有所有者,它会自动成为文档的根。因此,如果这样的对话框是文档模态的,它的阻塞范围为空,它的行为就像一个非模态对话框。
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()方法。 |
以下表格列出了使用对话框中的模态的示例。
| 示例 | 所述位置 | 注释 |
|---|---|---|
ModalityDemo |
本节 | 创建不同模态类型的对话框,演示了这些类型的作用域阻塞。 |