个文档是一种没有所有者的顶层窗口。它可以被当作单个文档的子窗口和顶层窗口。因为每一个顶层窗口必须属于某文档,所以它的根可以在没有所有者的最顶层窗口中找到。
d22.setBounds(sw - 500 + 32, 232, 300, 200);
d22.addWindowListener(closeWindow);
d22.setLayout(new BorderLayout());
l = new Label("DOCUMENT_MODAL");
l.setBackground(Color.BLUE);
l.setAlignment(Label.CENTER);
l.setFont(labelFont);
d22.add(l, BorderLayout.CENTER);
//第三个文档
f3 = new Frame("Excluded Frame");
f3.setModalExclusionType(
Dialog.ModalExclusionType.APPLICATION_EXCLUDE);
一个被设置为APPLICATION_MODAL的对话框将会阻断在同一Java程序中的所有的顶层窗口,除了它自己的孩子窗口层次之外。如果若干applet在一浏览器中被调用,那么可以把它们当作或者是独立的应用程序或者是单个的程序。这种行为的实现要依赖具体的环境而定。
注意,下面的f3不会被APPLICATION_MODAL和DOCUMENT_MODAL对话框所阻断。
f3.setBounds(32, sh - 200 + 32, 300, 200);
f3.addWindowListener(closeWindow);
f3.setLayout(new BorderLayout());
l = new Label("EXCLUDED FRAME");
l.setBackground(Color.GREEN);
l.setAlignment(Label.CENTER);
l.setFont(labelFont);
f3.add(l, BorderLayout.CENTER);
b = new Button("I''m alive!");
f3.add(b, BorderLayout.SOUTH);
f3.setVisible(true);
// 第四个文档
f4 = new Frame("Parent Frame");
f4.setBounds(sw - 300 + 32, sh - 200 + 32, 300, 200);
f4.addWindowListener(closeWindow);
f4.setLayout(new BorderLayout());
l = new Label("FRAME");
l.setBackground(Color.GRAY);
l.setAlignment(Label.CENTER);
l.setFont(labelFont);
b = new Button("Show file dialog");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fd4.setVisible(true);
}
});
f4.add(b, BorderLayout.SOUTH);
f4.setVisible(true);
fd4 = new FileDialog(f4, "File Dialog", FileDialog.LOAD);
为了向后兼容性起见,File对话框缺省是APPLICATION_MODA。
fd4.setBounds(sw - 400 + 32, sh - 300 + 32, 300, 200);
}
}
Java 6中新型模态对话框API解析(4)
时间:2011-02-15 天极 朱先忠
五、 有关AWT特性
下面是其它一些在使用新的模态模态时要了解的AWT特性。
(一) 总在最上面
当一个并不总是位于顶层的模式对话框阻断一个总是位于顶层的窗口时,它们的相对Z-序未特别指出并且是平台依赖的。下列实例表明这个问题:
JFrame f = new JFrame(...);
f.setAlwaysOnTop(true);
f.setVisible(true);
JDialog d = new JDialog(frame, "Dialog", true);
d.setVisible(true);
这段代码制造了一种矛盾:一方面,d必须位于f之上(因为它是一个模式对话框并且应该阻断f)。而另一方面,f必须必须位于d之上,因为f被设置为总是位于顶层,而d不是。如此情形是未特别指出的。然而,总是有解决办法:如果d也被设置为总是位于顶层(d.setAlwaysOnTop(true)),那么该对话框将在任何时候位于框架窗口之上。
(二) toFront()和toBack()方法
一个模式对话框应该总是位于所有的被其阻断的窗口之上。这样,如果一被阻断的窗口被送到前面,那么它的阻断对话框,如果有的话,也被送到前面并且位于被阻断的窗口之上。同样,如果一模式对话框被送到后面,那么所有它的被阻断的窗口被送到后面以使其位于阻断对话框下面。
(三) 最小化,最大化和关闭被阻断的窗口
当一个模式对话 |