轉載:http://stevencjh.blog.163.com/blog/static/1218614612010101775336729/
swing布局管理器簡介
一 。BorderLayout布局管理器:BorderLayout 也是一種非常簡單的布局策略,它把容器內的空間簡單地划分為東、西、南、北、中無個區域,沒加入一個組件都應該指明把這個組件加在哪個區域中。 BorderLayout是頂層容器( JFrame, JDialog, 和 JApplet )的默認布局管理器。有五個位置組件:
這個界面最多只能顯示5個控件。加入控件的時候,可以指定加入的方位,默認的情況是加入到中間。在BorderLayout中整理尺寸是,四周的控件會被調整,調整會按照布局管理器的內部規則計算出應該占多少位置,然后中間的組件會占去剩下的空間。
BorderLayout 是 Window,Frame和Dialog的缺省布局管理器. BorderLayout布局管理器把容器分成5個區域:North,South,East,West和Center,每個區域只能放置一個組件.在使用 BorderLayout的時候,如果容器的大小發生變化,其變化規律為:組件的相對位置不變,大小發生變化.例如容器變高了,則North、South 區域不變,West、Center、East區域變高;如果容器變寬了,West、East區域不變,North、Center、South區域變寬.不 一定所有的區域都有組件,如果四周的區域(West、East、North、South區域)沒有組件,則由Center區域去補充,但是如果 Center區域沒有組件,則保持空白.
BorderLayout布局,會先把東西南北四個方位的組件設置好,剩余的空間,用來放置中間的組件。
二。FlowLayout布局管理器: 流式布局管理器把容器看成一個行集,好象平時在一張紙上寫字一樣,一行寫滿就換下一行。行高是用一行中的控件高度決定的。FlowLayout是所有 JApplet/JApplet的默認布局。在生成流式布局時能夠指定顯示的對齊方式,默認情況下是居中(FlowLayout.CENTER)。在下面 的示例中,可以用如下語句指定居左
JPanel panel= new JPanel(new FlowLayout(FlowLayout.LEFT)));
此為小應用程序(Applet)和面板(Panel)的缺省布局管理器,組件從左上角開始,按從左至右的方式排列.其構造函數為:
FlowLayout() //生成一個默認的流式布局,組件在容器里居中,每個組件之間留下5個像素的距離.
FlowLayout(int alinment) //可以設定每行組件的對齊方式.
FlowLayout(int alignment,int horz,int vert) //設定對齊方式並設定組件水平和垂直的距離.
當容器的大小發生變化時,用FlowLayout管理的組件會發生變化,其變化規律是:組件的大小不變,但是相對位置會發生變化.
GirdLayout布局管理器:GridLayout 將成員按網格型排列,每個成員盡可能地占據網格的空間,每個網格也同樣盡可能地占據空間,從而各個成員按一定的大小比例放置。如果你改變大小, GridLayout將相應地改變每個網格的大小,以使各個網格盡可能地大,占據Container容器全部的空間。
基本布局策略是把容器的空間划分成若干行乘若干列的網格區域,組件就位於這些划分出來的小區域中,所有的區域大小一樣。組件按從左到右,從上到下的方法加入。
用構造函數划分出網格的行數和列數,
new GridLayout(行數,列數);
構造函數里的行數和列數能夠有一個為零,但是不能都為零。當容器里增加控件時候,容器內將向0的那個方向增長。例如,如果是如下語句:
GridLayout layout= new GridLayout(0,1);
在增加控件時,會保持一個列的情況下,不斷把行數增長。
java.awt.GridBagConstraints 中的insets(0,0,0,0)的參數具體指的是:
規定一個控件顯示區的空白區。如果控件顯示的inset為(10,5,20,0)
那么控件到顯示區北邊距離為10,西邊為5,南邊為20,東邊為0控件會比顯示區小。如果inset為負,控件會超出顯示區
使容器中各個組件呈網格狀布局,平均占據容器的空間.當所有組件大小相同時,使用此布局.其構造函數為:
GridLayout()
GridLayout(int row,int col)
GridLayout(int row,int col,int horz,int vert)
通過構造方法或 setRows 和 setColumns 方法將行數和列數都設置為非零值時,指定的列數將被忽略。列數通過指定的行數和布局中的組件總數來確定。因此,例如,如果指定了三行和兩列,在布局中添加了九個組件,則它們將顯示為三行三列。僅當將行數設置為零時,指定列數才對布局有效。
BoxLayout布局管理器: BoxLayout布局能夠允許將控件按照X軸(從左到右)或者Y軸(從上到下)方向來擺放,而且沿着主軸能夠設置不同尺寸。
構造BoxLayout對象時,有兩個參數,例如:
Public BoxLayout(Container target,int axis);
Targe參數是表示當前管理的容器,axis是指哪個軸,有兩個值??BoxLayout.X_AXIS和BoxLayout.Y_AXIS。
看如下的代碼:
JPanel jpanel=new JPanel();
Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS);
TextArea testArea=new TextArea(4,20);
JButton button=new JButton(“this is a button”);
jpanel.add(testArea);
jpanel.add(button);
//容納testArea和button的容器,對他們沿Y軸(從上往下)放置,並且文本域和按紐左對齊。也就是兩個控件的最左端在同一條線上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.LEFT_ALIGNMENT);
//容納testArea和button的容器,對他們采用沿Y軸(從上往下)放置,並且文本域最左端和按紐的最右端在同一條線上
testArea.setAlignmentX(Component.LEFT_ALIGNMENT);
button. setAlignmentX(Component.RIGHT_ALIGNMENT);
setAlignmentX(left,right)只有在布局是BoxLayout.Y_AXIS才效,而setAlignmentY(top,button)在布局為BoxLayout.X_AXIS才效果。
組件對齊一般來說:
所有top-to-bottom BoxLayout object 應該有相同的 X alignment。
所有left-to-right Boxlayout應該有相同的 Y alignment
setAlignmentX 和setAlignmentY 可以實現對齊。
GridBagLayout布局管理器:
這就是最復雜的一個布局管理器了,網格包布局.在此布局中,組件大小不必相同.
GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb);
以上代碼是讓容器獲得一個GridBagLayout .
要使用網格包布局,還必須有其一個輔助類,GridBagContraints.它包含GridBagLayout類用來定位及調整組件大小所需要的全部信息.使用步驟如下:
1).創建網格包布局的一個實例,並將其定義為當前容器的布局管理器.
2).創建GridBagContraints的一個實例
3).為組件設置約束.
4).通過方法統治布局管理器有關組件及其約束等信息
5).將組件添加到容器.
6).對各個將被顯示的組件重復以上步驟..
GridBagContraints類的成員變量列表如下:
1).gridx,gridy
指定組件放在哪個單元中.其值應該設為常數CridBagConstraints.RELATIVE .然后按標准順序將組件加入網格包布局.從左到右,從上到下.
2).gridwidth,gridheight
指定組件將占用幾行幾列
3).weightx,weighty
指定在一個GridBagLayout中應如何分配空間.缺省為0.
4).ipadx,ipady
指定組件的最小寬度和高度.可確保組件不會過分收縮.
5).fill
指定在單元大於組件的情況下,組件如何填充此單元..缺省為組件大小不變.以下為靜態數據成員列表,它們是fill變量的值.
GridBagConstraints.NONE 不改變組件大小
GridBagConstraints.HORIZONTAL 增加組件寬度,使其水平填充顯示區域
GridBagConstraints.VERTICAL 增加組件高度,使其垂直填充顯示區域
GridBagConstraints.BOTH 使組件填充整個顯示區域
6).anchor
如果不打算填充可以通過anchor指定將組件放置在單元中的位置,缺省為將其放在單元的中部.可使用以下靜態成員:
GridBagConstraints.CENTER
GridBagConstraints.NORTH
GridBagConstraints.EAST
GridBagConstraints.WEST
GridBagConstraints.SOUTH
GridBagConstraints.NORTHEAST
GridBagConstraints.SOUTHEAST
GridBagConstraints.NORTHWEST
GridBagConstraints.SOUTHWEST
使用setConstraints()方法可以設置各組件約束.
GridBagLayout是是在GridLayout的基礎上發展起來的,是五種布局策略中使用最復雜,功能最強大的一種,它是在GridLayout的基礎上發展起來的。因為GridBagLayout中每個網格都相同大小並且強制組件與網格大小相同,使得容器中的每個組件也都是相同的大小,顯得很不自然,而且組件假如容器中必須按照固定的行列順序,不夠靈活。在GridBagLayout中,可以為每個組件指定其包含的網格個數,組件可以保留原來的大小,可以以任意順序隨意地加入容器的任意位置,從而實現真正自由地安排容器中每個組件的大小和位置。
通過創建一個gridBagConstraints實例為組件設置布局參數:
gridx, gridy
gridwidth, gridheight
fill
ipadx, ipady
insets
anchor
CENTER (the default), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, and NORTHWEST.
weightx, weighty
變量名 |
有效值 |
應用范圍 |
定義 |
anchor |
CENTER EAST NORTH NORTHEAST SOUTH SOUTHWEST WEST |
組件 |
組件在網格中排放的位置 |
fill |
BOTH HORIZONTAL VERTICAL NONE |
組件 |
組件填充網格的方式 |
gridx,gridy |
RELATIVE 整數X,Y值 |
組件和顯示區 |
組件的左上角網格的位置 |
gridheight gridwidth |
1 RELATIVE REMAINDER 寬,高度整數值 |
顯示區 |
網格單元中組件顯示區所占的高度和寬度 |
Insets |
(0,0,0,0) |
組件和顯示區 |
外部填充 |
ipadx,ipady |
0 |
組件和顯示區 |
內部填充 |
GridBagLayout 同 GridLayout 一樣,在容器中以網格形式來管理組件。但GridBagLayout 功能要來得強大得多。
1 、 GridBagLayout 管理的所有行和列都可以是大小不同的;
2 、 GridLayout 把每個組件限制到一個單元格,而 GridBagLayout 並不這樣:組件在容器中可以占據任意大小的矩形區域。
GridBagLayout 通常由一個專用類來對他布局行為進行約束,該類叫GridBagConstraints 。其中有 11 個公有成員變量, GridBagConstraints 可以從這 11 個方面來進行控制和操縱。這些內容是:
1 、 gridx— 組件的橫向坐標;
2 、 girdy— 組件的縱向坐標;
3 、 gridwidth— 組件的橫向寬度,也就是指組件占用的列數;
4 、 gridheight— 組件的縱向長度,也就是指組件占用的行數;
5 、 weightx— 指行的權重,告訴布局管理器如何分配額外的水平空間;
6 、 weighty— 指列的權重,告訴布局管理器如何分配額外的垂直空間;
7 、 anchor— 當組件小於其顯示區域時使用此字段;
8 、 fill— 如果顯示區域比組件的區域大的時候,可以用來控制組件的行為。控制組件是垂直填充,還是水平填充,或者兩個方向一起填充;
9 、 insets— 指組件與表格空間四周邊緣的空白區域的大小;
10 、 ipadx— 組件間的橫向間距,組件的寬度就是這個組件的最小寬度加上ipadx 值;
11 、 ipady— 組件間的縱向間距,組件的高度就是這個組件的最小高度加上ipady 值。
說明:
1 、 gridx , gridy :其實就是組件行列的設置,注意都是從 0 開始的,比如gridx=0 , gridy=1 時放在 0 行 1 列;
2 、 gridwidth , gridheight :默認值為 1 ;GridBagConstraints.REMAINDER 常量,代表此組件為此行或此列的最后一個組件,會占據所有剩余的空間;
3 、 weightx , weighty :當窗口變大時,設置各組件跟着變大的比例。比如組件 A 的 weightx=0.5 ,組件 B 的 weightx=1 ,那么窗口 X 軸變大時剩余的空間就會以 1 : 2 的比例分配給組件 A 和 B ;
4 、 anchor :當組件空間大於組件本身時,要將組件置於何處。 有 CENTER(默認值)、 NORTH 、 NORTHEAST 、 EAST 、 SOUTHEAST 、 WEST 、NORTHWEST 選擇。
5 、 insets :設置組件之間彼此的間距。它有四個參數,分別是上,左,下,右,默認為( 0 , 0 , 0 , 0 )。
GroupLayout
Java SE 6 中包含一個新的 GroupLayout ,從GroupLayout的單詞意思來看,它是以Group(組)為單位來管理布局,也就是把多個組件(如:JLable、JButton)按區域划分 到不同的Group(組),再根據各個Group(組)相對於水平軸(Horizontal)和垂直軸(Vertical)的排列方式來管理。下面我們針 對這樣一個界面看看它的用法:

首先划分組:
1、按水平(Horizontal)方向划分:
hpg1 : JLabel 所在組(只有一個組件可以不用分組)
hpg2a : 左邊兩個JCheckBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2b : 右邊兩個JChecKBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2H : hpg2a 和 hpg2b 兩個組沿着水平軸(Horizontal)順序排列,構成一個SequentialGroup
hpg2 : JTextBox和組hpg2H 平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg3 : 兩個JTextBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
另外JLabel 、hpg2、hpg3 沿着水平軸(Horizontal)順序排列,構成一個SequentialGroup

2、按垂直(Vertical)方向划分:

vpg1 : JLabel、JTextBox 、JButton(Find)平行於垂直軸(Vertical)排列,構成一個ParallelGroup
vpg2 : 上邊兩個JChecKBox、JButton(Cancel)平行於垂直軸(Vertical)排列,構成一個ParallelGroup
vpg3 : 下邊兩個JChecKBox平行於垂直軸(Vertical)排列,構成一個ParallelGroup
另外vpg1、vpg2、vpg3 三個組沿着垂直軸(Vertical)順序排列,構成一個SequentialGroup
這里一定要注意,
按水平方向划分時,水平方向為SequentialGroup ,垂直方向為ParallelGroup
按垂直方向划分時,水平方向為ParallelGroup,垂直方向為SequentialGroup
3、編碼:水平和垂直兩個方向我們都必須設定,實現方法詳見程序。
addComponent:向Group里添加組件,如JLabel、JTextBox
addGroup : 向Group里添加組
/// GLayout.java
package lee;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GLayout extends JFrame
{
public GLayout()
{
super("Find");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//String laf = UIManager.getCrossPlatformLookAndFeelClassName();
String laf = UIManager.getSystemLookAndFeelClassName();
try {
UIManager.setLookAndFeel(laf);
} catch (UnsupportedLookAndFeelException exc) {
System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
} catch (Exception exc) {
System.err.println("Error loading " + laf + ": " + exc);
}
JLabel label1 = new JLabel("Find What:");
JTextField textField1 = new JTextField();
JCheckBox caseCheckBox = new JCheckBox("Match Case");
JCheckBox wholeCheckBox = new JCheckBox("Whole Words");
JCheckBox wrapCheckBox = new JCheckBox("Warp Around");
JCheckBox backCheckBox = new JCheckBox("Search Backwards");
JButton findButton = new JButton("Find");
JButton cancelButton = new JButton("Cancel");
Container c = getContentPane();
GroupLayout layout = new GroupLayout(c);
c.setLayout(layout);
//自動設定組件、組之間的間隙
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
//LEADING -- 左對齊 BASELINE -- 底部對齊 CENTER -- 中心對齊
GroupLayout.ParallelGroup hpg2a = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
hpg2a.addComponent(caseCheckBox);
hpg2a.addComponent(wholeCheckBox);
GroupLayout.ParallelGroup hpg2b = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
hpg2b.addComponent(wrapCheckBox);
hpg2b.addComponent(backCheckBox);
GroupLayout.SequentialGroup hpg2H = layout.createSequentialGroup();
hpg2H.addGroup(hpg2a).addGroup(hpg2b);
GroupLayout.ParallelGroup hpg2 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
hpg2.addComponent(textField1);
hpg2.addGroup(hpg2H);
GroupLayout.ParallelGroup hpg3 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
hpg3.addComponent(findButton);
hpg3.addComponent(cancelButton);
//水平
layout.setHorizontalGroup(layout.createSequentialGroup()
.addComponent(label1).addGroup(hpg2).addGroup(hpg3));
//設定兩個Button在水平方向一樣寬
layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { findButton, cancelButton });
//layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { caseCheckBox, wholeCheckBox, wrapCheckBox, backCheckBox});
GroupLayout.ParallelGroup vpg1 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
vpg1.addComponent(label1);
vpg1.addComponent(textField1);
vpg1.addComponent(findButton);
GroupLayout.ParallelGroup vpg2 = layout.createParallelGroup(GroupLayout.Alignment.CENTER);
vpg2.addComponent(caseCheckBox);
vpg2.addComponent(wrapCheckBox);
vpg2.addComponent(cancelButton);
GroupLayout.ParallelGroup vpg3 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
vpg3.addComponent(wholeCheckBox);
vpg3.addComponent(backCheckBox);
//垂直
layout.setVerticalGroup(layout.createSequentialGroup()
.addGroup(vpg1).addGroup(vpg2).addGroup(vpg3));
setLocation(200,200);
pack();
setVisible(true);
}
public static void main(String[] args)
{
new GLayout();
}
}