java格线包布局管理器

生活百科 2023-01-25 18:02生活百科www.aizhengw.cn

java格线包布局管理器

java格线包布局管理器,複杂和灵活的布局管理,允许容器中各个组件的大小各不相同,还允许组件跨越多个格线,也允许组件之间相互部分重叠。

基本介绍

  • 中文名java格线包布局管理器
  • 外文名Java grid bag layout manager
  • 特点複杂和灵活的布局管理
  • 过程建GridBagLayout格线包布局对象

GridBagLayout格线包布局管理器

格线包布局管理是最複杂和灵活的布局管理,在下面偶会作详细的介绍。
与格线布局管理器不同的是,格线包布局管理器允许容器中各个组件的大小各不相同,还允许组件跨越多个格线,也允许组件之间相互部分重叠。
格线包布局理解为格线单元布局更合理,因为一个容器被划分为若干个格线单元,而每个组件放置在一个或多个格线单元中。
要注意的是,格线包布局不能指定一个容器的格线单元的大小其格线单元的划分是通过weightx和weighty参数来设定的,但也不是直接指定其格线单元的大小。当把一个组件放置在格线单元中时,组件所占据的位置和大小是由一组与他们相关联的约束来决定的。这些约束是由GridBagConstraints类型的对象来设定的,关于GridBagConstraints类型,后面会做专门的介绍。

使用格线包布局的一般步骤

1、创建一个GridBagLayout格线包布局对象,并使其成为当前容器的布局管理器。
2、创建一个GridBagConstraints类型的约束对象,然后使用该对象设定各种约束条件,注意这里设定的约束条件并没有针对某一组件,要使某一组件具有设定的约束,需要使用第3步骤的方法。
3、然后使用GridBagLayout格线包布局中的setConstraints(Component com, GridBagConstraints cons)方法将GridBagConstraints类型对象设定的约束添加到被设定的组件中,这样该组件就具有了GridBagConstraints设定的约束。其中setConstraints()的第一个参数是将要添加的组件,第二个参数是GridBagConstraints类型的约束对象。
4、将设定了约束的组件添加到容器中。

使用格线包布局的第二种方法

1、使GridBagLayout布局成为当前容器的布局管理器,这里也可以不用创建GridBagLayout对象。
2、创建一个GridBagConstraints类型的约束对象,然后使用该对象设定约束条件。注意这里设定的约束条件并没有针对某一组件,要使某一组件具有设定的约束,需要使用第3步骤的方法。
3、然后使用add(Component com, Object cons)方法将组件和约束添加进容器中,这样添加进容器的组件就具有了第2步的约束。注意其中的add(Component com, Object cons);第一个参数是将要添加的组件,第二个参数是要添加的GridBagConstraints类型的约束对象。

GridBagConstraints类型的约束参数

double weightx和double weighty参数(默认值为0)
这是两个非常重要的参数,该参数直接影响到怎样设定格线单元的大小,常握好该参数就可以对格线包布局套用自如。
该参数对x方向和y方向指定一个加权值。这个加权值直接影响到格线单元的大小,比如weightx的值分别为10,20,30,则在容器的x方向也就是列的方向,按一定的比例(比如1:2:3其具体算法请参看java档案)分配三个格线单元,其中加权值越大格线单元就越大,可以看出值的大小是没有关係的,加权值的作用是让容器以设定的值的比例在横向和纵向分配格线,且在容器的大小改变时这个比例不改变。
如果weightx只设定了一个值,而组件却不只一个以上,则被设定了的这个组件的格线单元的大小为容器在x方向的大小减去那两个组件的最小尺寸就是该组件的格线单元大小。默认情况下组件的最小尺寸是比较小的。
如果两个参数都为0(默认值),则组件会被显示在容器的中央,不管容器是放大还是缩小组件都只会显示在容器的中央。
由上所述,在使用格线包布局时应先使用weightx和weighty来划分格线单元(不是直接划分,而是按一定比例来划分),格线单元划分出来后,组件放置在格线单元中的位置和大小就由后面介绍的约束来决定。
一定要注意的是设定权值后要使当前的设定生效应使用setConstraints()函式一次,如果连续设定多个同一方向的权值,则只有一次设定的权值有效,比如出现两行都设定了x方向的权值,则以一行设定的x方向的权值为标準来划分格线单元。
在使用GridBagLayout格线包布局管理器之前应先设定好格线单元,即要把容器划分为几行几列的格线单元,每行每列在容器中的宽度和高度比例,每个组件应在哪个格线单元。
int fill参数(默认值为GridBagConstraints.NONE)
fill参数指定组件填充格线的方式,当某组件的格线单元大于组件的大小时被使用,一般情况下组件是以最小的方式被显示的,如果不使用fill参数,则有可能组件占不完整个格线单元,也就是说组件占据的空间比划分的格线单元小,这时组件将显示在格线单元中的某个位置(具体在什幺位置由格线包中的参数来设定)。其可取的值如下
GridBagConstraints.NONE默认值,不改变组件的大小。
GridBagConstraints.HORIZONTAL使组件足够大,以填充其格线单元的水平方向,但不改变高度,其值等于整数2。
GridBagConstraints.VERTICAL使组件足够大,以填充其格线单元的垂直方向,但不改变宽度,其值等于整数3。
GridBagConstraints.BOTH使组件足够大,以填充其整个格线单元,其值等于整数1。
int gridwidth和int gridheight参数(默认值为1)
该参数指定组件占据多少个格线单元,gridwidth指定组件占据多少个格线单元的宽度,gridheight指定组件占据多少个格线单元的高度。两个参数的默认值都为1。其中值GridBagConstraints.REMAINDER表示当前组件在其行或列上为一个组件,也就是说如果是行上的一个组件的话,那幺下一个组件将会被添加到容器中的下一行,如果在行上不指定该值(也不指定gridx和gridy参数),那幺无论添加多少个组件都是在同一行上,同样如果在列上不指定该值(也不指定gridx和gridy参数)则无论添加多少行组件,都无法把容器填满。值GridBagConstraints.RELATIVE表示当前组件在其行或列上为倒数第二个组件。
示例
import java.awt.;
public class Program
{public static void main(String[] args)
{ Frame ff = new Frame();
GridBagLayout gr = new GridBagLayout();
GridBagConstraints gc = new GridBagConstraints(); //创建一个名为gc的约束对象
ff.setLayout(gr); //将容器ff的布局设为GridBagLayout
//创建一组按钮组件
Button bb1 = new Button("bb1"); Button bb2 = new Button("bb2"); Button bb3 = new Button("bb3");
Button bb4 = new Button("bb4"); Button bb5 = new Button("bb5"); Button bb6 = new Button("bb6");
Button bb7 = new Button("bb7"); Button bb8 = new Button("bb8");
gc.fill = GridBagConstraints.BOTH;//设定约束的fill参数,该参数表示当组件的大小小于格线单元的大小时在水平和垂直方向都填充,
gc.weightx =11; //设定x方向的加权值为11。
gc.weighty = 11;//设定y方向的加权值为11。
gr.setConstraints(bb1, gc); //将以上gc所设定的约束套用到按钮组件bb1
gc.weightx = 22;//设定x方向的加权值为22,如果不设定weightx则以下的组件都将自动套用上面所设定的weightx值11。
gr.setConstraints(bb2, gc); //将以上所设定的约束套用到按钮组件bb2。
//gc.weighty=111; //注意如果不注释掉该行,则以后使用gc约束的按钮组件在y方向的加权值将为111,而在前面设定的y方向的加权值11将失去作用。
gc.weightx =33;
gc.gridwidth = GridBagConstraints.REMAINDER;//设定gridwidth参数的值为REMAINDER这样在后面使用该约束的组件将是该行的一个组件。
gr.setConstraints(bb3, gc); //第一行添加了三个按钮组件bb1,bb2,bb3,且这3个按钮的宽度按weightx设定的值11,22,33按比例设定宽度
GridBagConstraints gc1 = new GridBagConstraints();//创建第二个约束gc1
gc1.fill = GridBagConstraints.BOTH;
gc1.weighty = 22; //将第2行的y方向加权值设为22
gr.setConstraints(bb4, gc1);
gr.setConstraints(bb5, gc1);
gc1.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(bb6, gc1); //第二行添加了三个按钮组件bb4,bb5,bb6
gc1.weighty =33;
gc1.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(bb7, gc1);//第三行添加了一个按钮组件bb7
gc1.weighty=0;
gr.setConstraints(bb8, gc1); //第四行添加了一个按钮组件bb8,bb8并没有添加到bb7的后面,因为bb8使用了bb7前面的gridwidth参数设定的值,所以bb8也是单独的一行。
ff.setSize(500, 300);
ff.add(bb1); ff.add(bb2);ff.add(bb3); ff.add(bb4); ff.add(bb5); ff.add(bb6); ff.add(bb7); ff.add(bb8);
ff.setVisible(true);} }
运行结果见下图
int gridx和int gridy参数(默认值为GridBagConstraints.RELATIVE)
该参数表示组件被添加到容器中的X或者Y坐标处,坐标以格线单元为单位,也就是说不管格线单元有多大,一个格线单元就是1X1的大小,也就是说如果把gridx和gridy都设为1,那幺该组件会被显示到第二行的行二列上。其中值GridBagConstraints.RELATIVE(默认值)表示当前组件紧跟在上一个组件的后面。
int ipadx和int ipady参数(默认值为0)
ipadx和ipady也被称为内部填充,该参数用以设定组件的最小尺寸,如果参数值为正值则组件的最小尺寸将比原始最小尺寸大,如果为负值,则组件的最小尺寸将会变得比原始的最小尺寸小。该参数也可以理解为直接为组件指定大小,这个设定的大小就是组件的最小尺寸。其设定后组件的大小为组件的原始最小尺寸加上ipadx2个像素。
int anchor参数(默认值为GridBagConstraints.CENTER)
该参数指定当组件的大小小于格线单元时,组件在格线单元中的位置。一般情况下,在设定了weightx或者weighty的加权值时,如果不使用fill参数填充空白区域,则组件的大小将小于格线单元的大小,这时使用anchor参数就能看到其中的效果了。anchor参数可取的值有GridBagConstraints.CENTER;GridBagConstraints.NORTH;GridBagConstraints.NORTHEAST;GridBagConstraints.EAST;GridBagConstraints.SOUTHEAST;GridBagConstraints.SOUTH;GridBagConstraints.SOUTHWEST;GridBagConstraints.WEST;GridBagConstraints.NORTHWEST;即居中,北,东北,东,东南,南,西南,西,西北方向。
Insets insets参数(默认值为0)
insets参数也被称为外部填充,该参数指定组件与格线单元之间的最小空白区域大小,要注意的是即使使用了fill参数填充横向和纵向但只要设定了insets参数,同样会留出insets所设定的空白区域,在insets设定的空白区域不会被填充。在使用该参数时需要设定对象的top,left,right,bottom四个方向的值来调整组件与格线单元之间的空白区域大小,比如gc.insets=new Insets(10,10,10,10);其中gc是GridBagConstraints类型的约束对象,这里要注意后面的new Insets其中的Insets第一个字母是大写的。也可以为insets指定负值,以扩大其格线单元。
示例
import java.awt.;
public class Program
{public static void main(String[] args)
{//将容器ff的布局设为GridBagLayout
Frame ff = new Frame();
GridBagLayout gr = new GridBagLayout();
GridBagConstraints gc = new GridBagConstraints(); //创建一个名为gc的约束对象
ff.setLayout(gr);
//创建一组按钮组件
Button bb1 = new Button("bb1"); Button bb2 = new Button("bb2"); Button bb3 = new Button("bb3");
Button bb4 = new Button("bb4"); Button bb5 = new Button("bb5"); Button bb6 = new Button("bb6");
Button bb7 = new Button("bb7"); Button bb8 = new Button("bb8");
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 11; gc.weighty = 11;
gr.setConstraints(bb1, gc);
gc.weightx = 22;
gc.gridx = 1; gc.gridy = 1; //将下一个组件放置在坐标为1,1的位置。
gr.setConstraints(bb2, gc);
gc.weightx = 33;
gc.gridx = 2; gc.gridy = 1; //将下一个组件放置在坐标为2,1的位置。
gc.insets = new Insets(-10, -10, -10, -10); //将下一个组件与格线单元的空白区域向外扩展10个像素,在这里可以看到格线包布局允许组件之间重叠。
gc.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(bb3, gc);
GridBagConstraints gc1 = new GridBagConstraints();
gc1.weighty = 22;
gc1.ipadx = 50; gc1.ipady = 50; //将组件的最小尺寸加大ipadx2个像素。
gr.setConstraints(bb4, gc1);
gc1.ipadx = 0;
gc1.ipady = 0; //将以后的组件的最小尺寸设定为默认值,如果省掉该行,则以后组件的最小尺寸都会加大ipadx2个像素。
gc1.anchor = GridBagConstraints.NORTHWEST; //将下一个组件bb5的位置放置在单元格线的西北方向。
gr.setConstraints(bb5, gc1); //因为bb5未设定fill,bb5设定了weightx(由gc参数设定)和weighty两个值以确定bb5所在的格线单元的大小,因而组件bb5的原始最小尺寸无法占据整个格线单元。
gc1.fill = GridBagConstraints.BOTH;
gc1.gridwidth = GridBagConstraints.REMAINDER;
gr.setConstraints(bb6, gc1);
gc1.weighty = 33;
gc1.insets = new Insets(5, 15,40,150); //使下一个组件bb7与格线单元之间在上,左,下,右,分别保持5,15,40,150个像素的空白位置。
gr.setConstraints(bb7, gc1);
gc1.weighty = 0;
gc1.insets = new Insets(0, 0, 0, 0); //将insets的参数值设为默认值。
gr.setConstraints(bb8, gc1);
ff.setSize(500, 300);
ff.add(bb1); ff.add(bb2); ff.add(bb3); ff.add(bb4); ff.add(bb5); ff.add(bb6); ff.add(bb7); ff.add(bb8);
ff.setVisible(true);}}

Copyright@2015-2025 www.aizhengw.cn 癌症网版板所有