图1:对话框的模态优先权 |
注意,这种新型的模态模型并没有实现一个系统模态,这将会阻断(Java或其它)所有被显示在桌面上的应用程序,而只有一个模式对话框处于活动状态。
三、了解新的构造器
能提供真正无父窗口而不中断向后兼容对于AWT开发小组来说是一个挑战。在JDK 5.0及以前的版本中,允许传递null作为JDialog或Jwindow的父窗口。这意味着,一不可见的共享所有者的框架窗口将成为这个对话框或窗口的父窗口。这个共享所有者的框架窗口的创建是为了创建无父窗口对话框。这种情况直到Java SE 6才得以成功-Java SE 6引入了新型的文档-模式对话框能够阻止所有的窗口使用相同的文档。
因而,工具箱会知道这样的对话框或窗口是没有null父窗口的。在Mustang中,仍然允许传递null作为一个父窗口到旧式的JDialog或JWindow构造器中。并且这可以完成相同的事情:其成为共享的所有者框架窗口而不是成为父窗口,这也照顾了向后兼容问题。然而,现在能把null传递到Dialog或Window构造器中,而且也能传递到新的JDialog或JWindow构造器中,这意味着这些对话框能够真正成为无父窗口。
下面列举的是一些比较有用的构造器:
·JDialog(Dialog owner)
创建一个无标题并用一个指定的对话框作为其父窗口的无模式对话框
·JDialog(Dialog owner,boolean modal)
用指定的所有者Dialog和模态创建一个具有指定的模态和所有者对话框的对话框
·JDialog(Dialog owner,String title)
创建一个具有指定的标题和所有者对话框的无模式对话框
·JDialog(Dialog owner,String title,boolean modal)
创建一个具有指定的标题,模态和所有者对话框的对话框
·JDialog(Dialog owner,String title,boolean modal,GraphicsConfiguration gc)
创建一个具有指定的标题,模态和所有者对话框和GraphicsConfiguration的对话框
·JDialog(Frame owner)
创建一个无标题但用指定的框架作为其所有者的无模式对话框
·JDialog(Window owner,String title,Dialog.ModalityType modalityType)#p#分页标题#e#
创建一个具有指定的标题,模态和所有者窗口的对话框
有关这里每个构造器的更多细节请参考Mustang有关文档。
四、 与所有者窗口一同工作
如前面所提及的,当一个窗口或一个对话框是另一个窗口的父亲时,就称为该父组件"拥有"它的孩子。在此,当在新的模态模式下与所有者窗口一同工作时,你应该注意几件事情:
·创建一个没有所有者的文档-模式对话框。在这种情况中,因为Dialog是Window的一个子类;所以,如果一个Dialog实例没有所有者的话,它自动地成为该文档的根。这样,如果这个对话框是文档-模式的,那么它的阻断范围是空的,并且其行为就象一个无模式对话框。
·创建一个有所有者的应用程序-模式或工具箱-模式对话框。一个应用程序-模式或文档-模式对话框的阻断范围并不依靠它的所有者。在这种情况中,所有者所唯一影响的是Z-顺序(顶级组件的相对顺序)。如果你有两个窗口,一个遮住另一个,第一个窗口位于第二窗口上面,那么最顶端的窗口通常是一个活动的窗口。一个相关概念是"总是位于顶层",这时一个窗口总是出现在系统中所有其它窗口之上。对话框总是会位于它的所有者的上部。
·在运行时刻改变模态类型。改变一可见的对话框的模态类型可能没有什么影响,直到该对话框被隐蔽并且被再次显示。
下列代码实例展示了新型的模态API的应用,其中包括现在可灵活在应用于对话框窗口的java.awt.Dialog.ModalExclusionType和 java.awt.Dialog.ModalityType。图2显示出当你运行该代码后的最终结果。
import java.awt.*; import java.awt.event.*; import sun.awt.*; public class ModalityDemo2 { // 第一个文档(red):框架,无模式对话框,文档-模式对话框 private static Frame f1; private static Dialog d11; //……省略,详见所附源码文件 |
图2: 被阻断的和未被阻断的对话框 |
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); |
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); } } |
JFrame f = new JFrame(...); f.setAlwaysOnTop(true); f.setVisible(true); JDialog d = new JDialog(frame, "Dialog", true); d.setVisible(true); |
评论 {{userinfo.comments}}
{{child.content}}
{{question.question}}
提交