swing布局管理器簡介


轉載:http://stevencjh.blog.163.com/blog/static/1218614612010101775336729/

swing布局管理器簡介

 

一 。BorderLayout布局管理器:BorderLayout 也是一種非常簡單的布局策略,它把容器內的空間簡單地划分為東、西、南、北、中無個區域,沒加入一個組件都應該指明把這個組件加在哪個區域中。 BorderLayout是頂層容器( JFrame, JDialog, 和 JApplet )的默認布局管理器。有五個位置組件:

 這個界面最多只能顯示5個控件。加入控件的時候,可以指定加入的方位,默認的情況是加入到中間。在BorderLayout中整理尺寸是,四周的控件會被調整,調整會按照布局管理器的內部規則計算出應該占多少位置,然后中間的組件會占去剩下的空間。

BorderLayout 是 Window,Frame和Dialog的缺省布局管理器. BorderLayout布局管理器把容器分成5個區域:North,South,East,West和Center,每個區域只能放置一個組件.在使用 BorderLayout的時候,如果容器的大小發生變化,其變化規律為:組件的相對位置不變,大小發生變化.例如容器變高了,則North、South 區域不變,West、Center、East區域變高;如果容器變寬了,West、East區域不變,North、Center、South區域變寬.不 一定所有的區域都有組件,如果四周的區域(West、East、North、South區域)沒有組件,則由Center區域去補充,但是如果 Center區域沒有組件,則保持空白

BorderLayout布局,會先把東西南北四個方位的組件設置好,剩余的空間,用來放置中間的組件。

二。FlowLayout布局管理器: 流式布局管理器把容器看成一個行集,好象平時在一張紙上寫字一樣,一行寫滿就換下一行。行高是用一行中的控件高度決定的。FlowLayout是所有 JApplet/JApplet的默認布局。在生成流式布局時能夠指定顯示的對齊方式,默認情況下是居中(FlowLayout.CENTER)。在下面 的示例中,可以用如下語句指定居左
  JPanel  panel= new JPanel(new FlowLayout(FlowLayout.LEFT)));
此為小應用程序(Applet)和面板(Panel)的缺省布局管理器,組件從左上角開始,按從左至右的方式排列.其構造函數為
       FlowLayout()  //生成一個默認的流式布局,組件在容器里居中,每個組件之間留下5個像素的距離
       FlowLayout(int alinment) //可以設定每行組件的對齊方式
       FlowLayout(int alignment,int horz,int vert) //設定對齊方式並設定組件水平和垂直的距離
      當容器的大小發生變化時,用FlowLayout管理的組件會發生變化,其變化規律是:組件的大小不變,但是相對位置會發生變化.


GirdLayout布局管理器: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) 

通過構造方法或 setRows 和 setColumns 方法將行數和列數都設置為非零值時,指定的列數將被忽略。列數通過指定的行數和布局中的組件總數來確定。因此,例如,如果指定了三行和兩列,在布局中添加了九個組件,則它們將顯示為三行三列。僅當將行數設置為零時,指定列數才對布局有效。


BoxLayout布局管理器: BoxLayout布局能夠允許將控件按照X軸(從左到右)或者Y軸(從上到下)方向來擺放,而且沿着主軸能夠設置不同尺寸。

 構造BoxLayout對象時,有兩個參數,例如:

 Public BoxLayout(Container target,int axis);

 

 Targe參數是表示當前管理的容器,axis是指哪個軸,有兩個值??BoxLayout.X_AXIS和BoxLayout.Y_AXIS。

 

 看如下的代碼:

 

   JPanel  jpanel=new JPanel();

   Jpanel.setLayout(new BoxLayout(jpanel,BoxLayout.Y_AXIS);

   TextArea  testArea=new TextArea(4,20);

   JButton   button=new JButton(“this is a button”);

   jpanel.add(testArea);

   jpanel.add(button);

 

//容納testArea和button的容器,對他們沿Y軸(從上往下)放置,並且文本域和按紐左對齊。也就是兩個控件的最左端在同一條線上

   testArea.setAlignmentX(Component.LEFT_ALIGNMENT);

    button. setAlignmentX(Component.LEFT_ALIGNMENT);

   

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

   testArea.setAlignmentX(Component.LEFT_ALIGNMENT);

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

GridBagLayout布局管理器:

這就是最復雜的一個布局管理器了,網格包布局.在此布局中,組件大小不必相同
           GridBagLayout gb=new GridBagLayout(); 
           ContainerName.setLayout(gb); 
          以上代碼是讓容器獲得一個GridBagLayout . 
          要使用網格包布局,還必須有其一個輔助類,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中,可以為每個組件指定其包含的網格個數,組件可以保留原來的大小,可以以任意順序隨意地加入容器的任意位置,從而實現真正自由地安排容器中每個組件的大小和位置。
通過創建一個gridBagConstraints實例為組件設置布局參數: 
gridx, gridy 
gridwidth, gridheight 
fill
ipadx, ipady 
insets 
anchor
CENTER (the default), NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, and NORTHWEST. 
weightx, weighty

變量名

有效值

應用范圍

定義

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

組件和顯示區

內部填充

 

 GridBagLayout 同 GridLayout 一樣,在容器中以網格形式來管理組件。但GridBagLayout 功能要來得強大得多。

1 、 GridBagLayout 管理的所有行和列都可以是大小不同的;

2 、 GridLayout 把每個組件限制到一個單元格,而 GridBagLayout 並不這樣:組件在容器中可以占據任意大小的矩形區域。

GridBagLayout 通常由一個專用類來對他布局行為進行約束,該類叫GridBagConstraints 。其中有 11 個公有成員變量, GridBagConstraints 可以從這 11 個方面來進行控制和操縱。這些內容是:

1 、 gridx— 組件的橫向坐標;

2 、 girdy— 組件的縱向坐標;

3 、 gridwidth— 組件的橫向寬度,也就是指組件占用的列數;

4 、 gridheight— 組件的縱向長度,也就是指組件占用的行數;

5 、 weightx— 指行的權重,告訴布局管理器如何分配額外的水平空間;

6 、 weighty— 指列的權重,告訴布局管理器如何分配額外的垂直空間;

7 、 anchor— 當組件小於其顯示區域時使用此字段;

8 、 fill— 如果顯示區域比組件的區域大的時候,可以用來控制組件的行為。控制組件是垂直填充,還是水平填充,或者兩個方向一起填充;

9 、 insets— 指組件與表格空間四周邊緣的空白區域的大小;

10 、 ipadx—  組件間的橫向間距,組件的寬度就是這個組件的最小寬度加上ipadx 值;

11 、 ipady—  組件間的縱向間距,組件的高度就是這個組件的最小高度加上ipady 值。

說明:

1 、 gridx , gridy :其實就是組件行列的設置,注意都是從 0 開始的,比如gridx=0 , gridy=1 時放在 0 行 1 列;

2 、 gridwidth , gridheight :默認值為 1 ;GridBagConstraints.REMAINDER 常量,代表此組件為此行或此列的最后一個組件,會占據所有剩余的空間;

3 、 weightx , weighty :當窗口變大時,設置各組件跟着變大的比例。比如組件 A 的 weightx=0.5 ,組件 B 的 weightx=1 ,那么窗口 X 軸變大時剩余的空間就會以 1 : 2 的比例分配給組件 A 和 B ;

4 、 anchor :當組件空間大於組件本身時,要將組件置於何處。 有 CENTER(默認值)、 NORTH 、 NORTHEAST 、 EAST 、 SOUTHEAST 、 WEST 、NORTHWEST 選擇。

5 、 insets :設置組件之間彼此的間距。它有四個參數,分別是上,左,下,右,默認為( 0 , 0 , 0 , 0 )。


GroupLayout
Java SE 6 中包含一個新的 GroupLayout ,從GroupLayout的單詞意思來看,它是以Group(組)為單位來管理布局,也就是把多個組件(如:JLable、JButton)按區域划分 到不同的Group(組),再根據各個Group(組)相對於水平軸(Horizontal)和垂直軸(Vertical)的排列方式來管理。下面我們針 對這樣一個界面看看它的用法:

Swing布局管理器簡介 - StevenChen - stevencjh 的博客

 

首先划分組:

1、按水平(Horizontal)方向划分:

hpg1  : JLabel 所在組(只有一個組件可以不用分組)
hpg2a : 左邊兩個JCheckBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2b : 右邊兩個JChecKBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg2H : hpg2a 和 hpg2b 兩個組沿着水平軸(Horizontal)順序排列,構成一個SequentialGroup
hpg2  :  JTextBox和組hpg2H 平行於水平軸(Horizontal)排列,構成一個ParallelGroup
hpg3  :  兩個JTextBox平行於水平軸(Horizontal)排列,構成一個ParallelGroup

另外JLabel 、hpg2、hpg3 沿着水平軸(Horizontal)順序排列,構成一個SequentialGroup

Swing布局管理器簡介 - StevenChen - stevencjh 的博客

 


2、按垂直(Vertical)方向划分:

Swing布局管理器簡介 - StevenChen - stevencjh 的博客

 


vpg1 : JLabel、JTextBox 、JButton(Find)平行於垂直軸(Vertical)排列,構成一個ParallelGroup
vpg2 : 上邊兩個JChecKBox、JButton(Cancel)平行於垂直軸(Vertical)排列,構成一個ParallelGroup
vpg3 : 下邊兩個JChecKBox平行於垂直軸(Vertical)排列,構成一個ParallelGroup

另外vpg1、vpg2、vpg3 三個組沿着垂直軸(Vertical)順序排列,構成一個SequentialGroup

這里一定要注意,

按水平方向划分時,水平方向為SequentialGroup ,垂直方向為ParallelGroup

按垂直方向划分時,水平方向為ParallelGroup,垂直方向為SequentialGroup

 

3、編碼:水平和垂直兩個方向我們都必須設定,實現方法詳見程序。
addComponent:向Group里添加組件,如JLabel、JTextBox
addGroup    : 向Group里添加組

/// GLayout.java
package lee;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GLayout extends JFrame
{
   public GLayout()
   {
    super("Find");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    //String laf = UIManager.getCrossPlatformLookAndFeelClassName();
    String laf = UIManager.getSystemLookAndFeelClassName();
    try {
         UIManager.setLookAndFeel(laf);
    } catch (UnsupportedLookAndFeelException exc) {
     System.err.println("Warning: UnsupportedLookAndFeel: " + laf);
    } catch (Exception exc) {
     System.err.println("Error loading " + laf + ": " + exc);
    }
    JLabel label1 = new JLabel("Find What:");
    JTextField textField1 = new JTextField();
    JCheckBox caseCheckBox = new JCheckBox("Match Case");
    JCheckBox wholeCheckBox = new JCheckBox("Whole Words");
    JCheckBox wrapCheckBox = new JCheckBox("Warp Around");
    JCheckBox backCheckBox = new JCheckBox("Search Backwards");
    JButton findButton = new JButton("Find");
    JButton cancelButton = new JButton("Cancel");
   
    Container c = getContentPane();
    GroupLayout layout = new GroupLayout(c);
    c.setLayout(layout);
    
    //自動設定組件、組之間的間隙
    layout.setAutoCreateGaps(true);
    layout.setAutoCreateContainerGaps(true);

  //LEADING -- 左對齊    BASELINE -- 底部對齊  CENTER -- 中心對齊
    GroupLayout.ParallelGroup hpg2a = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg2a.addComponent(caseCheckBox);
    hpg2a.addComponent(wholeCheckBox);
     
    GroupLayout.ParallelGroup hpg2b = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg2b.addComponent(wrapCheckBox);
    hpg2b.addComponent(backCheckBox);

    GroupLayout.SequentialGroup hpg2H = layout.createSequentialGroup();
    hpg2H.addGroup(hpg2a).addGroup(hpg2b);
  
    GroupLayout.ParallelGroup hpg2 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg2.addComponent(textField1);
    hpg2.addGroup(hpg2H);
  
    GroupLayout.ParallelGroup hpg3 = layout.createParallelGroup(GroupLayout.Alignment.LEADING);
    hpg3.addComponent(findButton);
    hpg3.addComponent(cancelButton);

  //水平
    layout.setHorizontalGroup(layout.createSequentialGroup()
        .addComponent(label1).addGroup(hpg2).addGroup(hpg3));    
    
    //設定兩個Button在水平方向一樣寬
    layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { findButton, cancelButton });
    //layout.linkSize(SwingConstants.HORIZONTAL,new Component[] { caseCheckBox, wholeCheckBox, wrapCheckBox, backCheckBox});

    GroupLayout.ParallelGroup vpg1 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
    vpg1.addComponent(label1);
    vpg1.addComponent(textField1);
    vpg1.addComponent(findButton);
    
    GroupLayout.ParallelGroup vpg2 = layout.createParallelGroup(GroupLayout.Alignment.CENTER);
    vpg2.addComponent(caseCheckBox);
    vpg2.addComponent(wrapCheckBox);
    vpg2.addComponent(cancelButton);

    GroupLayout.ParallelGroup vpg3 = layout.createParallelGroup(GroupLayout.Alignment.BASELINE);
    vpg3.addComponent(wholeCheckBox);
    vpg3.addComponent(backCheckBox);

  //垂直
   layout.setVerticalGroup(layout.createSequentialGroup()
        .addGroup(vpg1).addGroup(vpg2).addGroup(vpg3));
    
    setLocation(200,200);
    pack();
    setVisible(true);
  }
  public static void main(String[] args)
 {
  new GLayout();
 }
}


免責聲明!

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



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