AWT

建立和設置Java界面的工具

AWT(Abstract Window Toolkit),中文譯為抽象窗口工具包,該包提供了一套與本地圖形界面進行交互的介面,是Java提供的用來建立和設置Java的圖形用戶界面的基本工具。AWT中的圖形函數與操作系統所提供的圖形函數之間有著一一對應的關係,稱之為peers,當利用AWT編寫圖形用戶界面時,實際上是在利用本地操作系統所提供的圖形庫。由於不同 操作系統的圖形庫所提供的樣式和功能是不一樣的,在一個平台上存在的功能在另一個平台上則可能不存在。為了實現Java語言所宣稱的“一次編寫,到處運行(write once, run anywhere)”的概念,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對象。

區別

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

優勢

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調用本地圖形子系統中的底層常式,而不是依賴操作系統的高層用戶界面模塊。

層次結構


層次

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

獨立

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

使用方法


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

組件

組件(Conponent)是圖形用戶界面最基本的部分,也稱為構件,是可以以圖形化的方式顯示在屏幕上,並能與用戶進行交互的對象,例如一個按鈕,一個標籤等。組件不能獨立地顯示出來,必須將其放在一定的容器中才可以顯示。類java.awt.Component是許多組件類的父類,Component類中封裝了組件通用的方法和屬性,如圖形的組件對象、大小、顯示位置、前景色和背景色、邊界、可見性等。
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()構造方法傳遞有關字體設置的參數

容器

容器(Container)也是一個類,實際上是Component的子類,因此容器本身也是一個組件,具有組件的所有性質,但是它的主要功能是容納其它組件和容器。容器可以簡化圖形化界面的設計,以整體結構來布置界面。所有的容器都可以通過add()方法向容器中添加組件。常用的容器3種:Panel, Frame, Applet。
1.框架(Frame)
構造方法:
要生成一個窗口,通常使用Window的子類Frame類進行實例化,而不是直接使用Window 類,框架的外觀就像平常Windows系統下的窗口,有標題、邊框、菜單和大小等。setSize()方法可以設置框架尺寸的大小,setVisibe()方法可以設置窗口的可見性。
2.面板(Panel)
構造方法:
面板是一種透明的容器,沒有標題和邊框。與Frame 不同,Panel不能作為最外層的容器單獨存在,它首先必須作為一個組件放置在其他容器(一般為Frame)中,然後把組件添加到它裡面。在java.swing中則是JPanel。
3.小程序(Applet)
構造方法:
框架一般用作Java應用程序的窗口,而Applet是Java小程序的窗口。與Frame不同,Applet是在網頁中顯示的,也可以通過添加Panel進行組件布局。

布局管理器

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

實例

使用Frame的例子:
以下是一個FlowLayout示例小程序代碼:
結果為:
FlowLayout程序運行圖片
FlowLayout程序運行圖片