【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
2 frame.setUndecorated(true);
3
由于 Title bar 和其它的窗口修饰现在都已被隐藏,您无法依靠底层窗口管理系统提供对拖曳 Frame 的支持。您必须自己用一对鼠标侦听器来添加该支持。
清单 2. 添加拖曳支持
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. 保留最大化状态
2 frame.setExtendedState(Frame.ICONIFIED
3 | frame.getExtendedState());
4
一个完整的示例
下面是一个完整的示例,它隐藏 Frame 修饰,然后添加用于最大化、正常化、图标化(最小化)窗口的窗口按钮,并通过简单的 AWT 按钮组件关闭这个 Frame。除了按钮之外,还有一个区域可供拖曳 Frame。
清单 4. Frame 修饰的完整示例
import java.awt.*;2
import java.awt.event.*;3
public 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 maximizing33
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
