AWT的幾種布局管理器
AWT中常用的布局管理器有如下幾個(gè):FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout,Swing還提供了一個(gè)BoxLayout。
FlowLayout從左向右排列所有組件,遇到邊界就會(huì)折回下一行從新開始。它有三個(gè)構(gòu)造器FlowLayout(),F(xiàn)lowLayout(int align)和 FlowLayout(int align, int hgap, int vgap),其中的hgap和vgap代表水平間距和垂直間距,align指的是組件的排列方向(從左向右,從右向左,從中間向兩邊),我們可以使用FlowLayout的靜態(tài)常量來設(shè)置這個(gè)參數(shù):FlowLayout.LEFT,F(xiàn)lowLayout.CENTER,F(xiàn)lowLayout.RIGHT。
BorderLayout將容器分為EAST,SOUTH,WEST,NORTH,CENTER五個(gè)區(qū)域,如下圖所示:
我們?cè)谙蚴褂么瞬季止芾砥鞯娜萜髦刑砑咏M件時(shí),需要制定添加到的區(qū)域,否則就默認(rèn)添加到中間區(qū)域里,而當(dāng)我們向一個(gè)區(qū)域添加多個(gè)組件時(shí),后放入的組件會(huì)覆蓋前面的組件。BorderLayout有兩個(gè)構(gòu)造器,BorderLayout()和BorderLayout(int hgap,int vgap),hgap和vgap代表的水平間距和垂直間距。我們?cè)谥付ńM件添加到的區(qū)域時(shí),可以使用它的靜態(tài)常量:BorderLayout.EAST, BorderLayout.WEST, BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.CENTER。例如:
- Frame f = new Frame();
- f.setLayout(new BorderLayout(5,5));
- f.add(new Button(“南”),SOUTH);//將一個(gè)按鈕添加到南的位置
BorderLayout最多只能放5個(gè)組件,但是實(shí)際上我們可以先在Panel中添加多個(gè)組件,再將Panel添加到BorderLayout布局管理器中,因此我們實(shí)際可以放的組件要遠(yuǎn)遠(yuǎn)超過5個(gè)。
GridLayout將容器分割成大小相同的網(wǎng)格,我們?cè)谔砑咏M件時(shí)將默認(rèn)從左到右從上到下,將組件依次添加到每個(gè)網(wǎng)格中,而每個(gè)組件的大小也就由其所添加到的網(wǎng)格的大小所決定。GridLayout同樣也有兩個(gè)構(gòu)造器,GridLayout(int rows,int cols)和GridLayout(int rows ,int cols,int hgap,int vgap),使用GridLayout的典型例子就是計(jì)算器的窗口:
- import java.awt.*;
- public class calculator
- {
- public static void main(String[] args)
- {
- Frame f = new Frame("計(jì)算器");
- Panel p1 = new Panel();
- p1.add(new TextField(30));
- f.add(p1,BorderLayout.NORTH);
- //設(shè)置p2采用GridLayout布局管理器
- Panel p2 = new Panel();
- p2.setLayout(new GridLayout(3,5,4,4));
- String[] name = {"0","1","2","3","4","5","6","7","8","9","+","-","*","/","."};
- for(int i=0;i<name.length;i++)
- {
- p2.add(new Button(name[i]));
- }
- f.add(p2);//默認(rèn)添加到中間
- f.pack();// 設(shè)置窗口為最佳大小
- f.setVisible(true);
- }
- }
運(yùn)行結(jié)果如圖:
CardLayout將加入容器的所有組件看成一疊卡片,每次只有最上面的那個(gè)Component才可見,它有兩個(gè)構(gòu)造器CardLayout()和CardLayout(int hgap, int vgap),有五個(gè)方法用來控制其中的組件:
- first(Container target);//顯示target容器中的第一張卡片
- last(Container target);
- previous(Container target);
- next(Container target);
- show(Container target,String name);//顯示targer容器中指定名字的卡片
例子:
- import java.awt.*;
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- public class calculator
- {
- Frame f;
- Panel p1;
- Panel p2;
- String[] name = {"1","2","3","4","5"};
- CardLayout c;
- public void init()
- {
- f = new Frame("yz");
- p1 = new Panel();
- p2 = new Panel();
- c = new CardLayout();
- p1.setLayout(c);
- for(int i=0;i<name.length;i++)
- {
- p1.add(name[i],new Button(name[i]));
- }
- //控制顯示上一張的按鈕
- Button previous = new Button("上一張");
- previous.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- c.previous(p1);
- }
- });
- //控制顯示下一張的按鈕
- Button next = new Button("下一張");
- next.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- c.next(p1);
- }
- });
- //控制顯示第一張的按鈕
- Button first = new Button("第一張");
- first.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- c.first(p1);
- }
- });
- //控制顯示最后一張的按鈕
- Button last = new Button("最后一張");
- last.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- c.last(p1);
- }
- });
- //根據(jù)card名顯示的按鈕
- Button third = new Button("第三張");
- third.addActionListener(new ActionListener()
- {
- public void actionPerformed(ActionEvent e)
- {
- c.show(p1,"3");
- }
- });
- p2.add(previous);
- p2.add(next);
- p2.add(first);
- p2.add(last);
- p2.add(third);
- f.add(p1);//默認(rèn)添加到中間
- f.add(p2,BorderLayout.SOUTH);
- f.pack();
- f.setVisible(true);
- }
- public static void main(String[] args)
- {
- new calculator().init();
- }
- }
GridBagLayout是功能最強(qiáng)大也是最復(fù)雜的布局管理器,添加到其中的組件可以橫跨一個(gè)或多個(gè)網(wǎng)格,并可以設(shè)置各網(wǎng)格的大小各不相同,當(dāng)窗口大小發(fā)生變化時(shí),其也可以準(zhǔn)確的控制窗口各部分的反應(yīng)。為了處理GridBagLayout中組件的大小和跨越性,我們還需要一個(gè)GridBagConstraints對(duì)象,用這個(gè)對(duì)象與特定的組件相關(guān)聯(lián),來控制組件的大小和跨越性。在使用GridBagLayout時(shí)一般需要4步:
1. 創(chuàng)建GridBagLayout,并指定容器使用該布局管理器
- GridBagLayout gb = new GridBagLayout();
- container.setLayout(gb);
2. 創(chuàng)建GridBagConstraints的對(duì)象,并設(shè)置該對(duì)象的相關(guān)屬性
- GridBagConstraints gbc = new GridBagConstraints();
- gbc.gridx=2;
- gbc.gridy=1;
- gbc.gridwidth=2;
- gbc.gridheight=1;
3. 調(diào)用GridBagLayout對(duì)象的方法來建立GridBagConstraints對(duì)象與受控制組件之間的聯(lián)系。
- gb.setConstraints(c,gbc);//設(shè)置c組件受gbc控制
4. 添加組件
- container.add(c);
通常我們可以將2,3,4步寫成一個(gè)addComponent方法,為這個(gè)方法傳遞所需要的參數(shù),來進(jìn)行添加組件的化簡(jiǎn)。例如:
- public void addComponent(Component c, int gx, int gy, int gw,int gh)
- {
- this.gridx=gx;
- this.gridy=gy;
- this.gridwidth=gw;
- this.gridheight=gh;
- gb.setConstraints(c,gbc);
- container.add(c);
- }
使用GridBagLayout關(guān)鍵在于GridBagConstraints,該類具有如下幾個(gè)方法:
fill:設(shè)置組件如何占領(lǐng)空白區(qū)域,它可取如下幾個(gè)值:GridBagConstraints.NONE, GridBagConstraints.HORIZONTAL, GridBagConstraints.VERTICAL, GridBagConstraints.BOTH。
gridx,gridy:設(shè)置組件的左上角所在網(wǎng)格的索引(網(wǎng)格的索引從0 開始),此外這兩個(gè)值還可以設(shè)為GridBagConstraints.RELATIVE,這個(gè)值也是默認(rèn)值,它表明當(dāng)前組件緊跟在上一個(gè)組件之后。
gridwidht和gridheight:設(shè)置組件橫向縱向跨越多少個(gè)網(wǎng)格,他們的默認(rèn)值都是1,如果該組件是橫向或縱向的最后一個(gè)還可以將此值設(shè)為GridBagConstraints.REMAINDER,若為倒數(shù)第二個(gè)組件則可以設(shè)值為GridBagConstraints.RELATIVE。
ipadx和ipady:設(shè)置組件橫向縱向的內(nèi)部填充大小,即在組件的最小尺寸上還需要增大多少,若設(shè)置了這個(gè)值則組件在最小尺寸的基礎(chǔ)上增大ipadx*2或 ipady*2像素。
weightx和weighty(double類型):就是權(quán)重,也就是組件組件占領(lǐng)多余空間的水平或垂直增加比例,默認(rèn)值為0也就是不占領(lǐng)多余空間。例如有三個(gè)組件,我們將他們的水平增加比例分別設(shè)為1.0,2.0,3.0,當(dāng)容器寬度增加60像素時(shí),他們分別增加10,20和30像素。如果我們希望某個(gè)組件的大小會(huì)隨著容器的變化而變化,我們需要同時(shí)設(shè)置fill和weightx,weighty屬性。
Swing中的BoxLayout布局管理器提供了一個(gè)構(gòu)造器:BoxLayout(Container targer,int axis),它制定創(chuàng)建基于targer容器的BoxLayout布局管理器,它里面的組件按axis方向排列,axis有BoxLayout.X_AXIS和BoxLayout.Y_AXIS兩個(gè)方向。BoxLayout通常和Box容器結(jié)合使用,Box容器有點(diǎn)像Panel,它默認(rèn)使用BoxLayout布局管理器。Box有兩個(gè)靜態(tài)方法來創(chuàng)建Box對(duì)象:createHorizontalBox()和createVerticalBox(),一旦獲得了Box容器之后,就可以使用Box來承裝普通GUI組件,然后再將這些Box組件添加到其他容器中,從而形成整體的窗口布局。例如:
- public class Test
- {
- private Frame f = new Frame("cs");
- private Box horizontal = Box.createHorizontalBox();
- private Box vertical = Box.createVerticalBox();
- public void init()
- {
- horizontal.add(new Button("shuiping1"));
- horizontal.add(new Button("shuiping2"));
- vertical.add(new Button("chuizhi1"));
- vertical.add(new Button("chuizhi2"));
- f.add(horizontal, BorderLayout.NORTH);
- f.add(vertical);
- f.pack();
- f.setVisible(true);
- }
- public static void main(String[] args)
- {
- new Test().init();
- }
- }
最后我們還可以使用絕對(duì)定位:只需要將Container的布局管理器設(shè)為null即可,也就是setLayout(null),往容器中加組件的時(shí)候指定組件的位置和大小。一般調(diào)用setBounds(int x,int y,int width,int height)。
原文鏈接:http://www.cnblogs.com/clownfish/archive/2012/04/19/2456553.html
【編輯推薦】