複製鏈接
請複製以下鏈接發送給好友

AWT

鎖定
AWT(Abstract Window Toolkit),中文譯為抽象窗口工具包,該包提供了一套與本地圖形界面進行交互的接口,是Java提供的用來建立和設置Java的圖形用户界面的基本工具。AWT中的圖形函數與操作系統所提供的圖形函數之間有着一一對應的關係,稱之為peers,當利用AWT編寫圖形用户界面時,實際上是在利用本地操作系統所提供的圖形庫。由於不同操作系統的圖形庫所提供的樣式和功能是不一樣的,在一個平台上存在的功能在另一個平台上則可能不存在。為了實現Java語言所宣稱的“一次編寫,到處運行(write once, run anywhere)”的概念,AWT不得不通過犧牲功能來實現平台無關性,也即AWT所提供的圖形功能是各種操作系統所提供的圖形功能的交集。
中文名
抽象窗口工具包
外文名
Abstract Window Toolkit
縮    寫
AWT
編程語言
Java
功    能
圖形用户界面(GUI)工具包

AWT術語名稱

抽象窗口工具箱(AWT)

AWT術語解釋

AWT工具 AWT工具
抽象窗口工具包 (Abstract Windowing Toolkit) (AWT)是Java的平台獨立的窗口系統,圖形和用户界面器件工具包。AWT是Java基礎類 (JFC)的一部分,為Java程序提供圖形用户界面(GUI)的標準API。
AWT提供了JavaApplet和Java Application中可用的用户圖形界面GUI中的基本組件(components)。由於Java是一種獨立於平台的程序設計語言,但GUI卻往往是依賴於特定平台的,Java採用了相應的技術使得AWT能提供給應用程序獨立於機器平台的接口,這保證了同一程序的GUI在不同機器上運行具有類似的外觀(不一定完全一致)。
Java1.0的AWT(舊AWT)和Java1.1以後的AWT(新AWT)有着很大的區別,新的AWT克服了舊AWT的很多缺點,在設計上有較大改進,使用也更方便,這裏主要介紹新的AWT, 但在Java1.1及以後版本中舊的AWT的程序也可運行。
Abstract Window Toolkit(AWT)是一個圖形過程庫,使用Java語言通過位圖顯示來操縱窗口。最後設計者又將AWT擴充為Alternative Window工具箱和Applet Widget工具箱。最新的GUI接口稱為Swing,擴展了AWT,程序開發人員可以利用Swing生成獨立於平台的GUI對象。 [1] 

AWT區別介紹

抽象窗口工具包AWT (AbstractWindow Toolkit) 是 API為Java 程序提供的建立圖形用户界面GUI (Graphics User Interface)工具集,AWT可用於Java的applet和applications中。它支持圖形用户界面編程的功能包括: 用户界面組件;事件處理模型;圖形和圖像工具,包括形狀、顏色和字體類;佈局管理器,可以進行靈活的窗口布局而與特定窗口的尺寸和屏幕分辨率無關;數據傳送類,可以通過本地平台的剪貼板來進行剪切和粘貼。

AWT優勢

AWT AWT
Java釋出的時候,AWT作為Java最弱的組件受到不小的批評。最根本的缺點是AWT在原生的用户界面之上僅提供了一個非常薄的抽象層。例如,生成一個AWT的複選框會導致AWT直接調用下層原生例程來生成一個複選框。不幸的是,一個Windows平台上的複選框同MacOS平台或者各種UNIX風格平台上的複選框並不是那麼相同。這種糟糕的設計選擇使得那些擁護Java“一次編寫,到處運行 (write once, run anywhere)”信條的程序員們過得並不舒暢,因為AWT並不能保證他們的應用在各種平台上表現得有多相似。一個AWT應用可能在Windows上表現很好可是到了Macintosh上幾乎不能使用,或者正好相反。在90年代,程序員中流傳着一個笑話:Java的真正信條是“一次編寫,到處測試 (write once, test everywhere)”。導致這種糟糕局面的一個可能原因據説是AWT從概念產生到完成實現只用了一個月。
在第二版的Java開發包中,AWT的器件很大程度上被Swing工具包替代。Swing通過自己繪製器件而避免了AWT的種種弊端:Swing調用本地圖形子系統中的底層例程,而不是依賴操作系統的高層用户界面模塊。 [1] 

AWT層次結構

AWT層次特點

Java.awt包的層次結構 Java.awt包的層次結構
在AWT中,所有能在屏幕上顯示的組件(component)對應的類,均是抽象類Component的子類或子孫類。這些類均可繼承Component類的變量和方法。 Container類是Component的子類,它也是一個抽象類,它允許其他的組件(Component)加入其中。加入的Component也允許是Container類型,即允許多層嵌套的層次結構,Container類在將組件以合適的形式安排在屏幕上時很有用,它有兩個子類,Panel和Window,它們不是抽象類。

AWT獨立

Window對應的類為java.awt.Windows, 它可獨立於其他Container而存在,它有兩個子類, Frame和Dialog, Frame是具有標題(title)和可伸縮的角(resize corner)的窗口(Window)。Dialog則沒有菜單條,雖然它能移動,但不能伸縮。
滾動面板(ScrollPane)也是Window類的子類,這裏就不討論了。
Panel對應的類為java.awt.Panel,它可包含其他Container類型的組件,或包含在瀏覽器窗口中。Panel標識了一個矩形區域,該區域允許其他組件放入。Panel必須放在Window或其子類中才能顯示。

AWT使用方法

java.awt包提供了基本的java程序的GUI設計工具。主要包括下述三個概念:
  • 組件--Component
  • 容器--Container
  • 佈局管理器--LayoutManager

AWT組件

組件(Conponent)是圖形用户界面最基本的部分,也稱為構件,是可以以圖形化的方式顯示在屏幕上,並能與用户進行交互的對象,例如一個按鈕,一個標籤等。組件不能獨立地顯示出來,必須將其放在一定的容器中才可以顯示。 類java.awt.Component是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等。 [2] 
  • AWT常用組件
組件名稱
構造方法
使用説明
按鈕(Button)
Button b=new Button("退出");
單擊按鈕產生ActionEvent事件,實現ActionListener接口並重寫actionPerformed()方法監聽和處理事件
複選框(Checkbox)
Checkbox ch=new Checkbox("one",true);
選中複選框產生ItemAction事件,實現ItemListener接口監聽和處理事件
下拉菜單(Choice)
Choice colorChoose=new Choice();
實現ItemListener接口監聽和處理事件;Add()方法可在下拉列表中添加選項
畫布(Canvas)
public Canvas(GraphicsConfigurationconfig);
重寫Canvas類的paint()方法實現完成圖形處理;實現MouseListener和KeyListener接口監聽Canvas組件的鼠標和鍵盤事件
文本框(TextField)
TextField ft=new TextField(16);
//寬度為16個字符
文本框只能顯示一行,按Enter鍵時產生ActionEvent事件,通過ActionListener接口中的actionPerformed()方法處理事件
文本域(TextAera)
TextArea ta=new TextArea("Textarea",4,10);
//4行10列
可顯示多行多列文本和滾動條
列表框(List)
List list=new List(4,false);
//4行,不允許多選
提供多個文本選項,支持滾動條,可以瀏覽多項
對話框(Dialog)
-
Window類的子類
文件對話框(FileDialog)
Filedialog fd=new Filedialog(frm,"fileddilog");
當用户想打開或存儲文件時,可使用文件對話框進行操作
菜單欄(MenuBar)
MenuBar mb=new MenuBar();
通過frm.setMenuBar(mb)語句可將菜單mb設置為Frame對象frm的主菜單
下拉菜單(Menu)
Menu m=new Menu("Menu");
通過mb.add(m)可將m下拉列表添加到菜單欄中
菜單項(MenuItem)
MenuItem mi=new MenuItem("Openit");
通過mi.add(mi)將菜單項mi添加到下一個下拉列表m中。
顏色(Color)
//非構造方法,兩種方法設置組件背景色
setBackground(Color.BLUE);
setBackground(newColor(100,100,100));
通過setForeground()方法設置組件前景色,通過setBackground()方法設置組件背景色。顏色值可使用Color類的顏色常量來設置,也可通過指定RGB顏色對象值設置
字體(Font)
Font font=new Font("宋體",Font.BOLD,10);
//宋體,10號,加粗
按順序向Font()構造方法傳遞有關字體設置的參數

AWT容器

容器(Container)也是一個類,實際上是Component的子類,因此容器本身也是一個組件,具有組件的所有性質,但是它的主要功能是容納其它組件和容器。容器可以簡化圖形化界面的設計,以整體結構來佈置界面。所有的容器都可以通過add()方法向容器中添加組件。常用的容器3種:Panel, Frame, Applet。 [2] 
  1. 框架(Frame)
Frame frm = new Frame("New Window");
要生成一個窗口,通常使用Window的子類Frame類進行實例化,而不是直接使用Window 類,框架的外觀就像平常Windows系統下的窗口,有標題、邊框菜單和大小等。setSize()方法可以設置框架尺寸的大小,setVisibe()方法可以設置窗口的可見性。
2. 面板(Panel)
構造方法:
Panel pnl = new Panel();
面板是一種透明的容器,沒有標題和邊框。與Frame 不同,Panel不能作為最外層的容器單獨存在,它首先必須作為一個組件放置在其他容器(一般為Frame)中,然後把組件添加到它裏面。在java.swing中則是JPanel
構造方法:
Applet apt = new Applet();
框架一般用作Java應用程序的窗口,而Applet是Java小程序的窗口。與Frame不同,Applet是在網頁中顯示的,也可以通過添加Panel進行組件佈局。
public class ContainerComponent {
    public static void main(String[] args) {
        //創建一個frame框架
        Frame frame=new Frame();
        //設置Java窗體組件的名稱
        frame.setTitle("JavaGUIComponent");
        //設置窗體的頂點位置及其大小
        frame.setBounds(20,30,300,280);
        //設置窗體是否可見
        frame.setVisible(true);
        //設置窗體背景顏色
        frame.setBackground(Color.gray);
        frame.add(new List());
        /*給窗體添加監聽器的方法改變窗體狀態,監聽器的參數是一個內部類,
         *     內部類定義了窗體關閉的處理方法
         */
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        
        //創建一個panel面板
        Panel panel=new Panel();
        //給panel面板添加文本框、文本域、列表、單選按鈕、複選按鈕、畫布、標籤、字體大小、事件、滾動條
        panel.add(new TextField(20));
        panel.add(new Button("Click me!"));
        
        frame.add(panel);
    }
}

AWT佈局管理器

佈局管理器(LayoutManager):每個容器都有一個佈局管理器,當容器需要對某個組件進行定位或判斷其大小、尺寸時,就會調用其對應的佈局管理器。使用佈局管理器可以實現跨平台的特性,並且獲得動態的佈局效果。佈局管理器負責管理組件的排列順序、大小和位置。不同的佈局管理器使用不同的佈局策略,容器可以通過選擇不同的佈局管理器來決定如何佈局。 [2] 
流佈局管理器(FlowLayout)
FlowLayout是Panel 和 Applet 的默認佈局管理器。在該佈局管理器中,組件在容器中按照從上到下,從左到右的順序進行排列,行滿後則換行。
構造方法較多,例如:
  • FlowLayout();默認構造方法,設置居中對齊方式,橫向和縱向間隔均為默認5像素
  • FlowLayout(FlowLayout.LEFT);設置居左對齊,橫向和縱向間隔均為默認5像素
  • FlowLayout(FlowLayout.RIGHT,20,40);設置居右對齊,橫向間隔20像素,縱向間隔40像
邊邊界佈局管理器(BorderLayout)
構造方法:
BorderLayout bl = new BorderLayout();
BorderLayout是Window、Frame和Dialog的默認佈局管理器,其將容器分成North、South、East、West和Center 5個區域,每個區域只能放置一個組件。在使用add()方法添加組件到容器時,必須指定將其放置在哪個區域中。使用BorderLayout時,如果容器大小發生變換,組件的相對位置不變。 [2] 
構造方法:
GridLayout gl = new GridLayout(3,5); //3行5列
GridLayout 可使容器中的各個組件呈網格狀佈局,平局佔據容器的空間,即使容器的大小發生變化,每個組件還是平均佔據容器的空間。和FlowLayout一樣,GridLayout也是按照從上到下,從左到右的規律進行排列的。
卡片佈局管理器(CardLayout)
構造方法:
CardLayout cl = new CardLayout();
CardLayout能夠幫助用户處理兩個乃至跟多的成員共享同一顯示空間。它把容器分成許多層,每層的顯示空間佔據整個容器的大小,並且每層之允許反之一個組件,可以通過Panel來實現每層複雜的用户界面。

AWT實例

使用Frame的例子:
import java.awt.*;
public class MyFrame extends Frame{
public static void main(String args[ ]){
MyFrame fr = new MyFrame("Hello Out There!");
//構造方法
fr.setSize(200,200);
//設置Frame的大小,缺省為(0,0)
fr.setBackground(Color.red);
//設置Frame的背景,缺省為紅色
fr.setVisible(true);
//設置Frame為可見,缺省為不可見
}
public MyFrame (String str){
super(str); //調用父類的構造方法
}
}
以下是一個FlowLayout示例小程序代碼: 
package org.gan.awt;
import java.awt.Button;
import java.awt.Frame;
import java.awt.Panel;
public class FlowLayoutManager {
public static void main(String[] args) {
// 創建Frame對象
Frame f = new Frame();
// 創建panel容器
Panel p = new Panel();
p.add(new Button("1"));// 默認垂直居中,間距為5
p.add(new Button("2"));
p.add(new Button("3"));
p.add(new Button("4"));
p.add(new Button("5"));
p.add(new Button("6"));
p.add(new Button("7"));
p.add(new Button("8"));p.add(new Button("9"));
f.add(p);
// 設置Frame標題
f.setTitle("我的第二個FlowLayoutManager程序");
// 設置Frame尺寸,默認為(0,0) f.setSize(200, 200);
// 設置是否可見,默認為false
f.setVisible(true);
}
}
結果為:
FlowLayout程序運行圖片 FlowLayout程序運行圖片
參考資料
  • 1.    Abstract Window Toolkit  .TechTarget[引用日期2015-08-23]
  • 2.    希賽教育等考學院 盧豔芝.二級Java語言程序設計.北京:機械工業出版社,2014:149-156