J2SE 1.4 允許程式化隱藏平台相關視窗修飾(標題列、邊框)。frame.setUndecorated(true) 需在 show() 前調用,否則拋出 IllegalComponentStateException。隱藏修飾後失去系統拖曳支援,需自行添加滑鼠監聽器實現拖曳:
Point origin = 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);
}
});
1.2 引入 setState() 控制圖標化,1.4 新增 setExtendedState(int) 使用位掩碼:
NORMAL:正常ICONIFIED:最小化MAXIMIZED_BOTH:水平垂直最大化MAXIMIZED_HORIZ:水平最大化MAXIMIZED_VERT:垂直最大化組合狀態用按位或 |。保留最大化同時最小化:frame.setExtendedState(Frame.ICONIFIED | frame.getExtendedState())。
隱藏修飾,添加「最大化」、「最小化」、「還原」、「關閉」四按鈕,並支援拖曳區域。使用 GridLayout(5,1) 排列。
public class FrameTest {
static Point origin = new Point();
public static void main(String[] args) {
final Frame frame = new Frame();
frame.setUndecorated(true);
// 拖曳監聽器同上
frame.setSize(300,300);
Button b1 = new Button("Maximize");
b1.addActionListener(e -> frame.setExtendedState(Frame.MAXIMIZED_BOTH));
Button b2 = new Button("Iconify");
b2.addActionListener(e -> frame.setExtendedState(Frame.ICONIFIED | frame.getExtendedState()));
Button b3 = new Button("Normal");
b3.addActionListener(e -> frame.setExtendedState(Frame.NORMAL));
Button b4 = new Button("Close");
b4.addActionListener(e -> System.exit(0));
frame.setLayout(new GridLayout(5,1));
frame.add(b1); frame.add(b2); frame.add(b3); frame.add(b4);
frame.show();
}
}