科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道全面剖析Java 6中新型模态对话框API(2)

全面剖析Java 6中新型模态对话框API(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

 对话框,是指一个最顶层的拥有标题和边框的弹出窗口,典型地应用于用户进行某种形式的输入操作。在JDK 5.0和早期版本中,构建一个对话框时,它必须拥有一个作为它的所有者窗口的框架窗口或另一个对话框,即使窗口是不可见的。

来源:IT专家网 2008年5月5日

关键字: 对话框 模态 Java 6 java

  • 评论
  • 分享微博
  • 分享邮件
 下列代码实例展示了新型的模态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: 被阻断的和未被阻断的对话框

  一个使用DOCUMENT_MODAL的对话框会阻止相同文档中的所有顶层窗口的输入,除了它自己的子窗口层次之外。一个文档是一种没有所有者的顶层窗口。它可以被当作单个文档的子窗口和顶层窗口。因为每一个顶层窗口必须属于某文档,所以它的根可以在没有所有者的最顶层窗口中找到。

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);
}
}

五、 有关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()方法

  一个模式对话框应该总是位于所有的被其阻断的窗口之上。这样,如果一被阻断的窗口被送到前面,那么它的阻断对话框,如果有的话,也被送到前面并且位于被阻断的窗口之上。同样,如果一模式对话框被送到后面,那么所有它的被阻断的窗口被送到后面以使其位于阻断对话框下面。

  (三) 最小化,最大化和关闭被阻断的窗口

  当一个模式对话框阻断一个窗口时,用户可能无法最小化或最大化被阻断的窗口。然而,实际行为并未特别指出并且是平台依赖的。在任何情况下,用户都不能交互式地关闭被阻断的窗口。但是它能被通过编程方式关闭-通过在被阻断的窗口上调用setVisible(false)或dispose()方法。

  (四) 激活被阻断的窗口

  当用户选择一个被阻断的窗口时,它有可能连同阻断模式对话框一起被送到前端,然后它成为当前活动窗口。然而,实际行为并未特别指出并且是平台依赖的。

  (五) 隐藏模式对话框

  当具有当前焦点的模式对话框被隐藏时,它的所有者未被阻断而有可能成为活动窗口。然而,实际行为并未特别指出并且是平台依赖的。如果要被隐藏的模式对话框不具有焦点,那么活动窗口保持不变。

  (六) 安全性

  为了显示工具箱-模式对话框,需要一种特殊的AWTPermission,toolkitModality。例如,这将防止从applet中显示的模式对话框被浏览器或JWS(Java Web Start)的软件所阻断。

  相同的权限需要用于从工具箱模态中排除一个窗口。例如,这将防止一个从applet中显示的对话框被浏览器或JWS的模式对话框所阻断。

  (七) 平台支持

  有两个java.awt.Toolkit方法允许你检查是否当前平台支持特定的模态特征:

  ·isModalityTypeSupported(modalityType),返回是否给定的模态类型为当前平台所支持。如果不支持模式M并且一个对话框被设置为M-modal,那么其行为就象一个无模态对话框。

  ·isModalExclusionTypeSupported(modalExclusionType),返回是否给定的模态exclusion类型为当前平台所支持。如果不支持exclusion类型E并且一个窗口被标记为E-excluded,那么这没有任何影响。

  六、兼容性

  默认的模态类型是应用程序模式,它被如Dialog.setModal(true),Dialog(owner,true)等API所用调用。在JDK 6以前,默认类型是工具箱-模式,但是在应用程序模态和工具箱模态之间的唯一区别在于从JWS软件中激活applet和应用程序方面。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章