技术开发 频道

一个简单的 Frame

  【IT168 技术文章】

  现在,使用 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

1 Frame frame = new Frame();
2   frame.setUndecorated(true);
3

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

  清单 2. 添加拖曳支持

1 // Avoid creating a point with each mousePressed() call
2   Point origin = new Point();
3   frame.addMouseListener(new MouseAdapter() {
4     public void mousePressed(MouseEvent e) {
5       origin.x = e.getX();
6       origin.y = e.getY();
7     }
8   });
9   frame.addMouseMotionListener(new MouseMotionAdapter() {
10     public void mouseDragged(MouseEvent e) {
11       Point p = frame.getLocation();
12       frame.setLocation(
13         p.x + e.getX() - origin.x,
14         p.y + e.getY() - origin.y);
15     }
16   });
17

 

  最大化 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. 保留最大化状态

1 // Preserve maximized
2   frame.setExtendedState(Frame.ICONIFIED
3     | frame.getExtendedState());
4

 

  一个完整的示例

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

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

1import java.awt.*;
2import java.awt.event.*;
3public class FrameTest {
4  static Point origin = new Point();
5  public static void main (String args[]) {
6    final Frame frame = new Frame();
7    frame.setUndecorated(true);
8    frame.addMouseListener(new MouseAdapter() {
9      public void mousePressed(MouseEvent e) {
10        origin.x = e.getX();
11        origin.y = e.getY();
12      }

13    }
);
14    frame.addMouseMotionListener(new MouseMotionAdapter() {
15      public void mouseDragged(MouseEvent e) {
16        Point p = frame.getLocation();
17        frame.setLocation(
18          p.x + e.getX() - origin.x,
19          p.y + e.getY() - origin.y);
20      }

21    }
);
22    frame.setSize(300, 300);
23    Button b1 = new Button("Maximize");
24    b1.addActionListener(new ActionListener() {
25      public void actionPerformed(ActionEvent e) {
26        frame.setExtendedState(Frame.MAXIMIZED_BOTH);
27      }

28    }
);
29    Button b2 = new Button("Iconify");
30    b2.addActionListener(new ActionListener() {
31      public void actionPerformed(ActionEvent e) {
32        // Preserve maximizing
33        frame.setExtendedState(Frame.ICONIFIED
34           | frame.getExtendedState());
35      }

36    }
);
37    Button b3 = new Button("Normal");
38    b3.addActionListener(new ActionListener() {
39      public void actionPerformed(ActionEvent e) {
40        frame.setExtendedState(Frame.NORMAL);
41      }

42    }
);
43    Button b4 = new Button("Close");
44    b4.addActionListener(new ActionListener() {
45      public void actionPerformed(ActionEvent e) {
46        System.exit(0);
47      }

48    }
);
49    frame.setLayout(new GridLayout(5,1));
50    frame.add(b1);
51    frame.add(b2);
52    frame.add(b3);
53    frame.add(b4);
54    frame.show();
55  }

56}

57

 

 

0
相关文章