Merlin的魔力:另一个简单的Frame

在阅读 J2SE 平台最新发行版的增强功能时,您会立即注意到 Sun 最终还是听取了我们的建议。我并不是要暗示以前他们根本不听我们的建议,但他们好象把注意力更多地放在添加大规模的 API 上,而不是修补那些已经投入使用几年的 API 上。例如 AWT Frame. 类。虽然 Sun 在版本 1.2 中添加了通过编程将 Frame. 图标化的功能,您仍然无法隐藏 Title bar 或将 Frame. 最大化。虽然您可以使用 Window 来避开 Title bar,但一些任务要求的是一个顶级的 Frame. 而不是窗口。基本上不会出现侥幸的情况。

现在,使用 1.4 发行版,您可以通过编程隐藏特定于平台的窗口修饰,如 Title bar,并将 Frame. 最大化。这两种功能都是早在 1997 年就被首次提出的。无修饰 Frame. 支持的产生是由于在 1997 年春季,Sun 的错误数据库记录了相关错误,错误标识号为 4038769,Frame. 缩放支持在 1997 年 8 月被提出,错误标识号为 4071554。我将在本文中说明如何使用这两种功能。

无修饰的 Frame

使用这两种功能的最简单之处是支持无修饰 Frame。要隐藏 Frame. 上的 Title bar,需要将指定 Frame. 的 undecorated 属性设为 true 。缺省情况下,该值为 false ,当 Frame. 显示出来后,您就无法更改此设置(如果您尝试更改的话,系统会抛出一个 IllegalComponentStateException 异常)。

清单 1. 创建一个无修饰的 Frame

Frame. frame. = new Frame();  frame.setUndecorated(true);

由于 Title bar 和其它的窗口修饰现在都已被隐藏,您无法依靠底层窗口管理系统提供对拖曳 Frame. 的支持。您必须自己用一对鼠标侦听器来添加该支持。

清单 2. 添加拖曳支持

// Avoid creating a point with each mousePressed() call  Point rigin = new Point();  frame.addMouseListener(new MouseAdapter() {   public void mousePressed(MouseEvent e) {    origin.x = e.getX();    origin.y = e.getY();   }  });  frame.addMouseMotionListener(new MouseMotionAdapter() {   public void mouseDragged(MouseEvent e) {    Point p = frame.getLocation();    frame.setLocation(     p.x + e.getX() - origin.x,     p.y + e.getY() - origin.y);   }  });

最大化 Frame

版本 1.2 中添加了 setState() 方法可实现编程控制图标化。现在,在版本 1.4 中用的是 setExtendedState() 方法。这种方法使用可接受状态(共 4 种)的位掩码标志。第 5 个标志 MAXIMIZED_BOTH ,是其它两者的组合。可接受状态有:

NORMAL — Frame. 正常大小状态

ICONIFIED — 图标化状态

MAXIMIZED_BOTH — Frame. 最大化状态(水平最大化和垂直最大化)

MAXIMIZED_HORIZ — 水平最大化状态(窗口环境可能不支持)

MAXIMIZED_VERT — 垂直最大化状态(窗口环境可能不支持)

通常情况下,您可能只用前 3 种状态。如果您发现需要组合状态,比如您希望将 Frame. 图标化,但又要保留其当前最大化状态,您就要使用竖线( | )组合多种状态。然后,一旦您已经确定了正确的状态,就要使用新的 setExtendedState() 方法来更改 Frame. 状态。

清单 3. 保留最大化状态

// Preserve maximized  frame.setExtendedState(Frame.ICONIFIED   | frame.getExtendedState());

一个完整的示例

下面是一个完整的示例,它隐藏 Frame. 修饰,然后添加用于最大化、正常化、图标化(最小化)窗口的窗口按钮,并通过简单的 AWT 按钮组件关闭这个 Frame。除了按钮之外,还有一个区域可供拖曳 Frame。

清单 4. Frame. 修饰的完整示例

import java.awt.*;import java.awt.event.*;public class FrameTest {  static Point rigin = new Point();  public static void main (String args[]) {   final Frame. frame. = new Frame();   frame.setUndecorated(true);   frame.addMouseListener(new MouseAdapter() {    public void mousePressed(MouseEvent e) {     origin.x = e.getX();     origin.y = e.getY();    }   });   frame.addMouseMotionListener(new MouseMotionAdapter() {    public void mouseDragged(MouseEvent e) {     Point p = frame.getLocation();     frame.setLocation(      p.x + e.getX() - origin.x,      p.y + e.getY() - origin.y);    }   });   frame.setSize(300, 300);   Button b1 = new Button("Maximize");   b1.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {     frame.setExtendedState(Frame.MAXIMIZED_BOTH);    }   });   Button b2 = new Button("Iconify");   b2.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {     // Preserve maximizing     frame.setExtendedState(Frame.ICONIFIED      | frame.getExtendedState());    }   });   Button b3 = new Button("Normal");   b3.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {     frame.setExtendedState(Frame.NORMAL);    }   });   Button b4 = new Button("Close");   b4.addActionListener(new ActionListener() {    public void actionPerformed(ActionEvent e) {     System.exit(0);    }   });   frame.setLayout(new GridLayout(5,1));   frame.add(b1);   frame.add(b2);   frame.add(b3);   frame.add(b4);   frame.show();  }}

不要等待机会,而要创造机会。

Merlin的魔力:另一个简单的Frame

相关文章:

你感兴趣的文章:

标签云: