Java GUI佈局管理器

Java GUI佈局管理器

1. 對容器中的組件進行合理的佈局——佈局管理器:

       1.1 當然用戶可以自己手動測量定位來設置組件在容器中的絕對位置和絕對大小,但這很麻煩,並且犧牲了平臺無關性;

       1.2 單通常在數學上,只要組件在容器中按照一定規律排列的話就必然有一個最佳位置和最佳大小,這個最佳可以理解爲既沒有冗餘的空間也沒有任何關鍵內容被遮擋;

       1.3上述中可以看到佈局的兩個要素就是:

             i. 組件在容器中的排列規則;

             ii. 組件的最佳位置和最佳大小;

      1.4 佈局管理器就是用來解決這兩個問題的,只要給定容器的邊界,並指定組件的排列規則,接着只要無腦地往容器中塞組件就可以自動計算出組件的最佳位置和最佳大小,並以這個結果顯示出來;

    1.5 佈局管理器LayoutManager類是一個基類,而其各個子類就定義了組件的排列規則,總共有6種子類,分別是FlowLayout(流式排列布局)、BorderLayout(方位排列布局)、GridLayout(網格排列布局)、GridBagLayout(網格袋佈局)、CardLayout(卡堆佈局)、BoxLayout(盒式佈局)這6中,其中前5種是AWT中的傳統佈局,而BoxLayout(盒式佈局)是Swing中提出來的,當然也可以在AWT中使用;

!!其不同的子類就定義了組件的排列規則;

   1.6 如何決定容器的佈局:

         i. 只要調用容器的方法setLayout即可;

         ii. 原型:void Container.setLayout(LayoutManager mgr); // 傳入具體的佈局管理器(子類)

         iii. 例如:c.setLayout(new FlowLayout()); // 即參數一般通過new創建一個具體的佈局管理器

!!如果不手工設定容器的佈局方式,那麼每種容器都有自己的默認佈局方式:

        a. Window系(Frame、Dialog)默認BorderLayout(方位佈局);

        b. Panel系(Panel、Applet)默認FlowLayout(流式佈局);

        c. ScrollPane默認BorderLayout(方位佈局),ScrollPane比較特殊,不允許改變其默認佈局方式,因此就認定方位佈局了; 

2. 絕對佈局:

    2.1 當然可以不借助佈局管理器由用戶直接精確定義組件的位置以及大小;

    2.2 直接使用Component的方法setSize、setLocation、setBounds即可;

    2.3 但是絕對佈局不僅費神,需要提前精確計算,而其會喪失跨平臺特性,在Java圖形界面編程中絕對不推薦絕對定位的方式;

    2.4 如果一定要使用絕對佈局,那麼就先調用容器的setLayout,傳遞null參數,就表示啓用絕對定位,然後就調用組件的set三方法定位後add進容器即可:c.setLayout(null); 

3. FlowLayout——流式佈局:

    3.1 即組件像流水一樣排列,遇到障礙就折回重頭排過,Panel系默認此類型佈局;

    3.2 默認狀態下組件從左到右,遇到右邊界後再另起一行從左到右排列,當然這種排列順序是可以設置的;

    3.3 構造器:

         i. 默認構造器:FlowLayout(); // 默認從左到右排列

         ii. 指定排列方向:FlowLayout(int align);

align是FlowLayout定義的靜態常量,分別爲LEFT(從左到右排列)、RIGHT(從右到左排列)、CENTER(中間向兩邊擴展排列),第三種很少用,比較奇葩,儘量別用吧!

         iii. 指定排列方向同時指定組件間隔:FlowLayout(int align, int hgap, int vgap); // hgap是組件之間的水平間距,vgap是垂直間距,單位都是邏輯單位長度

    3.4 示例:

                    public class AwtTest {  

                        public static void main(String[] args) {  

                            Frame f = new Frame("FlowLayout Test");  

                            f.setLayout(new FlowLayout(FlowLayout.RIGHT, 20, 5));         

                                for (int i = 0; i < 10; i++) {  

                                f.add(new Button("Button" + i));  

                       }       

                               f.pack(); // 設置窗口的最佳大小  

                               f.setVisible(true);  

                } 

}  

!!一般不提倡用從左到右方向之外的其它方向,沒什麼必要!

!關於pack方法:

    a. 該方法始於Window類,是專門用於框架窗口的;

    b. 原型:void Window.pack();

    c. 該方法的目的就是自動調整窗口的大小,使之最佳適應裏面的組件的佈局方式和組件的大小;

    d. 雖然有佈局管理器可以使組件的排列達到最佳,但是佈局管理器只管組件之間的排列並不管組件和容器邊界的間隔,也許容器特別大,它和中間排列有序的組件之間有很多空白的地方,例如下面,中間的組件緊湊有序,但和外圍的框架之間存在較大的空白

!!因此需要使用pack將框架也最佳適應其中的組件,就是不留多餘空白,也不遮蔽關鍵內容;

 

發佈了38 篇原創文章 · 獲贊 19 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章