AWT的几种布局管理器

开发 后端
AWT中常用的布局管理器有如下几个:FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout,Swing还提供了一个BoxLayout。本文将详细介绍AWT的几种布局管理器。

AWT中常用的布局管理器有如下几个:FlowLayout, BorderLayout, GridLayout, GridBagLayout, CardLayout,Swing还提供了一个BoxLayout。

FlowLayout从左向右排列所有组件,遇到边界就会折回下一行从新开始。它有三个构造器FlowLayout(),FlowLayout(int align)和 FlowLayout(int align, int hgap, int vgap),其中的hgap和vgap代表水平间距和垂直间距,align指的是组件的排列方向(从左向右,从右向左,从中间向两边),我们可以使用FlowLayout的静态常量来设置这个参数:FlowLayout.LEFT,FlowLayout.CENTER,FlowLayout.RIGHT。

BorderLayout将容器分为EAST,SOUTH,WEST,NORTH,CENTER五个区域,如下图所示:

我们在向使用此布局管理器的容器中添加组件时,需要制定添加到的区域,否则就默认添加到中间区域里,而当我们向一个区域添加多个组件时,后放入的组件会覆盖前面的组件。BorderLayout有两个构造器,BorderLayout()和BorderLayout(int hgap,int vgap),hgap和vgap代表的水平间距和垂直间距。我们在指定组件添加到的区域时,可以使用它的静态常量:BorderLayout.EAST, BorderLayout.WEST, BorderLayout.NORTH, BorderLayout.SOUTH, BorderLayout.CENTER。例如:

  1. Frame f = new Frame();  
  2. f.setLayout(new BorderLayout(5,5));  
  3. f.add(new Button(“南”),SOUTH);//将一个按钮添加到南的位置 

BorderLayout最多只能放5个组件,但是实际上我们可以先在Panel中添加多个组件,再将Panel添加到BorderLayout布局管理器中,因此我们实际可以放的组件要远远超过5个。

GridLayout将容器分割成大小相同的网格,我们在添加组件时将默认从左到右从上到下,将组件依次添加到每个网格中,而每个组件的大小也就由其所添加到的网格的大小所决定。GridLayout同样也有两个构造器,GridLayout(int rows,int cols)和GridLayout(int rows ,int cols,int hgap,int vgap),使用GridLayout的典型例子就是计算器的窗口:

  1. import java.awt.*;  
  2. public class calculator  
  3. {  
  4.     public static void main(String[] args)  
  5.     {  
  6.         Frame f = new Frame("计算器");  
  7.         Panel p1 = new Panel();  
  8.         p1.add(new TextField(30));  
  9.         f.add(p1,BorderLayout.NORTH);  
  10.           
  11.         //设置p2采用GridLayout布局管理器  
  12.         Panel p2 = new Panel();  
  13.         p2.setLayout(new GridLayout(3,5,4,4));  
  14.         String[] name = {"0","1","2","3","4","5","6","7","8","9","+","-","*","/","."};  
  15.         for(int i=0;i<name.length;i++)  
  16.         {  
  17.             p2.add(new Button(name[i]));  
  18.         }  
  19.         f.add(p2);//默认添加到中间  
  20.         f.pack();// 设置窗口为最佳大小  
  21.         f.setVisible(true);  
  22.     }  

运行结果如图:

CardLayout将加入容器的所有组件看成一叠卡片,每次只有最上面的那个Component才可见,它有两个构造器CardLayout()和CardLayout(int hgap, int vgap),有五个方法用来控制其中的组件:

  1. first(Container target);//显示target容器中的第一张卡片  
  2.  
  3. last(Container target);  
  4.  
  5. previous(Container target);  
  6.  
  7. next(Container target);  
  8.  
  9. show(Container target,String name);//显示targer容器中指定名字的卡片 

例子:

  1. import java.awt.*;  
  2. import java.awt.event.ActionEvent;  
  3. import java.awt.event.ActionListener;  
  4. public class calculator  
  5. {  
  6.     Frame f;  
  7.     Panel p1;  
  8.     Panel p2;  
  9.     String[] name = {"1","2","3","4","5"};  
  10.     CardLayout c;  
  11.       
  12.     public void init()  
  13.     {      
  14.         f = new Frame("yz");  
  15.         p1 = new Panel();  
  16.         p2 = new Panel();  
  17.         c = new CardLayout();  
  18.           
  19.         p1.setLayout(c);  
  20.         for(int i=0;i<name.length;i++)  
  21.         {  
  22.             p1.add(name[i],new Button(name[i]));  
  23.         }  
  24.           
  25.         //控制显示上一张的按钮  
  26.         Button previous = new Button("上一张");  
  27.         previous.addActionListener(new ActionListener()  
  28.         {  
  29.             public void actionPerformed(ActionEvent e)  
  30.             {  
  31.                 c.previous(p1);  
  32.             }  
  33.         });  
  34.         //控制显示下一张的按钮  
  35.         Button next = new Button("下一张");  
  36.         next.addActionListener(new ActionListener()  
  37.         {  
  38.             public void actionPerformed(ActionEvent e)  
  39.             {  
  40.                 c.next(p1);  
  41.             }  
  42.         });  
  43.         //控制显示第一张的按钮  
  44.         Button first = new Button("第一张");  
  45.         first.addActionListener(new ActionListener()  
  46.         {  
  47.             public void actionPerformed(ActionEvent e)  
  48.             {  
  49.                 c.first(p1);  
  50.             }  
  51.         });  
  52.         //控制显示最后一张的按钮  
  53.         Button last = new Button("最后一张");  
  54.         last.addActionListener(new ActionListener()  
  55.         {  
  56.             public void actionPerformed(ActionEvent e)  
  57.             {  
  58.                 c.last(p1);  
  59.             }  
  60.         });  
  61.         //根据card名显示的按钮  
  62.         Button third = new Button("第三张");  
  63.         third.addActionListener(new ActionListener()  
  64.         {  
  65.             public void actionPerformed(ActionEvent e)  
  66.             {  
  67.                 c.show(p1,"3");  
  68.             }  
  69.         });  
  70.         p2.add(previous);  
  71.         p2.add(next);  
  72.         p2.add(first);  
  73.         p2.add(last);  
  74.         p2.add(third);  
  75.         f.add(p1);//默认添加到中间  
  76.         f.add(p2,BorderLayout.SOUTH);  
  77.         f.pack();  
  78.         f.setVisible(true);  
  79.     }  
  80.     public static void main(String[] args)  
  81.     {  
  82.         new calculator().init();  
  83.     }  

GridBagLayout是功能最强大也是最复杂的布局管理器,添加到其中的组件可以横跨一个或多个网格,并可以设置各网格的大小各不相同,当窗口大小发生变化时,其也可以准确的控制窗口各部分的反应。为了处理GridBagLayout中组件的大小和跨越性,我们还需要一个GridBagConstraints对象,用这个对象与特定的组件相关联,来控制组件的大小和跨越性。在使用GridBagLayout时一般需要4步:

1. 创建GridBagLayout,并指定容器使用该布局管理器

  1. GridBagLayout gb = new GridBagLayout();  
  2. container.setLayout(gb); 

2. 创建GridBagConstraints的对象,并设置该对象的相关属性

  1. GridBagConstraints gbc = new GridBagConstraints();  
  2. gbc.gridx=2;  
  3. gbc.gridy=1;  
  4. gbc.gridwidth=2;  
  5. gbc.gridheight=1

3. 调用GridBagLayout对象的方法来建立GridBagConstraints对象与受控制组件之间的联系。

  1. gb.setConstraints(c,gbc);//设置c组件受gbc控制 

4. 添加组件

  1. container.add(c); 

通常我们可以将2,3,4步写成一个addComponent方法,为这个方法传递所需要的参数,来进行添加组件的化简。例如:

  1. public void addComponent(Component c, int gx, int gy, int gw,int gh)  
  2. {  
  3.     this.gridx=gx;  
  4.     this.gridy=gy;  
  5.     this.gridwidth=gw;  
  6.     this.gridheight=gh;  
  7.     gb.setConstraints(c,gbc);  
  8.     container.add(c);  

使用GridBagLayout关键在于GridBagConstraints,该类具有如下几个方法:

fill:设置组件如何占领空白区域,它可取如下几个值:GridBagConstraints.NONE, GridBagConstraints.HORIZONTAL, GridBagConstraints.VERTICAL, GridBagConstraints.BOTH。

gridx,gridy:设置组件的左上角所在网格的索引(网格的索引从0 开始),此外这两个值还可以设为GridBagConstraints.RELATIVE,这个值也是默认值,它表明当前组件紧跟在上一个组件之后。

gridwidht和gridheight:设置组件横向纵向跨越多少个网格,他们的默认值都是1,如果该组件是横向或纵向的最后一个还可以将此值设为GridBagConstraints.REMAINDER,若为倒数第二个组件则可以设值为GridBagConstraints.RELATIVE。

ipadx和ipady:设置组件横向纵向的内部填充大小,即在组件的最小尺寸上还需要增大多少,若设置了这个值则组件在最小尺寸的基础上增大ipadx*2或 ipady*2像素。

weightx和weighty(double类型):就是权重,也就是组件组件占领多余空间的水平或垂直增加比例,默认值为0也就是不占领多余空间。例如有三个组件,我们将他们的水平增加比例分别设为1.0,2.0,3.0,当容器宽度增加60像素时,他们分别增加10,20和30像素。如果我们希望某个组件的大小会随着容器的变化而变化,我们需要同时设置fill和weightx,weighty属性。

Swing中的BoxLayout布局管理器提供了一个构造器:BoxLayout(Container targer,int axis),它制定创建基于targer容器的BoxLayout布局管理器,它里面的组件按axis方向排列,axis有BoxLayout.X_AXIS和BoxLayout.Y_AXIS两个方向。BoxLayout通常和Box容器结合使用,Box容器有点像Panel,它默认使用BoxLayout布局管理器。Box有两个静态方法来创建Box对象:createHorizontalBox()和createVerticalBox(),一旦获得了Box容器之后,就可以使用Box来承装普通GUI组件,然后再将这些Box组件添加到其他容器中,从而形成整体的窗口布局。例如:

  1. public class Test  
  2. {  
  3.     private Frame f = new Frame("cs");  
  4.     private Box horizontal = Box.createHorizontalBox();  
  5.     private Box vertical = Box.createVerticalBox();  
  6.     public void init()  
  7.     {  
  8.         horizontal.add(new Button("shuiping1"));  
  9.         horizontal.add(new Button("shuiping2"));  
  10.         vertical.add(new Button("chuizhi1"));  
  11.         vertical.add(new Button("chuizhi2"));  
  12.         f.add(horizontal, BorderLayout.NORTH);  
  13.         f.add(vertical);  
  14.         f.pack();  
  15.         f.setVisible(true);  
  16.     }  
  17.     public static void main(String[] args)  
  18.     {  
  19.         new Test().init();  
  20.     }  

最后我们还可以使用绝对定位:只需要将Container的布局管理器设为null即可,也就是setLayout(null),往容器中加组件的时候指定组件的位置和大小。一般调用setBounds(int x,int y,int width,int height)。

原文链接:http://www.cnblogs.com/clownfish/archive/2012/04/19/2456553.html

【编辑推荐】

  1. Java图形用户界面:高级组件综合例子
  2. Java NIO原理图文分析及代码实现
  3. 浅谈Java的方法覆盖与变量覆盖
  4. 5个让人激动的Java项目
  5. Java ImageIO图像合并效率测试
责任编辑:林师授 来源: yuzhen99的博客
相关推荐

2009-07-17 09:44:28

Look And Fe布局管理器SWT和Swing

2009-02-01 10:17:22

布局管理器LayoutManagGUI

2011-06-10 09:29:36

Qt Creator 布局管理器

2012-12-31 10:36:58

Android开发RelativeLay布局

2011-07-04 15:43:03

Qt 布局管理器 designer

2021-11-17 05:53:31

Windows 11操作系统微软

2012-12-11 10:10:30

Javaswing.Group

2010-12-28 14:53:29

服务器管理器

2009-03-06 15:27:10

LinuxUbuntuBlueman

2020-03-12 18:34:30

Windows 10Windows任务管理器

2015-12-08 12:17:04

2023-11-26 19:13:51

Windows超级管理器

2013-03-29 12:52:14

Android位置管理

2020-12-25 07:41:36

KubernetesOpenKruise应用

2011-10-24 09:47:37

RHEL网络管理器

2016-08-10 10:49:44

LinuxKeeweb密码管理器

2022-04-13 09:43:50

VoltaJavaScript开发工具

2022-02-18 08:25:46

微软Windows 11任务管理器

2018-03-05 10:18:44

Linux密码密码管理器

2009-02-20 10:54:24

Windows 7游戏管理器全新
点赞
收藏

51CTO技术栈公众号