• 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();
     }
    }

  • 相关阅读:
    shell 自动map和unmap 应用实例url域名【升级版】
    shell 自动map和unmap 应用实例url域名【初级版】
    cloudfoundry容器实例内部测试redis连通性
    Tsunami 跨机房大数据迁移【ubuntu】
    BOS项目05——Action层抽取重复代码(接受page,rows参数,封装到pageUtils对象中;对象转Json),批量添加数据的流程,批量删除流程(主要看前端部分),easyUI选项框(发送ajax请求从region中获取数据),JsonLib转码的原理(get方法),分页查询重复调用问题
    idea与Pycharm破解(Maven+Ubuntu:http://www.cnblogs.com/LexMoon/p/JavaMavenUbuntu.html)
    BOS项目
    前端——EasyUI基本使用
    Mavent——学Java不会Maven,怎么行archetypeCatalog=internal
    SpringMVC——高级参数绑定(数组、集合),@RequestMapper 的使用,Controller方法的三种返回值类型,异常处理器,上传图片,JSON数据交互,配置拦截器
  • 原文地址:https://www.cnblogs.com/gwq369/p/5351570.html
Copyright © 2020-2023  润新知