程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Merlin的魔力: 另一個簡單的Frame

Merlin的魔力: 另一個簡單的Frame

編輯:關於JAVA

在閱讀 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 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);
   }
  });

最大化 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 origin = 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();
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved