http://www.cnblogs.com/hthuang/p/3460234.html 5、Java-Swing常用佈局管理器 應用佈局管理器都屬於相對佈局,各組件位置可隨界面大小而相應改變,不變的只是其相對位置,佈局管理器比較難以控制,一般只在界面大小需要改是才用,但即使這樣,為了操作方便,也 ...
http://www.cnblogs.com/hthuang/p/3460234.html 5、Java-Swing常用佈局管理器
應用佈局管理器都屬於相對佈局,各組件位置可隨界面大小而相應改變,不變的只是其相對位置,佈局管理器比較難以控制,一般只在界面大小需要改是才用,但即使這樣,為了操作方便,也只是在大的模塊下用佈局管理器,在一些小的模塊下還是用絕對佈局。在一些沒要求界面大小改變的視窗,一般採用絕對佈局比較容易,但對於後期的修改來說比較麻煩。 5.1、 BorderLayout
這種佈局管理器分為東、南、西、北、中心五個方位。北和南的組件可以在水平方向上拉伸;而東和西的組件可以在垂直方向上拉伸;中心的組件可同時在水平和垂直方向上同時拉伸,從而填充所有剩餘空間。在使用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 }5.2、FlowLayout
該佈局稱為流式佈局管理器,是從左到右,中間放置,一行放不下就換到另外一行。一行能放置多少組件取決於視窗的寬度。預設組件是居中對齊,可以通過FlowLayout(intalign)函數來指定對齊方式,預設情況下是居中(FlowLayout.CENTER)。FlowLayout為小應用程式(Applet)和麵板(Panel)的預設佈局管理器。其構造函數示例為: FlowLayout() //生成一個預設的流式佈局,組件在容器里居中,每個組件之間留下5個像素的距離。 FlowLayout(int alinment) //可以設定每行組件的對齊方式。 FlowLayout(int alignment , int horz , int vert) //設定對齊方式並設定組件水平和垂直的距離。 當容器的大小發生變化時,用FlowLayout管理的組件會發生變化。其變化規律是:組件的大小不變,但是相對位置會發生變化。 5.3、CardLayout
這種佈局管理器能夠幫助用戶處理兩個以至更多的成員共用同一顯示空間,它把容器分成許多層,每層的顯示空間占據整個容器大小,但是每層只允許放置一個組件,當然每層都可以利用Panel來實現複雜的用戶界面。CardLayout就象一副疊得整整齊齊的撲克牌一樣,有54張牌,但是你只能看見最上面的一張牌,一張牌就相當於佈局管理器中的一層。 所有的組件像卡片一樣疊在一起,每時每刻都只能顯示其中一張卡片。CardLayout常用到切換界面。例如,點擊App的Menu之後或者某個Button之後,主界面會切換到另外一個界面,這個時候就需要CardLayout。其實現過程如下: 首先,定義面板,為個個面板設置不同的佈局,並根據需要在每個面板中放置組件: panelOne.setLayout(new FlowLayout);
panelTwo.setLayout(new GridLayout(2,1)); 再設置主面板:
CardLayout card = new CardLayout();
panelMain.setLayout(card); 下一步將開始準備好的面板添加到主面板:
panelMain.add("red panel",panelOne);
panelMain.add("blue panel",panelOne); add()方法帶有兩個參數,第一個為String類型用來表示面板標題,第二個為Panel對象名稱。 完成以上步驟以後,必須給用戶提供在卡片之間進行選擇的方法。一個常用的方法是每張卡片都包含一個按鈕。通常用來控制顯示哪張面板。 actionListener被添加到按鈕。actionPerformed()方法可定義顯示哪張卡片: card.next(panelMain); //下一個 card.previous(panelMain); //前一個
card.first(panelMain); //第一個
card.last(panelMain); //最後一個
card.show(panelMain,"red panel"); //特定面板 5.4、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) 5.5、BoxLayout
BoxLayout佈局能夠允許將控制項按照X軸(從左到右)或者Y軸(從上到下)方向來擺放,而且沿著主軸能夠設置不同尺寸。 構造BoxLayout對象時,有兩個參數,例如: Public BoxLayout(Container target,int axis); Targe參數是表示當前管理的容器,axis是指哪個軸,有兩個值:BoxLayout.X_AXIS和BoxLayout.Y_AXIS。 示例代碼如下:
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: GridBagLayout gb=new GridBagLayout();
ContainerName.setLayout(gb); 要使用網格包佈局,還必須有其一個輔助類,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中,可以為每個組件指定其包含的網格個數,組件可以保留原來的大小,可以以任意順序隨意地加入容器的任意位置,從而實現真正自由地安排容器中每個組件的大小和位置。
變數名 |
有效值 |
應用範圍 |
定義 |
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) 上面幾個常用Layout中GridBagConstraints的功能是最強的,不過他們之間沒有什麼可比性,根據不同的需求選擇佈局更能清晰反映佈局帶來的便捷式與高效性。到目前為止,我們知道GridBagConstraints可以較好地完成複雜的Layout,算是"功能全面“,但是它有缺點。 5.7、TableLayout
這種管理器把容器劃分為行和列,就像是電子錶格中的單元格。Tablelayouot把行和列交叉的每一個格子稱為基本的單元格(cell)。組件被添加到容器劃分好的單元格中。當容器發生改變(伸縮)時,單元格也隨之伸縮,裝載在單元格裡的組件也相應的會進行伸縮。 以下圖為例:此容器被分為4行5列。由圖可看出,每一列的寬度並不是固定的,也不是平均寬度的。同理每一行的高度也不是均分的,可以按照實際情況進行分配列的寬度和行的高度。組件可以放在容易的一個cell單元格中,也可以占幾個單元格。在單元格中,行和列都是從0開始計數。Row0表示第1行,col0表示第1列。 在使用之前,先給出TableLayout API: http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/javadoc/layout/TableLayout.html TableLayout的官網(裡面有很多例子): http://www.clearthought.info/sun/products/jfc/tsc/articles/tablelayout/Simple.html 其實學習的另外的一種重要的方法就是多去官網裡面,官網的資料是十分全面。
TableLayout行列的分配 一般來說,創建tablelayout要先設定行和列。定義一個double類型的二維數組size[][]。Java代碼: double size[][] ={{100, 0.50, 0.20, TableLayout.FILL, 200, TableLayout.FILL}, {TableLayout.FILL}}; 在上面的代碼中,size[0]中存放的是列的寬度,size[1]中存放的是行的高度;數組中的整數表示該單元格的寬度或高度為多少像素,小數表示該單元格的寬度或高度為剩餘空間的百分之多少,TableLayout.FILL表示將剩餘的空間填滿,如果出現多個TableLayout.FILL,則這幾個單元格平分剩餘的空間。假設這個容器有500像素寬,則在上面的例子中: 第1列寬度為100, 第2列為(500-100-200)*0.5=100, 第3列為(500-100-200)*0.2=40 第4列為(500-100-200)*0.3/2=30, 第5列為200, 第6列同第3列,為30。 註意:在表示寬或高的像素時範圍應該在 0至1之間,而且0.0可以表示成0%或者0個像素,而1只能表示1個像素,不能表示成100%。 創建一個Tablelayout 創建tablelayout就和其他佈局管理器一樣,直接new一個TableLayout,然後給pannel設置佈局panel.setLayout( new TableLayout(size)); 為容器添加組件 使用add方法,add(組件,“坐標”), add(Component comp, Object constraints)參數說明: Comp: the component to be added Constraints: an object expressing Layout contraints for this 例如給panel添加button: panel.add(button,“0,0”);如下圖: 如果這個button橫跨多個單元格,計算順序是從左上到右下,則字元串的前兩個放第一格的坐標,後兩個行最後一格的坐標,例如,從(0,0)到(3,0),表示為:panel.add(button,”0,0,3,0”);如下圖: tablelayout 舉例詳細介紹 下圖為實際列子與運行效果圖 行和列的分配 此container被分為三行五列。size[0]為列比列分配,width=200是指component的寬度,可以是任意值。寫成35/width不直接寫成0.15是為了以後的便於修改與直觀認識。 參數 p 為TableLayout.PREFERRED:指定行或者列可以根據component自身的大小給予合適的行或列比列,以能全部顯示此component。 參數F為TableLayout.FILL:指示行或者列會把container剩下的的空間填滿,如上第四列和第五列都為F,則表示第四和第五列會把container剩下的空間填滿等分為兩份,平均分給第四、第五列。 添加組件 this.add(new JButton("0,0"),"0,0")中constraints為“0,0”兩個參數,表示只占0行0列 this.add(new JButton("3,0,3,1"),"3,0,3,1")中constraints為“3,0,3,1”四個參數,表示此component在container中的占用cell為從“3,0”跨度到“3,1”。跨度的方向為左上角到右下角圍成的矩形 Tablelayout就說到這裡,這裡只是說明一下TableLayout的基本的用法,要深入瞭解TableLayout,可以去官網裡面下載。 這裡總結一下TableLayout優缺點: 優點:
(1)、雖然Tablelayout它不是JDK自帶的,但是它是開源的。Tablelaout作為開源的佈局框架,可以對核心的類TableLayout.java進行修改達到自己所需要的功能實現。Tablelayout佈局與html中表格基本是一樣的,我們可以任意而且輕易地合併單元格,可以完成很複雜的佈局。
(2)、當視窗的大小發生改變時,在tableLayout佈局下得組件也會自動改變,按%比來分配每行,每列的大小。
(3)、TableLayout簡單明瞭,不需要過多設置屬性值,也能佈局到複雜的外觀,而不像GridBagLayout那樣需要設置很多的屬性(gridx、gridy、insets等等)過於複雜。 缺點: Tablelaout作為第三方的開源框架,要試用它則必須引入tablelayout的功能jar包,如果只要實現tablelayout簡單的功能則只需要引入tablelayout相關的幾個類就可以。Tablelayout沒有可視化的界面可以設計,不像其它jdk提供的佈局在netbeans或者eclipse裝入插件後有可視化的編輯界面。