Java布局管理器(一)

来源:互联网 发布:sql语句分离数据库 编辑:程序博客网 时间:2024/05/22 01:06

      Java的GUI界面定义是由awt类和swing类来完成的。它在布局管理上面采用了容器和布局管理分离的方案。也就是说,容器只管将其他小件(meta)放入其中,而不管这些小件是如何放置的。对于布局的管理交给专门的布局管理器类(LayoutManager)来完成。

      现在我们来看Java中布局管理器的具体实现。我们前面说过,Java中的容器类(Container),它们只管加入小件(Meta),也就是说,它只使用自己的add()方法向自己内部加入小件。同时他记录这些加入其内部的小件的个数,可以通过container.getComponentCount()方法类获得小件的数目,通过container.getComponent(i)来获得相应小件的句柄。然后LayoutManager类就可以通过这些信息来实际布局其中的小件了。

     JAVA的界面布局原理:因为Java是跨平台语言,使用绝对坐标显然会导致问题,即在不同平台、不同分辨率下的显示效果不一样。Java 为了实现跨平台的特性并且获得动态的布局效果,Java将容器内的所有组件安排给一个“布局管理器”负责管理,如:排列顺序,组件的大小,位置等,当窗口移动或调整大小后组件如何变化等功能授权给对应的容器布局管理器来管理,不同的布局管理器使用不同算法和策略,容器可以通过选择不同的布局管理器来决定布局。  Java中一共有6种布局管理器,通过使用6种布局管理器组合,能够设计出复杂的界面,而且在不同操作系统平台上都能够有一致的显示界面。6种布局管理器分别是BorderLayout、BoxLayout、FlowLayout、GirdBagLayout、GirdLayout和 CardLayout。其中CardLayout必须和其他5种配合使用,不是特别常用的。每种界面管理器各司其职,都有各自的作用。

      (1)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区域没有组件,则保持空白.
       示例:
    import java.awt.*;
    public class buttonDir{
     public static void main(String args[]){
      Frame f = new Frame("BorderLayout");
      f.setLayout(new BorderLayout());
      f.add("North", new Button("North");
      //第一个参数表示把按钮添加到容器的North区域
      f.add("South", new Button("South");
      //第一个参数表示把按钮添加到容器的South区域
      f.add("East", new Button("East"); 
      //第一个参数表示把按钮添加到容器的East区域
      f.add("West", new Button("West");
      //第一个参数表示把按钮添加到容器的West区域
      f.add("Center", new Button("Center");
      //第一个参数表示把按钮添加到容器的Center区域
      f.setSize(200,200);
      f.setVisible(true); 
     }
    }

FlowLayout布局管理器:流式布局管理器把容器看成一个行集,好象平时在一张纸上写字一样,一行写满就换下一行。行高是用一行中的控件高度决定的。FlowLayout是所有 JApplet/JPanel的默认布局。在生成流式布局时能够指定显示的对齐方式,默认情况下是居中(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);

在增加控件时,会保持一个列的情况下,不断把行数增长。

使容器中各个组件呈网格状布局,平均占据容器的空间.当所有组件大小相同时,使用此布局.其构造函数为:
         GridLayout()
         GridLayout(int row,int col)
         GridLayout(int row,int col,int horz,int vert)

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
 组件和显示区
 内部填充

 

CardLayout(卡式布局)
        CardLayout布局管理器能够帮助用户处理两个以至更多的成员共享同一显示空间,它把容器分成许多层,每层的显示空间占据整个容器的大小,但是每层只允许放置一个组件,当然每层都可以利用Panel来实现复杂的用户界面.布局管理器(CardLayout)就象一副叠得整整齐齐的扑克牌一样,有54张牌,但是你只能看见最上面的一张牌,每一张牌就相当于布局管理器中的每一层.其实现过程如下:

        首先,定义面板,为个个面板设置不同的布局,并根据需要在每个面板中放置组件:
           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"); //特定面板  

 

 

 

原创粉丝点击