Java-Swing經常使用佈局管理器

五、Java-Swing經常使用佈局管理器

      應用佈局管理器都屬於相對佈局,各組件位置可隨界面大小而相應改變,不變的只是其相對位置,佈局管理器比較難以控制,通常只在界面大小須要改是才用,但即便這樣,爲了操做方便,也只是在大的模塊下用佈局管理器,在一些小的模塊下仍是用絕對佈局。在一些沒要求界面大小改變的窗口,通常採用絕對佈局比較容易,但對於後期的修改來講比較麻煩。
5.一、 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.二、FlowLayout

      該佈局稱爲流式佈局管理器,是從左到右,中間放置,一行放不下就換到另一行。一行能放置多少組件取決於窗口的寬度。默認組件是居中對齊,能夠經過FlowLayout(intalign)函數來指定對齊方式,默認狀況下是居中(FlowLayout.CENTER)。FlowLayout爲小應用程序(Applet)和麪板(Panel)的默認佈局管理器。其構造函數示例爲:
FlowLayout()  //生成一個默認的流式佈局,組件在容器里居中,每一個組件之間留下5個像素的距離。 
FlowLayout(int alinment) //能夠設定每行組件的對齊方式。
FlowLayout(int alignment , int horz , int vert) //設定對齊方式並設定組件水平和垂直的距離。
當容器的大小發生變化時,用FlowLayout管理的組件會發生變化。其變化規律是:組件的大小不變,可是相對位置會發生變化。
5.三、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.四、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.五、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軸(從上往下)放置,而且文本域和按紐左對齊,也就是兩個控件的最左端在同一條線上。html

1 testArea.setAlignmentX(Component.LEFT_ALIGNMENT); 2 3 button. setAlignmentX(Component.LEFT_ALIGNMENT);

       //容納testArea和button的容器,對他們採用沿Y軸(從上往下)放置,而且文本域最左端和按紐的最右端在同一條線上。java

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才效果。express

       組件對齊通常來講:
              全部top-to-bottom BoxLayout object 應該有相同的 X alignment。
              全部left-to-right Boxlayout應該有相同的 Y alignment
              setAlignmentX 和setAlignmentY 能夠實現對齊。
數組

5.六、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中,能夠爲每一個組件指定其包含的網格個數,組件能夠保留原來的大小,能夠以任意順序隨意地加入容器的任意位置,從而實現真正自由地安排容器中每一個組件的大小和位置。

變量名框架

有效值eclipse

應用範圍函數

定義佈局

anchorpost

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.七、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」);以下圖:
 
tablelayout 舉例詳細介紹
下圖爲實際列子與運行效果圖
 
行和列的分配
      此container被分爲三行五列。size[0]爲列比列分配,width=200是指component的寬度,能夠是任意值。寫成35/width不直接寫成0.15是爲了之後的便於修改與直觀認識。
參數 p 爲TableLayout.PREFERRED:指定行或者列能夠根據component自身的大小給予合適的行或列比列,以能所有顯示此component。
參數F爲TableLayout.FILL:指示行或者列會把container剩下的的空間填滿,如上第四列和第五列都爲F,則表示第四和第五列會把container剩下的空間填滿等分爲兩份,平均分給第4、第五列。
添加組件
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裝入插件後有可視化的編輯界面。
相關文章
相關標籤/搜索