`
hgfghw6
  • 浏览: 43533 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

SWT/JFace常用组件----布局管理器

阅读更多

  在 Java 中, GUI 程序开发的目标之一是跨平台,而每种类型操作系统对屏幕的定义不一样,所以 Swing 中引入了布局的概念,对子组件的位置和大小等信息进行定义。 SWT 中也采用了布局方式,用户可使用布局来控制组件中元素的位置和大小等信息。 
  组 件可以用方法setBounds (int x, int y, int width, int height) 来指定该组件相对于父组件的位置和组件的大小。组件的这种定位方式称为绝对定位。当组件数量较多,布局较复杂时,则要使用布局管理器 LayoutManager来进行定位,这时,每个控件的坐标X、Y、宽度和高度都是通过 LayoutManager 设置的,这种定位方式称为托管定位。SWT 提供了一些常用的布局管理器供用户使用;在本章中,将介绍四种基本的布局管理器: FillLayout 、 RowLayout 、 GridLayout 和 FormLayout 。在布局管理器中,每当重新设置复合组件的大小,都需要进行定位。 
  布局管理器常常是专为某一个复合组件设计的。一些布局管理器只使用它们自身的参数就可以控制,而另一些布局管理器还需要其它参数( LayoutData ),该参数是在设置布局管理器的复合组件中的每个控件上指定的。 SWT 中常用的布局管理器有如下一些: 
  FillLayout :充满式布局,在容器中以相同的大小以单行或单列排列组件。 
  RowLayout :行列式布局,以单行或多行的方式定制组件的排列方式。 
  GridLayout :网格式布局,以网格的方式进行布局,组件可以占用指定的一个或几个网格。 
  FormLayout :表格式布局,通过定义组件四个边的距离来排列组件,被引用的相对的组件可以是父组件,也可以是同一容器中的其它组件。
  4.4.1 充满式布局
  充 满式布局(FillLayout类)是最简单的布局管理器。它把组件按一行或一列充满整个容器,并强制组件的大小一致。一般,组件的高度与最高组件相同, 宽度与最宽组件相同。FillLayout不能折行,不能设置边界距离和间距。如果容器中只有一个组件,则该组件会充满整个容器。
  1.构造方法:
  FillLayout() 创建按一行充满容器的对象。
  FillLayout(int type) 创建按指定类型充满容器的对象,指定类型(type)有:SWT.HORIZONTAL 按一行充满容器。
  SWT.VERTICAL 按一列充满容器。
  2.常用属性:
  int type 指定组件充满容器的类型。type的取值同上。
  要将组件按一列充满容器,可以设置type属性,代码如下:
  FillLayout filllayout=new FillLayout(); //创建FillLayout对象
  Filllayout.type=SWT.VERTICAL; //设置type的值
  shell.setLayout(filllayout); //将FillLayout对象用于shell上
  new Button(shell,SWT.PUSH).setText("超宽按钮1");//在shell中创建按钮
  new Button(shell,SWT.PUSH).setText("按钮2");
  new Button(shell,SWT.PUSH).setText("按钮3");
  new Button(shell,SWT.PUSH).setText("按钮4");
  例4.11 充满式布局示例。
  package edu.ch4;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  import org.eclipse.swt.layout.*;
  public class Sample4_11 {
  public static void main(String[] args) {
  Display display=new Display();//创建一个display对象。
  final Shell shell=new Shell(display);//shell是程序的主窗体
  shell.setText("FillLayout示例");
  FillLayout filllayout=new FillLayout(); //创建FillLayout对象
  shell.setLayout(filllayout); //将FillLayout对象用于shell上
  new Button(shell,SWT.PUSH).setText("超宽按钮1");//在shell中创建按钮
  new Button(shell,SWT.PUSH).setText("按钮2");
  new Button(shell,SWT.PUSH).setText("按钮3");
  new Button(shell,SWT.PUSH).setText("按钮4");
  shell.pack();
  shell.open();
  while(!shell.isDisposed()){ //如果主窗体没有关闭则一直循环
  if(!display.readAndDispatch()){ //如果display不忙
  display.sleep(); //休眠
  }
  }
  display.dispose(); //销毁display
  }
  }
  如果要将按钮按竖直方向排列,也可以只修改以下一行语句:
  Layout layout=new FillLayout(SWT.VERTICAL);
  4.4.2 行列式布局
  行列式布局(RowLayout类)可以使组件折行显示,可以设置边界距离和间距。另外,还可以对每个组件通过setLayoutData()方法设置RowData对象。RowData用来设置组件的大小。
  1.构造方法:
  RowLayout() 创建按行放置组件的对象。
  RowLayout(int type) 创建按指定类型放置组件的对象。指定类型(type)有:
  SWT.VERTICAL 按列放置组件。
  SWT.HORIZONTAL 按行放置组件。
  2.常用属性:
  int marginWidth:组件距容器边缘的宽度(像素),默认值为0。
  int marginHeight:组件距容器边缘的高度(像素),默认值为0。
  int marginTop:组件距容器上边缘的距离(像素),默认值为3。
  int marginBottom:组件距容器下边缘的距离(像素),默认值为3。
  int spacing:组件之间的距离,默认值为3。
  boolean justify:如果该属性为true,则组件间的距离随容器的拉伸而变大。默认值为false。
  boolean wrap:如果该属性为true,则当容器空间不足时会自动折行;如果该属性为false,不自动折行。默认值为true。
  boolean pack:如果该属性为true,组件大小为设定值;如果该属性为false,则强制组件的大小相同。默认值为true。
  int type:使组件按指定式样放置,(type=SWT.HORIZONTAL|SWT.VERTICAL),默认为按行放置,默认值为SWT.HORIZONTAL。
  3.RowData类:
  RowData称为RowLayout的布局数据类,可用于改变容器中组件的外观形状。其构造方法:
  RowData(int width,int height);
  例如:
  Button bt1=new Button(shell,SWT.PUSH); //创建按钮
  bt1.setText("按钮1");
  RowData rowdata=new RowData(60,30); //创建布局数据类的对象
  bt1.setLayoutData(rowdata);    //设置按钮的布局数据
  利用RowData对象设置按钮(bt1)的宽度是60像素,高度是30像素。
  例4.12 行列式布局。
  package edu.ch4;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.layout.*;
  import org.eclipse.swt.widgets.*;
  public class Sample4_12 {
  public static void main(String[] args) {
  Display display=new Display();//创建一个display对象。
  final Shell shell=new Shell(display);//shell是程序的主窗体
  shell.setText("FillLayout示例");
  RowLayout rowlayout=new RowLayout(); //创建按行放置组件的对象
  rowlayout.pack=false; //强制组件大小相同
  rowlayout.wrap=false; //不自动折行
  rowlayout.marginWidth=20; //组件距容器边缘的宽度为20像素
  rowlayout.marginHeight=20; //组件距容器边缘的高度为20像素
  rowlayout.spacing=10; //组件之间的间距为10像素
  shell.setLayout(rowlayout); //设置容器shell的布局方式为rowlayout
  Button bt1=new Button(shell,SWT.PUSH); //创建按钮
  bt1.setText("按钮1");
  RowData rowdata=new RowData(80,30); //创建布局数据类的对象
  bt1.setLayoutData(rowdata);    //设置按钮的布局数据
  new Button(shell,SWT.PUSH).setText("按钮2");
  new Button(shell,SWT.PUSH).setText("按钮3");
  new Button(shell,SWT.PUSH).setText("按钮4");
  shell.pack(); //自动调整容器shell的大小
  shell.open(); //打开主窗体
  while(!shell.isDisposed()){ //如果主窗体没有关闭则一直循环
  if(!display.readAndDispatch()){ //如果display不忙
  display.sleep(); //休眠
  }
  }
  display.dispose(); //销毁display
  }
  }
  当 rowlayout.pack=true时,各按钮为设定值;当rowlayout.pack=false时,各按钮被强制设定为相同 大小,如;当rowlayout.justify=true时,将主窗体拉伸,各按钮间的距离也增大,但间隔均匀分布; 当rowlayout.justify=false时,将主窗体拉伸,各按钮间距不变,如图4.20所示;当rowlayout.wrap=false 时,当主窗体宽度收缩,按钮自动折行,如图4.21所示;当rowlayout.wrap=false时,主窗体宽度收缩,按钮不会折行,
  4.4.3 网格式布局
  网格式布局(GridLayout类)是实用而且功能强大的标准布局,也是较为复杂的一种布局。这种布局把容器分成网格,把组件放置在网格中。 GridLayout有很多可配置的属性,和RowLayout一样,也有专用的布局数据类GridData, GridLayout的强大之处在于它可以通过GridData来设置每一个组件的外观形状。GridLayout的构造方法无参数,但可以通过 GfidData和设置GridLayout的属性来设置组件的排列及组件的形状和位置。
  1.GridLayout的属性
  int numColumns:设置容器的列数,组件从左到右按列放置,当组件数大于列数时,下一个组件将自动添加新的一行。默认值为1列。
  boolean makeColumnsEqualWidth:强制使列都具有相同的宽度,默认值为false。
  int marginWidth:设置组件与容器边缘的水平距离,默认值为5。
  int marginHeight:设置组件与容器边缘的垂直距离,默认值为5。
  int horizontalSpacing:设置列与列之间的间隔,默认值为5。
  int verticalSpacing:设置行与行之间的间隔,默认值为5。
  例4.13 GridLayout的属性设置。
  package edu.ch4;
  import org.eclipse.swt.*;
  import org.eclipse.swt.widgets.*;
  import org.eclipse.swt.layout.*;
  public class Sample4_13 {
  public static void main(String[] args) {
  Display display = new Display();
  Shell shell = new Shell(display);
  shell.setText("GridLayout示例");
  GridLayout gridLayout = new GridLayout();
  gridLayout.numColumns = 3;
  gridLayout.horizontalSpacing=30;
  gridLayout.makeColumnsEqualWidth=true;
  shell.setLayout(gridLayout);
  new Button(shell, SWT.PUSH).setText("B1");
  new Button(shell, SWT.PUSH).setText("超宽按钮 2");
  new Button(shell, SWT.PUSH).setText("按钮 3");
  new Button(shell, SWT.PUSH).setText("B4");
  new Button(shell, SWT.PUSH).setText("按钮 5");
  shell.pack();
  shell.open();
  while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
  } 
  display.dispose();
  }
  }
  当 gridLayout.numColumns分别为1、2、3时,按钮依次按1列、2列和3列排列,运行结果如图4.23~4.25所示;当 makeColumnsEqualWidth=true时,虽然按钮宽度不同,但列宽相同,如图4.26所示;当 horizontalSpacing=30时,列间距为30,
  2.布局数据类(GridData类)
  GridData是GridLayout专用的布局数据类,用GridData可以构建很多复杂的布局方式。① GridData的构造方法如下:
  GridData(); 创建一个属性值为默认值的对象。
  GridData(int type); 创建一个指定类型(type)的对象。
  ② GridData常用类型如下:
  GridData.FILL 通常与GridData类的对象属性horizontalAlignment和verticalAlignment配合使用,充满对象属性指定的空间。
  GridData. FILL_HORIZONTAL 水平充满,组件充满网格水平方向的空间。
  GridData. FILL_VERTICAL 垂直充满,组件充满网格垂直方向的空间。
  GridData. FILL_BOTH 双向充满,组件充满水平和垂直方向的空间。
  GridData.HORIZONTAL_ALIGN_BEGINNING 水平对齐靠左,组件在网格中靠左放置。
  GridData.HORIZONTAL_ALIGN_CENTER 水平对齐居中,组件在网格中居中放置。
  GridData.HORIZONTAL_ALIGN_END 水平对齐靠右,组件在网格中靠右放置。
  ③ GridData常用对象属性如下:
  int horizontalSpan 设置组件占用的列数,默认值为1。
  int verticalSpan 设置组件占用的行数,默认值为1。
  horizontalAlignment 设置组件的对齐方式为水平方向。
  verticalAlignment 设置组件的对齐方式为垂直方向。
  grabExcessHorizontalSpace 抢占额外的水平空间。
  grabExcessVerticalSpace 抢占额外的垂直空间。
  horizontalAlignment和verticalAlignment可以取以下值:
  BEGINNING 开始(水平对齐时居左;垂直对齐时居上)
  CENTER 居中
  END 结束(水平对齐时居右;垂直对齐时居下)
  FILL 充满
  默认的horizontalAlignment值是BEGINNING。默认的verticalAlignment值是CENTER。
  例4.14 使用gridData布局。
  package edu.ch4;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.layout.*;
  import org.eclipse.swt.widgets.*;
  public class Sample4_14 {
  public static void main(String[] args) {
  Display display = new Display();
  Shell shell = new Shell(display);
  shell.setText("GridData示例");
  GridLayout gridLayout = new GridLayout();//创建网格布局对象
  gridLayout.numColumns = 3; //设置网格布局列数为3
  gridLayout.makeColumnsEqualWidth=true; //强制列宽相等
  shell.setLayout(gridLayout); //将shell设置为指定的网格布局式样
  GridData gridData=new GridData(); //创建网格布局数据对象
  gridData.horizontalSpan = 2; //水平方向跨2列
  gridData.verticalSpan=2; //垂直方向跨2行
  gridData.horizontalAlignment = GridData.CENTER; //水平方向居中
  gridData.verticalAlignment = GridData.FILL; //垂直方向充满 
  Button b1=new Button(shell, SWT.PUSH); //创建按钮对象b1
  b1.setText("B1");
  b1.setLayoutData(gridData); //将设定的网格布局数据用于按钮对象b1
  new Button(shell, SWT.PUSH).setText("超宽按钮 2");
  new Button(shell, SWT.PUSH).setText("按钮 3");
  Button b4=new Button(shell, SWT.PUSH);
  b4.setText("B4");
  //用带参数的构造方法创建gridData对象
  gridData = new GridData(GridData.FILL_HORIZONTAL);
  b4.setLayoutData(gridData); //将gridData用于b4,水平方向充满
  Button b5=new Button(shell, SWT.PUSH);
  b5.setText("按钮 5");
  gridData = new GridData();
  gridData.horizontalAlignment = GridData.FILL;//设置b5为水平方向充满
  b5.setLayoutData(gridData);
  new Button(shell, SWT.PUSH).setText("按钮 6");
  Text t1=new Text(shell,SWT.BORDER);
  t1.setText("文本框 1");
  gridData = new GridData();
  gridData.verticalSpan = 2; //跨两行
  gridData.horizontalSpan=2; //跨两列
  gridData.verticalAlignment = GridData.FILL; //垂直方向充满
  gridData.grabExcessVerticalSpace = true; //抢占垂直方向额外空间
  gridData.horizontalAlignment = GridData.FILL;//水平方向充满
  gridData.grabExcessHorizontalSpace = true;//抢占水平方向额外空间
  t1.setLayoutData(gridData); //gridData用于文本框t1
  new Button(shell, SWT.PUSH).setText("按钮 7");
  new Button(shell, SWT.PUSH).setText("按钮 8");
  shell.pack();
  shell.open();
  while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) display.sleep();
  } 
  display.dispose();
  }
  }
  虽然按钮b1和文本框t1都占两行两列,但由于t1水平方向和垂直方向的alignment属性都是FILL,因此文本框t1充 满了两行和两列的空间,而按钮b1的horizontalalignment属性是CENTER,而verticalalignment属性是FILL, 所以水平方向居中放置,而垂直方向充满了两行。按钮b4和b5采用了不同的构造方法来创建gridData对象,但都充满了该列的水平空间。
  当窗 体变大时,由于设置了抢占水平方向和垂直方向额外的空间,即grabExcessVerticalSpace = true和grabExcessHorizontalSpace = true,所以文本框t1随窗体的拉伸而变大,反之,当窗体缩小时,t1也会缩小。按钮b4和b5设置了水平方向充满属性,所以窗体拉伸时水平方向也会随 之拉伸。其余的组件大小不变。如图4.29所示。这说明,如果组件所在的行变宽或列变高,所有具有填充(FILL)属性的组件也会变宽或变高;而具有 BEGINNING、CENTER、END属性的组件不会改变其大小。
  4.4.4 表格式布局
  表 格式布局(FormLayout类)是一种非常灵活、精确的布局方式,这个布局是SWT2.0版新增的。FormLayout也有专用的布局数据类 FormData,此外,还增加了一个FormAttachment类。FormAttachment定义了组件的四边与父容器(Shell、 Composite等)的边距,为保证组件在父容器中的相对位置不变,FormAttachment类用不同的构造方法来实现组件的定位,用 FormData和FormAttachment配合,可以创建复杂的界面,而且当主窗体大小改变时,组件的相对位置能保持相对不变。 FormLayout的构造方法:FormLayout()。
  1.FormLayout的属性
  int marginWidth:设置组件与容器边缘的水平距离,默认值为0。
  int marginHeight:设置组件与容器边缘的垂直距离,默认值为0。
  例如,以下代码把父容器(shell)的四周边距都设置成10像素。
  Display display = new Display ();
  Shell shell = new Shell (display);
  FormLayout formlayout= new FormLayout ();
  formlayout.marginHeight = 10;
  formlayout.marginWidth = 10;
  shell.setLayout (formlayout);
  2.FormData类
  ① FormData的构造方法
  FormData() 默认构造方法,组件的宽度和高度要用属性width和height设置。
  FormData(int width,int height) 参数width和height设置组件的宽度和高度。
  ② FormData的属性
  width 设置组件的宽度。
  height 设置组件的高度。
  top 和FormAttachment配合设置组件顶部和父容器顶部的边距。
  bottom 和FormAttachment配合设置组件底部和父容器底部的边距。
  left 和FormAttachment配合设置组件左边和父容器左边的边距。 
  right 和FormAttachment配合设置组件右边和父容器右边的边距。
  如果FormData中的width和height设置的宽度和高度与FormAttachment设置的约束发生冲突,则按照FormAttachment设置,width和height的设定值就不起作用了。
  3.FormAttachment类
  Attachment的含义是附着、粘贴。FormAttachment类就是用来指定组件在父容器中的粘贴位置。FormAttachment计算组件粘贴位置和组件大小的方法是依据下面的表达式:
  y = ax + b
  表达式中y是纵坐标,从上往下是正方向;x是横坐标,从左至右是正方向;a是斜率(a=m/n,n≠0),b是偏移量,沿x、y轴正方向的偏移量为正,反之为负。.
  ① FormAttachment的构造方法
  FormAttachment() 组件紧贴父容器的左边缘和上边缘,如果父容器设置了FormLayout属性marginWidth和marginHeight,则距父容器的上边缘和左边缘为marginHeight和marginWidth的设定值。
  FormAttachment(Control control) 以指定的组件control为参照物。
  FormAttachment(Control control, int offset) 以指定的组件control为参照物,相对指定组件的偏移量为offset。
  FormAttachment(Control control, int offset,int alignment) 以指定的组件control为参照物,相对指定组件的偏移量为offset,对齐方式为alignment。alignment的取值如下:
  SWT.TOP、SWT.BOTTOM、SWT.LEFT、SWT.RIGHT、SWT.CENTER
  FormAttachment(int m,int n, int offset) 以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位,m为a的分子,n为a的分母,offset是偏移量。
  FormAttachment(int m, int offset) 以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位,m为a的分子,a的分母为默认值100,offset是偏移量。
  FormAttachment(int m) 以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位,m为a的分子,a的分母为默认值100,偏移量为默认值0。
  例4.15 FormData与FormAttachment的配合使用。
  package edu.ch4;
  import org.eclipse.swt.*;
  import org.eclipse.swt.layout.*;
  import org.eclipse.swt.widgets.*;
  public class Sample4_15 {
  public static void main(String[] args) {
  Display display = new Display ();
  Shell shell = new Shell (display);
  shell.setText("FormLayout示例");
  FormLayout formLayout= new FormLayout(); //创建表格布局对象formLayout
  shell.setLayout(formLayout); //设置shell的布局方式为表格布局
  formLayout.marginHeight = 10; //设置shell的上下边距为10像素
  formLayout.marginWidth = 20; //设置shell的左右边距为10像素
  Button b1=new Button(shell,SWT.PUSH);
  b1.setText("B1");
  FormData formData1=new FormData(); //创建布局数据对象formData1
  formData1.width=100; //按钮b1的宽度为100像素
  formData1.height=50; //按钮b1的高度为50像素
  b1.setLayoutData(formData1); //设置b1的布局数据为formData1
  Button b2=new Button(shell,SWT.PUSH);
  b2.setText("B2");
  //创建FormAttachment对象formAttachment,以b1为参照物
  FormAttachment formAttachment=new FormAttachment(b1); //指定B1为参照物
  FormData formData2=new FormData(50,30); //创建FormData对象,宽度50,高度30
  formData2.left=formAttachment; //b2的左边紧贴与b1的右边
  b2.setLayoutData(formData2); //设置b2的布局数据为formData2
  Button b3=new Button(shell,SWT.PUSH);
  b3.setText("B3");
  FormData formData3=new FormData();//创建布局数据对象formData3
  formData3.top=new FormAttachment(b2,10,SWT.BOTTOM);//b2的底边与b3的顶部距离为10
  formData3.left=new FormAttachment(b2,0,SWT.LEFT);//b2的左边与b3左边位移为0,
  //即左边对齐
  formData3.right=new FormAttachment(b2,0,SWT.RIGHT); //b2的右边与b3右边对齐
  b3.setLayoutData(formData3); //设置b3的布局数据为formData3
  shell.pack();
  shell.open();
  while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) {
  display.sleep();
  }
  }
  display.dispose();
  }
  }
  本例中,按钮B1的宽度和高度由FormData设置,按钮的位置为默认的位置,即shell的左上角,边距由 maginHeight和maginWidth设置。按钮B2以B1为参照物,位置紧靠B1右侧,B2的上部与shell的距离由maginHeight 设定,B2的右边与shell的边距由maginWidth设定。按钮B3以B2为参照物,FormData3.TOP设定了B3的顶部距离B2的底部位 移为10像素、FormData3.LEFT设定了B3与B2左边对齐、FormData3.RIGHT设定了B3与B2右边对齐。如果要使B1右侧与 B2左侧相距20相素,可将FormAttachment的构造方法增加偏移量20,如:
  FormAttachment formAttachment=new FormAttachment(b1,20);
  。
  构 造方法FormAttachment(int m,int n, int offset) 是以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位的,当分子m=0时,组件以父容器的左边或上边为基准,偏移量为正数;当分子m=100 时,组件以父容器的右边或下边为基准,偏移量为负数。当父容器的大小改变时,组件与父容器的基准边保持设定的距离,组件的大小随父容器的改变而变化。
  例4.16构造方法FormAttachment(int m,int n, int offset)的使用示例。
  package edu.ch4;
  import org.eclipse.swt.*;
  import org.eclipse.swt.layout.*;
  import org.eclipse.swt.widgets.*;
  public class Sample4_16 {
  public static void main(String[] args) {
  Display display = new Display ();
  Shell shell = new Shell (display);
  shell.setText("FormLayout示例");
  FormLayout formlayout= new FormLayout();
  formlayout.marginHeight=10; //设置shell的上、下边缘和组件的距离为10像素
  Button b1=new Button(shell,SWT.PUSH);
  b1.setText("B1");
  FormData formData1=new FormData(); //创建布局数据对象formData1
  formData1.top=new FormAttachment(0,50); //设置组件B1的顶部离父容器
  //shell上边缘的距离为50像素
  formData1.bottom=new FormAttachment(100,-50);//设置组件B1的底部离shell的下
  //边缘的距离为50像素
  formData1.left=new FormAttachment(0,50); //设置组件B1的左边离shell的左
  //边距离为50像素
  formData1.right=new FormAttachment(100,-50); //设置组件B1的右边离shell的右
  //边距离为50像素
  formData1.width=100; //按钮b1的宽度为100像素
  formData1.height=50; //按钮b1的高度为50像素
  b1.setLayoutData(formData1); //设置b1的布局数据为formData1
  Button b2=new Button(shell,SWT.PUSH);
  b2.setText("B2");
  FormAttachment formAttachment=new FormAttachment();//创建FormAttachment对象
  FormData formData2=new FormData(50,30); //创建FormData对象,宽度50,高度30
  formData2.left=formAttachment; //B2的左边与shell左边缘的距离为0
  formData2.top=formAttachment; //B2的上边与shell上边缘的距离为
  //marginHeight设定的值(10像素)
  b2.setLayoutData(formData2); //设置b2的布局数据为formData2
  shell.setLayout(formlayout);
  shell.pack();
  shell.open();
  while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) {
  display.sleep();
  }
  }
  display.dispose();
  }
  }
  B1与shell四边的距离相等 、shell改变后B1与其四边的距离仍相等
  综合布局示例。
  package edu.ch4;
  import org.eclipse.swt.widgets.*;
  import org.eclipse.swt.layout.*;
  import org.eclipse.swt.SWT;
  public class Sample4_17 {
  public static void main(String[] args) {
  Display display = new Display();
  Shell shell = new Shell(display);
  shell.setText("FormLayout示例");
  FormLayout formlayout = new FormLayout(); //创建表格布局对象
  shell.setLayout(formlayout);
  Label label=new Label(shell,SWT.BORDER); //在shell中创建Label对象
  label.setText("Label One");
  FormData data = new FormData();
  data.top = new FormAttachment(0, 5); //Label与shell上边框相距5象素
  data.left = new FormAttachment(0, 5); // Label与shell左边框相距5象素
  data.bottom = new FormAttachment(50, -5);//Label在shell水平中线上方5象素
  data.right = new FormAttachment(50, -5); // Label在shell垂直中线左边5象素
  label.setLayoutData(data);
  Composite composite = new Composite(shell, SWT.NONE);//创建面板
  GridLayout gridLayout = new GridLayout(); //创建网格布局对象
  gridLayout.marginHeight = 0; 
  gridLayout.marginWidth = 0;
  composite.setLayout(gridLayout); //设置面板布局方式为网格布局
  Button b1 = new Button(composite, SWT.PUSH); //在composite上创建button B1
  b1.setText("B1");
  GridData gridData = new GridData(GridData.FILL_BOTH); //设置布局方式为双向填充
  b1.setLayoutData(gridData); 
  Button b2 = new Button(composite, SWT.PUSH); //B2设置同B1
  b2.setText("B2");
  gridData = new GridData(GridData.FILL_BOTH);
  b2.setLayoutData(gridData);
  Button b3 = new Button(composite, SWT.PUSH); //B2设置同B1
  b3.setText("B3");
  gridData = new GridData(GridData.FILL_BOTH);
  b3.setLayoutData(gridData);
  data = new FormData(); //创建FormData对象
  data.top = new FormAttachment(0, 5); //设置composite距shell上边框5象素
  data.left = new FormAttachment(label, 5);//设置composite距label 5象素
  data.bottom = new FormAttachment(50, -5);//设置composite在shell水平中线上方5象素
  data.right = new FormAttachment(100, -5);//设置composite在shell右边框的左侧5象素
  composite.setLayoutData(data); //设置composite的布局数据
  Text text=new Text(shell,SWT.BORDER); //创建Text对象
  text.setText("Text");
  data = new FormData(); //创建表格布局数据
  data.top = new FormAttachment(label, 5); //text上方离label 5象素
  data.left = new FormAttachment(0, 5); // text左边离shell左边框5象素
  data.bottom = new FormAttachment(100, -5); // text下边框离shell下边框5象素
  data.right = new FormAttachment(100, -5); // text右边框离shell右边框5象素
  text.setLayoutData(data); //设置text的布局数据
  shell.pack();
  shell.open();
  while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) {
  display.sleep();
  }
  }
  display.dispose();
  }
  }
  当窗体shell大小改变时,各组件的相对位置保持不变。
分享到:
评论

相关推荐

    Eclipse_Swt_Jface_核心应用_部分19

    第7章 SWT布局管理器 98 7.1 布局管理器概述 98 7.1.1 绝对定位 98 7.1.2 托管定位 98 7.1.3 常见的布局管理器 100 7.2 FillLayout(充满式布局) 100 7.2.1 水平填充(默认)和垂直填充 101 7.2.2 ...

    SWT(JFace)体验之FillLayout布局

    FillLayout布局 FillLayout是非常简单的一种布局方式,它会以同样大小对父组件中的子组件进行布局,这些子组件将以一行或一列的形式排列。一般来说,用户可以在任务栏、工具栏中放置FillLayout布局,通过FillLayout...

    SWT(JFace)体验之GridLayout布局

    GridLayout布局 GridLayout 布局的功能非常强大,也是笔者常用的一种布局方式。GridLayout是网格式布局,它把父组件分成一个表格,默认情况下每个子组件占据一个单元格的空间,每个子组件按添加到父组件的顺序排列在...

    SWT(JFace)体验之RowLayout布局

    属性”的方式设置RowLayout的布局风格,RowLayout中常用的属性如下。Wrap:表示子组件是否可以换行(true为可换行)。Pack:表示子组件是否为保持原有大小(true为保持原有大小)。Justify:表示子组件是否根据父...

    Eclipse从入门到精通(SWT部分)

    SWT是一个IBM开发的跨平台GUI(Graphical User Interface,图形用户界面)开发工具包。本文包括一些SWT的基础知识和基本组件,以及布局事件的相关源代码实例。

    Eclipse权威开发指南3.pdf

    7.4.2 扩展用户界面的常用方法.... 186 7.4.3 用户界面的扩展怎样感知某些事件(如用户的选择)?..... 189 7.4.4 怎样扩展对象(如显示在Outline视图中的对象). 193 7.4.5 不同视图中显示的相同对象之间的...

    Eclipse权威开发指南1.pdf

    7.4.2 扩展用户界面的常用方法.... 186 7.4.3 用户界面的扩展怎样感知某些事件(如用户的选择)?..... 189 7.4.4 怎样扩展对象(如显示在Outline视图中的对象). 193 7.4.5 不同视图中显示的相同对象之间的...

    Eclipse权威开发指南2.pdf

    7.4.2 扩展用户界面的常用方法.... 186 7.4.3 用户界面的扩展怎样感知某些事件(如用户的选择)?..... 189 7.4.4 怎样扩展对象(如显示在Outline视图中的对象). 193 7.4.5 不同视图中显示的相同对象之间的关系.......

Global site tag (gtag.js) - Google Analytics