Java AWT基礎及布局管理
GUI(Graphical User Interface),圖形用戶界面。
Java GUI分兩種:
AWT(Abstract Window Toolkit):抽象窗口工具集,是第一代的Java GUI組件。
繪制依賴於底層的操作系統。基本的AWT庫處理用戶界面元素的方法是把這些元素的創建和行為委托給每個目標平台上(Windows、 Unix、 Macintosh等)的本地GUI工具進行處理。
Swing,不依賴於底層細節,是輕量級的組件。現在多是基於Swing來開發。
AWT概念
AWT提供基本的GUI組件,用在所有的Java applets及應用程序中。
具有可擴展的超類,它們的屬性是繼承的。
確保顯示在屏幕上的每個GUI組件都是抽象類組件的子類。
GUI組件根據作用可以分為兩種:基本組件和容器組件。
基本組件又稱構件,諸如按鈕、文本框之類的圖形界面元素。
容器是一種比較特殊的組件,可以容納其他組件,容器如窗口、對話框等。
所有的容器類都是java.awt.Container的直接或間接子類。
Container,它是Component的一個子類,而且包括兩個主要子類:Panel,Window。
注:容器不但能容納組件,還能容納其他容器,這一事實對於建立復雜的布局是關鍵的,也是基本的。
容器Container
Container的兩個主要類型是Window和Panel。
Window
Window是java.awt.Window的對象。
Window是顯示屏上獨立的本機窗口,它獨立於其他容器。
Window有兩種形式:Frame和Dialog,Frame和Dialog是Window類的子類。
Frame是一個帶有標題和縮放角的窗口。
對話框有標題,沒有菜單條,它能移動,但不能縮放。
Frame
是Window的子類。從容器繼承並以add的方式添加組件。
具有標題和縮放角。
能以字符串規定標題來創建Frame對象,剛創建出來的Frame對象是不可見的。
當它還處於不可見狀態時,將所有組件添加到框架中。調用setVisible(true)方法將Frame對象變為可見的。
將BorderLayout當做缺省布局管理器。
用setLayout方式來改變布局管理器。

import java.awt.Color; import java.awt.Frame; public class MyFrame extends Frame { public MyFrame(String title) { super(title); } public static void main(String[] args) { MyFrame frame = new MyFrame("First GUI app"); // 設置寬高 frame.setSize(500, 500); // 設置背景顏色 frame.setBackground(Color.BLUE); // 設置成可見的 frame.setVisible(true); } }
Panel
Panel是java.awt.Panel的對象。
Panel包含在另一個容器中,或是在Web瀏覽器的窗口中。
Panel確定一個四邊形,其他組件可以放入其中。
Panel必須放在Window或Window的子類之中,以便能顯示出來。
為組件提供空間,允許子面板有自己的布局管理器。
以add方法添加組件。
一旦一個面板對象被創建,為了能看得見,它必須添加到窗口或框架對象上,用Container類中的add方法可以做到這一點。
定位組件
容器里組件的位置和大小是由布局管理器決定的。
容器對布局管理器的特定實例保持一個引用。
當容器需要定位一個組件時,或決定一個組件的大小時,它將調用布局管理器來做。
布局管理器完全控制容器內的所有組件,它負責計算並定義上下文中對象在實際屏幕中所需的大小。
可以通過停用布局管理器(setLayout(null))來控制組件的位置和大小。
然后就可以用組件上的setLocation(), setSize(), setBounds()來定位它們在容器里的位置。
不過建議使用布局管理器,而不是自己設定位置。
布局管理器
在AWT中,提供了五種布局管理器:
BorderLayout
FlowLayout
GridLayout
CardLayout
GridBagLayout
布局管理器負責決定布局方針以及容器的每一個組件的大小。
默認的布局管理器:
FlowLayout
與其他布局管理器不一樣,Flow布局管理器不限制它所管理的組件的大小,而是允許它們有自己的最佳大小。
默認是居中放置組件。
如果想在組件之間創建一個更大的最小間隔,可以規定一個界限。
當用戶對由Flow布局管理的區域進行縮放時,布局就發生變化。
FlowLayout的構造方法:
new FlowLayout();
使用缺省的居中對齊方式,水平和垂直間距為缺省值5。
new FlowLayout(FlowLayout.RIGHT,20,40);
右對齊,組件之間水平間距20個像素,豎直間距40個像素。
new FlowLayout(FlowLayout.LEFT);
左對齊,水平和豎直間距為缺省值:5像素。

import java.awt.Button; import java.awt.FlowLayout; import java.awt.Frame; public class MyFlow { private Frame frame; private Button button1,button2,button3; public void go() { frame = new Frame("Flow Layout"); //使用FlowLayout替換掉默認的BorderLayout frame.setLayout(new FlowLayout()); button1 = new Button("Hello"); button2 = new Button("World"); button3 = new Button("Welcome"); frame.add(button1); frame.add(button2); frame.add(button3); frame.setSize(100, 100); frame.setVisible(true); } public static void main(String[] args) { MyFlow flow = new MyFlow(); flow.go(); } }
BorderLayout
BorderLayout為在一個Panel或Window中放置組件提供一個更復雜的方案。
Border布局管理器包括五個明顯的區域:東南西北中。
北占據面板的上方,東在右。中間區域是在東南西北都填滿后剩下的區域。
沒有指定方向的組件默認放在中間。
每個區域只能加入一個組件,如加入多個,則之前加入的組件會被遺棄。
當窗口垂直延伸時,東西中區域也延伸;而當窗口水平延伸時,南北中區域也延伸。
當窗口縮放時,按鈕相應的位置不改變,但其大小改變。
縮放原則:
南北兩個區域只能在水平方向縮放(寬度可調整)
東西兩個區域只能在垂直方向縮放(高度可調整)
中部可在兩個方向上縮放。
布局管理器給予南北組件最佳高度,並強迫它們與容器一樣寬。
對於東西組件,給予最佳寬度,而高度受到限制。

import java.awt.BorderLayout; import java.awt.Button; import java.awt.Frame; import javax.swing.border.Border; public class ExGui { private Frame frame; private Button bn,bs,be,bw,bc; public void go() { frame = new Frame("Example"); bn = new Button("Button 1"); bs = new Button("Button 2"); be = new Button("Button 3"); bw = new Button("Button 4"); bc = new Button("Button 5"); frame.add(bn, BorderLayout.NORTH); frame.add(bs, BorderLayout.SOUTH); frame.add(be, BorderLayout.EAST); frame.add(bw, BorderLayout.WEST); frame.add(bc, BorderLayout.CENTER); frame.setSize(400, 400); frame.setVisible(true); } public static void main(String[] args) { ExGui test = new ExGui(); test.go(); } }
GridLayout
Grid布局管理器為放置組件提供了靈活性。用許多行和列來管理,組件就填充到由管理程序規定的單元中。
Grid布局管理器總是忽略組件的最佳大小。所有單元的寬度是相同的,是根據單元數對可用寬度進行平分而定的。同樣的,所有單元的高度也是相同的,是根據行數對高度進行平分而定的。
GridLayout是按照添加的順序順次填入單元,沒有加夠的,則后面的單元為空白。
CardLayout
Card布局管理器能將界面看做一系列的卡,其中的一個在任何時候都可見。
用add()方法將卡添加到Card布局中,Card布局管理器的show()方法應請求轉換到一個新卡中。
GridBagLayout
GridBag布局管理器在網格的基礎上提供復雜的布局,但它允許單個組件在一個單元中,而不是填滿整個單元。
網格包布局管理器也允許單個組件擴展成不止一個單元。
參考資料
張龍老師Java SE視頻。
另附上本博客之前文章一篇:http://www.cnblogs.com/mengdd/archive/2012/08/30/2663630.html