`
hgfghw6
  • 浏览: 44713 次
  • 性别: 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大小改变时,各组件的相对位置保持不变。
分享到:
评论

相关推荐

    SWT/JFace专题 --- SWT/JFace概述

    SWT (Standard Widget Toolkit) 和 JFace 是两个在Java中用于构建图形用户界面(GUI)的重要库,尤其在开发Eclipse插件时被广泛应用。它们是开源项目,由Eclipse基金会维护,为开发者提供了丰富的控件和高级UI设计...

    SWT/Jface API 3.4

    8. **Layout Managers**:SWT 提供了多种布局管理器,如 FillLayout、GridLayout、FormLayout 等,用于控制组件在容器中的排列方式。 9. **Action and Menu Support**:SWT/Jface 提供了对菜单、工具栏和快捷键的...

    SWT/JFACE客户端登录窗口例子

    9. **布局管理**:为了美观地排列控件,需要使用布局管理器,如 `GridLayout` 或 `FormLayout`。这确保了窗口在不同屏幕分辨率和尺寸下都能正确显示。 10. **样式和主题**:SWT 允许自定义窗口的外观,包括颜色、...

    Eclipse SWT/JFace 核心应用光盘源码

    4. **布局管理**:为了在屏幕上有效地排列组件,SWT提供了多种布局管理器,如FillLayout、GridLayout和StackLayout等。 5. **数据绑定**:JFace的数据绑定机制源码,展示了如何将数据模型与用户界面元素进行连接。 ...

    swt/jface in action +中文版+英文版+源码 下载

    2. 控件和布局管理:讲解如何创建和组织SWT控件,以及使用不同的布局管理器来控制窗口布局。 3. 数据绑定:介绍JFace的数据绑定机制,让数据与界面元素自动同步。 4. 视图和编辑器:讨论如何创建和集成视图和编辑器...

    swt/jface实例开发

    2. **布局管理**:讲解如何使用GridLayout、FormLayout、FillLayout等布局管理器来组织控件。 3. **事件处理**:如何编写事件监听器,响应用户的点击、输入等操作。 4. **数据绑定**:通过JFace的数据绑定服务,将...

    Eclipse swt/jface核心应用源码(带视频)

    3. **布局管理**:理解并使用SWT的布局管理器,如`GridLayout`, `FillLayout`, ` MigLayout`等,以控制组件的排列和大小。 4. **数据绑定**:JFace的`ObservableValue`和`DataBindingContext`等类如何帮助保持视图...

    SWT/JFace 3.5 API (CHM)

    4. API内容:SWT 3.5 API涵盖了控件(Widgets)、事件和监听器(Listeners)、布局管理(Layouts)、颜色和字体(Colors and Fonts)等方面。JFace 3.5 API则包括数据绑定(Data Binding)、视图(Views)、对话框...

    swt/jface api帮助文档

    3. **布局管理**:SWT提供了几种布局管理器,如FillLayout、GridLayout、RowLayout和 MigLayout,用于控制组件在容器中的排列方式。 4. **颜色和字体**:SWT允许开发者自定义控件的颜色和字体,以实现个性化的用户...

    SWT/JFACE API

    2. **布局管理**:SWT支持多种布局管理器,如`FillLayout`, `GridLayout`, `RowLayout`, ` MigLayout`等,用于控制控件在窗口中的排列方式。 3. **事件与监听器**:通过注册监听器,开发者可以响应用户的操作,如...

    Eclipse SWT/JFace 核心应用

    3. **布局管理**:SWT支持多种布局管理器,如FillLayout、GridLayout、 MigLayout等,帮助组织和调整组件的位置和大小。 4. **数据绑定**:JFace的DataBindingContext可以实现模型和视图之间的双向绑定,当模型数据...

    SWT-JFace-3.5-API.chm.7z

    比如,你可以看到如何使用`Display`来创建和管理线程,如何用`Shell`创建窗口,以及如何使用`Composite`和布局管理器来组织和排列子组件。在JFace部分,你会学习如何利用`LabelProvider`和`ContentProvider`来连接...

    Eclipse SWT/JFace 书中 全部实例

    7. SWT Layouts:熟悉不同的布局管理器,如FillLayout、GridLayout、FormLayout等,合理安排控件的排列。 8. Menu和ToolBar:创建菜单栏和工具栏,提供用户友好的交互界面。 9. 模块化设计:通过实例学习如何将...

    swt.rar_java swt_jface_swt/jface

    在学习SWT和JFace时,你需要了解它们的事件模型,如何使用布局管理器来组织窗口元素,以及如何处理用户输入和响应。同时,数据模型和控件之间的绑定也是关键,这可以帮助实现动态更新视图和保持数据一致性。 通过...

    eclipse swt/jface核心应用

    2. **布局管理**:SWT提供了各种布局管理器,如FillLayout、GridLayout、FormLayout等,用于控制控件在容器中的排列方式。 3. **数据模型**:JFace的DataBinding机制允许将UI组件与数据模型进行绑定,当数据模型...

    Eclipse Swt/Jface核心应用 (09-09章)

    1. **Swt控件与布局管理**:讲解Swt中的各种控件,如按钮、文本、表格、树等,以及如何使用布局管理器(如FillLayout、GridLayout、StackLayout等)来组织这些控件,实现用户界面的布局。 2. **事件处理**:介绍Swt...

    swt/jface in action中文版

    而 JFace 进一步扩展了 SWT 的功能,增加了数据绑定、视图管理等功能,使得 UI 开发变得更加简单。 - **许可证与平台支持**:SWT 和 JFace 均采用 Eclipse Public License (EPL) 许可证发布,这意味着开发者可以...

    swt/jface mdi

    3. **布局管理**:SWT 提供了多种布局管理器(如 `FillLayout`, `GridLayout`, `RowLayout` 等),用于组织窗口内的控件。在 MDI 应用中,需要一个能适应 MDI 子窗口动态变化的布局,比如 `MDILayout`。 4. **菜单...

    Eclipse Swt/Jface核心应用 (01-03章)

    - **组件与布局管理**:介绍SWT中的各种基本组件,如Shell、Composite、Button、Text等,并讲解如何使用布局管理器(如FillLayout、GridLayout、RowLayout)来组织这些组件。 - **事件处理**:讲解如何监听和处理...

Global site tag (gtag.js) - Google Analytics