5、Java Swing布局管理器(FlowLayout、BorderLayout、CardLayout、BoxLayout、GirdBagLayout 和 GirdLayout)


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 可以實現對齊。

5.6、GridBagLayout

      可以完成復雜的布局,而且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

組件和顯示區

內部填充

             
        public GridBagConstraints(int gridx, int gridy,int gridwidth, int gridheight,double weightx, double weighty,int anchor, int fill,Insets insets, int ipadx, int ipady),
GridBagConstraints 功能全面,內置了很多參數比如 anchor 描點,ipadx 內部填充, Weighty 指定如何分布額外的水平空間等等。所以當添加一個控件時,往往需要設置GridBagConstraints 很多參數才能達到效果,例如:
        GridBagConstraints  gridBagConstraints = new java.awt.GridBagConstraints();
        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:
     TableLayout的官網(里面有很多例子):
其實學習的另外的一種重要的方法就是多去官網里面,官網的資料是十分全面。

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”); 如下圖:
t ablelayout 舉例詳細介紹
下圖為實際列子與運行效果圖
行和列的分配
      此container被分為三行五列。size[0]為列比列分配,width=200是指component的寬度,可以是任意值。寫成35/width不直接寫成0.15是為了以后的便於修改與直觀認識。
參數 p 為TableLayout.PREFERRED:指定行或者列可以根據component自身的大小給予合適的行或列比列,以能全部顯示此component。
參數F為TableLayout.FILL:指示行或者列會把container剩下的的空間填滿,如上第四列和第五列都為F,則表示第四和第五列會把container剩下的空間填滿等分為兩份,平均分給第四、第五列。
添加組件
this.ad d(new JButton("0,0"),"0,0")中constraints為“0,0”兩個參數,表示只占0行0列
this.add(n ew 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裝入插件后有可視化的編輯界面。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM