Java-Swing常用佈局管理器

来源:https://www.cnblogs.com/kungfupanda/archive/2018/01/24/7220218.html
-Advertisement-
Play Games

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

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: 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裝入插件後有可視化的編輯界面。    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於前端分頁,不懂的人也許會覺得是個笑話,分頁不都是後端的事情嗎?的確不得不承認,處理邏輯性的話,還是後端更加友好,但前端分頁,也有他友好的一面,舉個慄子:伺服器壓力請求減少,換頁時用戶體驗好。直戳主題——前端實現分頁的原理及其步驟 ...
  • 虛擬化和容器化是項目雲化不可避免的兩個問題。虛擬化由於是純平臺操作,一個運行於linux操作系統的項目幾乎不需要做任何改造就可以支持虛擬化。而項目如果要支持容器化則需要做許多細緻的改造工作。容器化相對於虛擬化的優勢也相當明顯,運行於裸機性能高,秒級啟停容器,更不用說開發、測試、佈署一致的環境(Dev... ...
  • 接著上一篇的內容,我們繼續來梳理分散式系統之中的副本機制與副本一致。上文我們聊到了在可用性與一致性之間的一個折中的一致性等級: 最終一致性 。我們順著上篇的內容,由用戶來分析一致性等級。 1. 客戶端的困擾 上篇文章我們提到了數據系統常用的模型,當提交新數據時,必須將它發送給Leader節點,但是當 ...
  • 本篇將介紹python中sys, getopt模塊處理命令行參數 本篇將介紹python中sys, getopt模塊處理命令行參數 如果想對python腳本傳參數,python中對應的argc, argv(c語言的命令行參數)是什麼呢?需要模塊:sys參數個數:len(sys.argv)腳本名: s ...
  • 如果你在使用 Pandas(Python Data Analysis Library) 的話,下麵介紹的對你一定會有幫助的。 如果你在使用 Pandas(Python Data Analysis Library) 的話,下麵介紹的對你一定會有幫助的。 如果你在使用 Pandas(Python Dat ...
  • 思路 上一篇大概梳理了一下 GatewayWorker 的基礎知識。這篇就來準備整合 GatewayWorker 到 Laravel。 GatewayWorker 是基於 Socket 監聽的伺服器框架,而 Laravel 是基於 HTTP 請求/響應模型的 Web 框架。所以一定要明白,兩者的部署 ...
  • 前言 本文的目的是基於 GatewayWorker 官方手冊,梳理一次 GatewayWorker,併在實踐中與 MVC 框架整合的思路(附最終的項目源碼)。如果你已經理解了整合這一塊兒的知識,那麼就可以關掉這個網頁了。時間蠻寶貴的~ 很久以前就想做一個聊天室了。百度了下 "php 通信",看到了可 ...
  • 最近有朋友問我C++(or C)怎麼入門,其實這個還真不是很好回答的,想了下就寫下這篇博文以說下我自己的學習路程吧! 正兒八經的,其實我覺得自己也學得不咋地,不管是C還是C++都是如此的強大,要真正的說精通C++的,我覺得至少得花好幾年的時間吧。我是大學裡邊才接觸到電腦語言的(現大二),學校課程安 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...