應用布局管理器都屬於相對布局,各組件位置可隨界面大小而相應改變,不變的只是其相對位置,布局管理器比較難以控制,一般只在界面大小需要改是才用,但即使這樣,為了操作方便,也只是在大的模塊下用布局管理器,在一些小的模塊下還是用絕對布局。在一些沒要求界面大小改變的窗口,一般采用絕對布局比較容易,但對於后期的修改來說比較麻煩。
這種布局管理器分為東、南、西、北、中心五個方位。北和南的組件可以在水平方向上拉伸;而東和西的組件可以在垂直方向上拉伸;中心的組件可同時在水平和垂直方向上同時拉伸,從而填充所有剩余空間。在使用BorderLayout的時候,如果容器的大小發生變化,其變化規律為:組件的相對位置不變,大小發生變化。例如容器變高了,則North、South 區域不變,West、Center、East區域變高;如果容器變寬了,West、East區域不變,North、Center、South區域變寬。不一定所有的區域都有組件,如果四周區域(West、East、North、South區域)沒有組件,則由Center區域去補充,但是如果 Center區域沒有組件,則保持空白。BorderLayout是RootPaneContainer(JInternalFrame、JDialog、JFrame、JWindow)的默認布局管理器。
1 import java.awt.*; 2 public class buttonDir{ 3 public static void main(String args[]){ 4 Frame f = new Frame("BorderLayout"); 5 f.setLayout(new BorderLayout()); 6 f.add("North", new Button("North"); 7 //第一個參數表示把按鈕添加到容器的North區域 8 f.add("South", new Button("South"); 9 //第一個參數表示把按鈕添加到容器的South區域 10 f.add("East", new Button("East"); 11 //第一個參數表示把按鈕添加到容器的East區域 12 f.add("West", new Button("West"); 13 //第一個參數表示把按鈕添加到容器的West區域 14 f.add("Center", new Button("Center"); 15 //第一個參數表示把按鈕添加到容器的Center區域 16 f.setSize(200,200); 17 f.setVisible(true); 18 } 19 }
該布局稱為流式布局管理器,是從左到右,中間放置,一行放不下就換到另外一行。一行能放置多少組件取決於窗口的寬度。默認組件是居中對齊,可以通過FlowLayout(intalign)函數來指定對齊方式,默認情況下是居中(FlowLayout.CENTER)。FlowLayout為小應用程序(Applet)和面板(Panel)的默認布局管理器。 其構造函數示例為:
這種布局管理器能夠幫助用戶處理兩個以至更多的成員共享同一顯示空間,它把容器分成許多層,每層的顯示空間占據整個容器大小,但是每層只允許放置一個組件,當然每層都可以利用Panel來實現復雜的用戶界面。CardLayout就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,一張牌就相當於布局管理器中的一層。 所有的組件像卡片一樣疊在一起,每時每刻都只能顯示其中一張卡片。CardLayout常用到切換界面。例如,點擊App的Menu之后或者某個Button之后,主界面會切換到另外一個界面,這個時候就需要CardLayout。其實現過程如下:
panelTwo.setLayout(new GridLayout(2,1));
CardLayout card = new CardLayout();
panelMain.setLayout(card);
panelMain.add("red panel",panelOne);
panelMain.add("blue panel",panelOne);
card.first(panelMain); //第一個
card.last(panelMain); //最后一個
card.show(panelMain,"red panel"); //特定面板
這種布局是網格式的布局,窗口改變的時候,組件的大小也會隨之改變。每個單元格的大小一樣,而且放置組件時,只能從左到右、由上到下的順序填充,用戶不能任意放置組件。如果改變大小, GridLayout將相應地改變每個網格的大小,以使各個網格盡可能地大,占據Container容器全部的空間。
new GridLayout(行數,列數);
GridLayout(int row,int col)
GridLayout(int row,int col,int horz,int vert)
BoxLayout布局能夠允許將控件按照X軸(從左到右)或者Y軸(從上到下)方向來擺放,而且沿着主軸能夠設置不同尺寸。 構造BoxLayout對象時,有兩個參數,例如:
1 JPanel jpanel=new JPanel(); 2 3 Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS); 4 5 TextArea testArea=new TextArea(4,20); 6 7 JButton button=new JButton(“this is a button”); 8 9 jpanel.add(testArea); 10 11 jpanel.add(button);
//容納testArea和button的容器,對他們沿Y軸(從上往下)放置,並且文本域和按紐左對齊,也就是兩個控件的最左端在同一條線上。
1 testArea.setAlignmentX(Component.LEFT_ALIGNMENT); 2 3 button. setAlignmentX(Component.LEFT_ALIGNMENT);
//容納testArea和button的容器,對他們采用沿Y軸(從上往下)放置,並且文本域最左端和按紐的最右端在同一條線上。
1 testArea.setAlignmentX(Component.LEFT_ALIGNMENT); 2 3 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 可以實現對齊。
可以完成復雜的布局,而且IDE對它有足夠的支持,是一個很強大的Layout。不過它過於復雜,在此布局中,組件大小不必相同。可以采用以下代碼容器獲得一個GridBagLayout:
ContainerName.setLayout(gb);
2) 創建GridBagContraints的一個實例
3) 為組件設置約束.
4) 通過方法統治布局管理器有關組件及其約束等信息
5) 將組件添加到容器.
6) 對各個將被顯示的組件重復以上步驟.
指定組件放在哪個單元中。其值應該設為常數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()方法可以設置各組件約束。
變量名 |
有效值 |
應用范圍 |
定義 |
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 |
組件和顯示區 |
內部填充 |
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.ipadx = 3;
gridBagConstraints.insets = new java.awt.Insets(3, 0, 3, 0);
pnlContent.add(btn, gridBagConstraints)
這種管理器把容器划分為行和列,就像是電子表格中的單元格。Tablelayouot把行和列交叉的每一個格子稱為基本的單元格(cell)。組件被添加到容器划分好的單元格中。當容器發生改變(伸縮)時,單元格也隨之伸縮,裝載在單元格里的組件也相應的會進行伸縮。

TableLayout行列的分配



(1)、雖然Tablelayout它不是JDK自帶的,但是它是開源的。Tablelaout作為開源的布局框架,可以對核心的類TableLayout.java進行修改達到自己所需要的功能實現。Tablelayout布局與html中表格基本是一樣的,我們可以任意而且輕易地合並單元格,可以完成很復雜的布局。
(2)、當窗口的大小發生改變時,在tableLayout布局下得組件也會自動改變,按%比來分配每行,每列的大小。
(3)、TableLayout簡單明了,不需要過多設置屬性值,也能布局到復雜的外觀,而不像GridBagLayout那樣需要設置很多的屬性(gridx、gridy、insets等等)過於復雜。