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

SWT/JFace学习总结 --- 发表一篇以前写得项目开发总结 SWT/JFace学习总结一. SWT/JFace的基本介绍1.1 Face与其他图形界面设计工具的比较Java图形界面实现方式有很多,比如AWT、SWING和SWT等。AWT和SWING不论是在速度上还是美观上都有很大的不足;对于比较庞大而复杂的系统,用AWT或SWING相很难实现,因为运行的速度会相当的慢。SWT直接使用操作系统提供的本地图形接口,具备本地化的Look & Fe 阅读详情

在 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.in.Action》深入介绍Java图形用户界面开发,着重于SWT和JFace开源库。SWT提供原生GUI开发能力,而JFace在此基础上提供了数据绑定和高级组件。全书由基础概念到实战应用,系统讲解了控件、布局、事件、线程、数据绑定及对话框设计等多个方面,并通过实例代码展示了如何使用这些技术来创建复杂的用户界... 阅读详情

相关推荐

全面探索SWT/JFace:Java GUI编程

本文还有配套的精品资源,点击获取 简介:本文详细介绍了SWT和JFace,这是Eclipse项目中的两个Java GUI编程库。SWT提供了一个与原生控件交互的用户界面,并通过JNI提高性能。JFace则在SWT之上增加了一层抽象,简化了GUI编程,并引入了数据绑定和MVC架构等概念。文章将覆盖基础控件使用、布局管理、事件处理以及如何进行高级主题的学习,例如集成SWT和JF...

weixin_42298164的博客 1004

SWT之FormAttachment

转载:https://blog.youkuaiyun.com/naughty610/article/details/5309862 像其它的layout类一样,FormLayout用的data类是:FormData。FormData用另外一 个类来控制窗口小部件的大小和位置: FormAttachment.一个FormData最多用4个FormAttachment,它们分别对应这个小部件的4个面:顶部,底部...

Grace_1203的博客 1200

Eclipse SWT与JFace图形界面编程精进

本文还有配套的精品资源,点击获取 简介:SWT和JFace是Eclipse平台中用于构建图形用户界面的重要组件。SWT提供了与操作系统交互的底层API,实现了高效的性能和原生界面外观,而JFace则建立在SWT之上,简化了GUI开发并引入了MVC设计模式。掌握这些工具将使开发者能够创建具有原生用户体验和复杂界面需求的应用程序,同时提高代码的可维护性和可扩展性。通过学习SWT...

weixin_42581846的博客 1724

SWT常用组件

1按钮组件(Button)   (1)Button组件常用样式     SWT.PUSH按钮     SWT.CHECK多选按钮     SWT.RADIO单选按钮     SWT.ARROW箭头按钮     SWT.NONE默认按钮     SWT.CENTER文字居中与SWT.NONE     SWT.LEFT左对齐     SWT.RIGHT右对齐     SWT.BOR...

weixin_33806509的博客 650

SWT与JFace实战示例集:Java GUI开发精华

在现代桌面应用开发中,用户界面的视觉表现力已成为衡量用户体验质量的重要维度。SWT(Standard Widget Toolkit)作为Eclipse平台的核心UI框架,虽然以原生性能著称,但在默认控件样式方面较为朴素。为了提升产品的专业性和品牌一致性,开发者必须深入掌握颜色、字体以及整体主题风格的定制能力。本章将系统性地解析SWT图形资源系统的底层机制,剖析Color与Font类的生命周期管理策略,并结合实际场景探讨如何实现跨平台一致的视觉样式控制。

weixin_35811662的博客 684

FormAttachment (Control control)的参数必须是属于同一个composite

NULL 博文链接:https://jasonright.iteye.com/blog/749706

FormLayout表格布局

总结: (1) FormLayout用的data类是:FormData。 FormData用另外一 个类来控制窗口小部件的大小和位置: FormAttachment。 一个FormData最多用4个FormAttachment,它们分别对应这个小部件的4个面:顶部,底部,左边和右边 FormLayout通过设置FormData四边的附加值(FormAttachment对象)来设置控件的布...

Grace_1203的博客 3947

UDS $27服务DLL文件生成

UDS 27算法 DLL文件生成

hkj8808的博客 1282

SWT和JFace应用笔记

SWT和JFace应用笔记 链接:https://pan.baidu.com/s/1_ukYlSIYpKbCGhfHm2-vMQ 提取码:xla3 1.SWT笔记 一.创建一个SWT程序有3个部分 1.初始化窗口:首先创建Dispaly对象和Shell对象。 Display:对象封装了调用操作系统的有关方法 Shell:该对象示窗口对象 2.添加控件:在Shell1窗口对象添加按钮,文本框,...

weixin_39819880的博客 3277

别再一个个BAPI调了!用CVI_EI_INBOUND_MAIN一次性搞定SAP BP主数据(附完整ABAP代码)

本文详细介绍了如何使用SAP标准函数CVI_EI_INBOUND_MAIN高效维护业务伙伴(BP)主数据,替代传统的多BAPI调用方式。通过完整ABAP代码示例,展示了如何一站式处理供应商、客户、公司代码等所有视图的创建与更新,提升数据一致性和开发效率。

weixin_29204205的博客 295

UniApp 覆盖安装后首次进入 APP pages.json 不生效的解决方案

通过以上步骤,解决了缓存问题导致的首次加载异常。此方案的关键在于强制更新文件名,从根本上避免旧缓存的干扰。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 684

SWT JFace 常用组件

1按钮组件(Button)   (1)Button组件常用样式     SWT.PUSH按钮     SWT.CHECK多选按钮     SWT.RADIO单选按钮     SWT.ARROW箭头按钮     SWT.NONE默认按钮     SWT.CENTER文字居中与SWT.NONE     SWT.LEFT左对齐     SWT.RIG

JY_Sharer的专栏 3607

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 803

SWT/JFace(一)——概述

一、SWT 1. 概述 SWT(Standard Widget Toolkit,标准图形工具箱)是一种用java开发的GUI程序的技术。与出自Sun的AWT (Abstract Widget Toolkit,抽象图形工具箱)和Swing不同,SWT是Eclipse的开发人员自行建造的。它无论在界面美观度上还是在性能上都远远超越了AWT和Swing,即使和操作系统上的本地图形界面程序相比也毫不逊色,...

cole丶的博客 3007

uniapp [全端兼容] - 实现接入集成高德地图搜索地址及选择位置功能,搜索框检索选择地点并返回经纬度及详细省市区县街道地址,用户搜索历史及清空历史记录,选择地址自动获取周边位置列表/地图移动选点

uni-app,高德地图,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp高德地图,在地图上选择或搜索指定地点,打开地图选择位置,关联地址搜索,输入地址返回附近地址列表,uniApp高德地图地址搜索,搜索框历史记录,关键字搜索,周边查询,搜索位置,uniapp对接高德实现搜索出现地址以及保存搜索记录,集成高德地图,实现精准位置选点功能,获取当前定位城市,如何实现搜索功能,获取省份城市区街道详细地址经纬度,移动选点标记位置,在地图上进行选择位置选点、搜索

🏆 前端领域优质创作者 1万+

第八章 Vite4+Vue3+Vtkjs 完整demo演示

vtk.js是一个基于WebGL的开源3D可视化库,它可以在Web浏览器中呈现高质量的3D图形。vtk.js提供了一个易于使用的API,可以用于创建各种类型的3D可视化,包括科学、医学、工程和地球科学等领域。vtk.js支持多种数据格式,包括VTK、DICOM、STL等,可以轻松地将数据导入到可视化中。此外,vtk.js还支持交互式可视化,用户可以通过鼠标和键盘进行交互,探索和分析数据。采用的vite4+pinia搭建的Vue3项目。

Wait.End的博客 2234

java swt 布局管理器_JAVA.SWT/JFace: SWT布局管理器

7.1 布局管理器概述FillLayout(充满式布局):在单行或单列中放置相同大小的控件,是最简单的布局。RowLayout(行列式布局):在单行或者多行中放置控件,应用了fill、wrap和spacing等选项。GridLayout(网格式布局):向表格一样放置控件。FormLayout(表格式布局):与GridLayout功能差不多的布局,可以通过定义4个边的“附加值”来放置控件。Stack...

weixin_31124163的博客 419

18-XLINX的XC7A100T的BANK0引脚说明

DXP_0和 DXN_0是纯输入引脚,Xilinx Artix-7 FPGA 内部集成的一个片上监控模数转换器​ 的差分模拟输入对,模数转换器​的模拟信号输入端,将外部的模拟电压​ 采样并转换为内部的数字值,是一个单向的信号采集过程。它是与 VCCADC配对的关键引脚,共同为内部的精密模数转换器提供一个纯净、安静、独立的参考地平面。多FPGA同步配置: 在多FPGA系统中,主FPGA配置完成后,可以拉低从FPGA的 INIT_B使其等待,等所有FPGA都准备好后,再同时释放,实现同步启动。

weixin_44479192的博客 233

WindowBuilder、SWT、jface

GUI(Graphical User Interface,简称GUI,图形用户界面)是指采用图形方式显示的计算机操作用户界面,与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。AWT:1.包含了很多类和接口2.元素:窗口、核心类:组件Component可以直接用的基本组件:button、TextArea、Label容器:有窗口Window【分为Frame和Dialog】和面板Panel【Applet】基本组件存放在容器中,用add操作。

m0_56799642的博客 1810

PyTorch实战(26)——PyTorch分布式训练

在本节中,我们将探讨如何通过跨机器和机器内多进程的分布式训练来加速模型训练过程。我们将系统学习 PyTorch 提供的三大分布式训练 API——torch.distributed、torch.multiprocessing 以及 torch.utils.data.distributed.DistributedSampler,使用这些 API 能够极大的简化分布式训练,介绍如何使用 PyTorch 的分布式训练工具,在 CPU 和 GPU 上加速训练。

盼小辉丶的博客 3841

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

[Eclipse插件开发-001] SWT/JFACE布局入门总结

SWT布局管理器 绝对定位: * setBounds(int x, int y, int width, int height); 托管定位: * setLayout(Layout layout); * 常见的布局有FillLayout、RowLayout、GridLayout、FormLayout、StackLayout。 ===================

revivec个人文章 1570

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[转载]SWT 和 JFace,第 1 部分: 简介

SWT 和 JFace,第 1 部分: 简介在这篇 SWT 和 JFace 系列的第一篇文章中,可以了解如何使用 Java™、Eclipse 以及 SWT 和 JFace 库创建简单的 SWT 应用程序。 还可以了解如何使用基本...

congji3817的博客 225

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SWT 和 JFace, 第 4 部分:ToolBar、SashForm 以及其他控件和对话框

  “SWT 和 JFace” 系列的第 4 部分对于前几部分中使用 Java™ 技术、Eclipse 以及 SWT 和 JFace 库创建应用程序的知识进行扩展。这篇文章介绍了 ToolBar、CoolBar、Tray、 SashForm、Link 和其他控件以及其他几种对话框的使用方法。另请参阅本系列前几篇文章。在本系列的前三篇文章中,我介绍了用与构建 Eclipse 和独立、功能丰富

CS_Mercy的专栏 1495
上一篇: SWT/JFace常用组件----布局管理器
下一篇: SWT高级控件之SWT线程
chihailf
博客等级 码龄20年 74粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值