当前位置:文档之家› SWT学习笔记

SWT学习笔记

SWT学习笔记!(1)- 下载与安装收藏

1,SWT/JFace 与AWT/SWING 区别是?

java的标准图形API : AWT/SWING 一直是被后人诟病的, 用它写的页面不够完美, 页面响应速度还慢。后来出现的Eclipse 的SWT/JFace 图形API 彻底改变了这一状况。主要原因是: SWT/JFace 与AWT/SWING 在实现上有很大的不同, AWT/SWING

是模拟本机窗口组件, 而SWT/JFace 则是直接调用本机窗口组件,当本机没有所需组件

时才进行模拟。

2,SWT/JFace 的缺点是?

它没有java的跨平台的特性,每个OS要用eclipse,都需要重新移植一次SWT/JFace ,这也是SWT/JFace 最具争议的地方。不过因为SWT/JFace 已经移植到了几个主流的OS 上了,所以这已经不再是什么严重的问题了。

3,eclipse可以用来开发JAVA、C、C++等

eclipse有极为强大的集成开发环境,它集成了CVS, JUnit, Ant, 并且强大的代码重构功能独步江湖、无人能及。eclipse的安装包集成了java开发环境的插件、JDT、所以、它是默认的java开发工具、但它不仅对java开发、给它装上C/C++的插件、就用可以用开发C、C++了。

4、eclipse常用插件的安装、以及下载地址。

eclipse的插件安装其实很简单、只需要将安装的插件包拷贝到eclipse下面的plugins就ok了。

SWT Designer 是一个很好的eclipse的SWT 界面开发插件包、SWT Designer支持、界面组件拖拉操作

官方网站地址: https://www.doczj.com/doc/fb16552347.html,

MyEclipse:j2ee开发插件、支持jsp、ejb、数据库操作。官方网站地址:http://www.m https://www.doczj.com/doc/fb16552347.html,/

lomboz: 是和MyEclipse 同类型的插件、不过MyEclipse 是收费的、lomboz免费

这样的插件有很多、这里就不详细介绍了。

5, SWT/JFace的简单介绍!

SWT/JFace 有多强大,看看eclipse3.0(and以后版本),就可以清楚的知道了。首先, J Face是为了方便开发SWT程序,在SWT基础上创建的一个更易用,功能强大的图形包。然而, JFace并不能完全覆盖SWT的所有功能,所以,编程时,JFace和SWT都会被用到,

但是一般来说能用JFace组件,就最好不要用SWT的。

6, SWT中的包!

①org.eclipse.swt.widgets

最常用的组件基本都在这个包里,如:button,text,label,combo等,其中两个最重要的组件当数,shell 和composite;shell相当于应用程序的主窗口,composite,相当于SWIN G中的panel对象,时容纳组件的容器。

②https://www.doczj.com/doc/fb16552347.html,yout

主要的界面布局方式在该包中。SWT对组件的布局也采用了AWT/SWING中的Layo ut 和Layout Data 结合的方式

③org.eclipse.swt.custom

对一些基本图形组件的扩展在该包中。例如:其中的CLabel就是对标准Label组件的扩展,在CLabel上可以同时加入文字和图片。在该包中还有一个新的布局方式StackLayout。

④org.eclipse.swt.event

SWT采用和AWT/SWING一样的时间模型,在包中,可以找到事件监听类和相应的事件对象。例如:鼠标事件监听器MouseListener,MouseMoveListener等,以及对应的事件对象MouseEvent。

⑤org.eclipse.swt.graphics

该包中,包含针对图片,光标,字体和绘图API。例如:可通过IMAGE类来调用系统中不同类型的图片。

⑥org.eclipse.swt.ole.win32

对不同平台,SWT有一些针对性的API。例如,在Windows平台,可以通过该包很容易的调用ole组件,这使得SWT程序也可以内嵌IE浏览器或Word,Excel等程序。

eclipse学习笔记!(2) ----- SWT Designer 概述收藏

SWT Designer是优秀的SWT/JFace开发辅助工具, 以下通过写一个Hello Wor ld的小程序来简单了解下SWT!

首先从官方网站下载https://www.doczj.com/doc/fb16552347.html,,之后,把对应的文件拷贝到Eclipse目录下,这时,在Eclipse的windows的首选项里面,就可以看到designer了,点击注册,通过注册机完成注册!

然后新建项目时候,选择designer下面的SWT/JFace java project , 项目名字右键new other ... designer... Swt...Application Window 选项新建一个第3项main 主函数的类, 然后就可以运行这个类了。生成的代码如下:

package src;

import org.eclipse.swt.widgets.Display;

import org.eclipse.swt.widgets.Shell;

public class HelloWorld {

/**

* Launch the application

* @param args

*/

public static void main(String[] args) {

//display负责管理事件循环和控制UI线程和其他线程之间的通信

final Display display = Display.getDefault();

final Shell shell = new Shell(); //SHELL是程序的主窗口

shell.setSize(500, 375); //主窗口大小

shell.setText("SWT Application");//主窗口标题

//

shell.open();

https://www.doczj.com/doc/fb16552347.html,yout();

while (!shell.isDisposed()) { //如果,主窗口没有关闭,则一直循环

if (!display.readAndDispatch())//如果DISPLAY不忙

display.sleep(); //DISPLAY休眠

}

}

}

从这个代码可以看到,创建一个典型的SWT应用程序需要以下的步骤:

?创建一个Display

?创建一个或多个Shell

?设置SHELL的布局

?创建Shell中的组件(以上代码中没有组件,只有一个主窗口,run时候就可以看到一个空的窗口)

?用open()方法打开Shell窗口

?写一个事件转发循环

?销毁Display。

下面,进行窗口中组件的添加, 首先, 把视图切换到designer项,选择SWT Controls分类下的text 组件,放入窗口中,然后对这个组件的属性设置中的text 设置为HelloWorld 。(其他的属性都可以根据自己的情况来设定) 但是SWT Designer 还无法完成所有的界

面设计工作,所以,界面开发中,仍然是以代码设计为主的, 另外SWT Designer 还不是狠稳定, 界面加入太多的组件, 或频繁的添加删除组件,都有可能造成内存耗尽而死机。

eclipse学习笔记!(3---事件) ----- SWT Designer 下SWT/JFace 事件的四种写法以及常用的事件收藏

SWT/JFace 事件的四种写法

SWT 的事件模型和JAVA 标准的AWT 基本一样的。下面将按照,事件的四种写法来实现它。下面的代码都是和上一个学习笔记里的小例子变化来的。

匿名内部类写法

在原来代码行"HelloWorldText = new Text(shell, SWT.BORDER);"下面插入如下的代码:

HelloWorldText.addMouseListener(new MouseAdapter(){

public void mouseDoubleClick(MouseEvent e) {

MessageDialog.openInformation(null,"","Hello world");

}

});

new MouseAdapter(); 就是一个匿名内部类。我们建立了一个继承于MouseAdapter 的类,但并没有给这个类命名,并且没有用通常的写法,而是直接在HelloWorldText.addMo useListener()中,写下了这个类的代码,这就是所谓的匿名内部类。

缺点:

1.由于事件处理,代码会随着组件一起分散到代码中的各个部分,不集中,导致阅读和维

护的不便。

2.各事件的处理全部由嵌套的程序块组成,视觉上很乱,如果事件处理代码很长,也会导

致阅读和维护不便。

3.当菜单栏,工具栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致

代码不够简洁。

?命名内部类写法

事件代码使用命名内部类的方式,可以解决匿名内部类的存在的问题, 首先,事件处理代码都集中在一起,并具有有意义的名字,程序容易阅读和维护;另外单个事件的处理程序也可以被工具栏,菜单栏等重用。代码如下:

public class HelloWorld {

private static Text HelloWorldText;

public static void main(String[] args) {

... ...

HelloWorldText = new Text(shell, SWT.BORDER);

HelloWorldText.addMouseListener(new MyMouseDoubleClick());//引用定义的类

... ...

}

// 定义一个匿名内部类

private static final class MyMouseDoubleClick extends MouseAdapter{

public void mouseDoubleClick(MouseEvent e) {

MessageDialog.openInformation(null,"","Hello ... ai wo , ni shi wo d e !!!");

}

}

}

?外部类写法

这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.ja va 中拿出去,单独写成一个类文件。代码和命名内部类的相同,我就不重复了。

实现监听接口的写法

将HelloWorld 类实现MouseListener 接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更加的简洁,这种方式适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用。

实现MouseListener接口要写的事件方法多一些,没有用到的可以为空实现。如果继承Mo useListener 接口的适配器MouseAdapter, 则只写需要的方法就可以了。另外需要注意的是,只有接口才有多继承的特性,所以,如果HelloWorld已经是某个类的子类了,就只能用实现接口的方式,而不能继承接口的适配器了。代码如下:

public class HelloWorld implements MouseListener{ // or extends MouseAd apter

public static void main(String[] args) {

final Display display = Display.getDefault();

final Shell shell = new Shell();

shell.setSize(500, 375);

shell.setText("SWT Application");

shell.open();

Text HelloWorldText = new Text(shell, SWT.BORDER);

HelloWorldText.addMouseListener(new HelloWorld());

HelloWorldText.setText("HelloWorld");

HelloWorldText.setBounds(52, 68, 349, 29);

https://www.doczj.com/doc/fb16552347.html,yout();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

}

public void mouseDoubleClick(MouseEvent e) {

MessageDialog.openInformation(null,"","Hello ... ai wo de re !!");

}

//if extends MouseAdapter , delete the follow methods

public void mouseDown(MouseEvent e) {

}

public void mouseUp(MouseEvent e) {

}

}

SWT/JFace 中常用的事件

除了,上面用到的addMouseListener, Eclipse 还有一些常用的监听器,它们在各组件里的使用方法相同(如果该组件支持此种事件),简单介绍如下:

?addSelectionListener: 这个监听最常用。

widgetSelected 方法:当组件被选择(单击鼠标或按回车键)时触发此方法的事件处理程序。

widgetDefaultSelected 方法:用于某些很少触发选择事件的组件,例如:文本框回车事件,列表框双击事件等。

?addKeyListener:

keyPressed 方法:当前焦点停留在组件时,按下键盘任意键时触发,但对于某些组件(如:bu tton),按回车键无法执行此方法。

keyReleased方法: 按键弹起时触发。

?addFocusListener

focusGained方法: 得到焦点时触发。

focusLost方法: 失去焦点时触发。

eclipse学习笔记!(4—button类) ----- SWT Designer 下SWT常用组件收藏

一个button类的实例

基本的步骤和之前的是一样的,一个SWT的项目,然后在页面设置面板里添加button。双击button(直接在source里面添加了监听器的代码)。下面是代码:

public class ButtonTest {

public static void main(String[] args) {

final Display display = Display.getDefault();

final Shell shell = new Shell();

shell.setSize(500, 375);

shell.setText("SWT Application");

shell.open();

final Button okButton = new Button(shell, SWT.NONE);

//因为是比较简单的例子,只在这一个地方用这个的原因,所以用匿名方式

okButton.addMouseListener(new MouseAdapter() {

public void mouseUp(MouseEvent e) {

MessageDialog.openInformation(null,"","you click the "+ okButto n.getText() +"button");

}

});

okButton.setText("OK.");

okButton.setBounds(97, 196, 244, 54);

https://www.doczj.com/doc/fb16552347.html,yout();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

}

}

程序说明: Button类的构造方法是new Button(Composite parent,int style),它有2个参数:

1.第一个参数是指Button创建在哪个容器上,Composite是最常用的容器,而she

ll是Composite的子类,所以此参数也能接受shell和任何继承Composite的类。

2.第二个参数用来指定button应用那种(或几种)式样,SWT.NONE是保持Butt

on组件的默认式样。式样其实是一个常量,如SWT.NONE的值是0。等等....

3.让button应用多是式样... 要生成一个文字靠左的,深陷型的复选框,只要用“ |

” 将各个样式连起来即可,如下所示:new Button(shell,SWT.LEFT|SWT.B ORDER|SWT.CHECK)。

?组件的常用方法

SWT/JFace中的每一个组件之间都有很多同名的方法,很幸运这些方法在各个组件里的作用和用法都是相同或相似的,常用方法简述如下:

okButton.setImage(SWTResourceManager.getImage(ButtonTest.class, "275.jpg "));

okButton.setBackground(SWTResourceManager.getColor(158, 224, 167)); okButton.setText("OK.");

okButton.setBounds(81, 183, 244, 54);

等很多的方法,到现在的SWT编辑器下面这些常用的方法都可以在页面设置项里找到,所以很方便。

?一个文本框(text类)的实例

本实例中创建一个文本框,它有如下功能:

1.只能输入数字。

2.至少输入一个值。

3.长度不能多于10个字符。(实例代码如下:)

public class ButtonTest {

private static Text text;

public static void main(String[] args) {

final Display display = Display.getDefault();

final Shell shell = new Shell();

shell.setSize(500, 375);

shell.setText("SWT Application");

shell.open();

final Button okButton = new Button(shell, SWT.NONE);

okButton.setImage(SWTResourceManager.getImage(ButtonTest.cla ss, "275.jpg"));

okButton.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent e) {

String str = text.getText();

if (str == null || str.equals("")) {

MessageDialog.openInformation(shell, "", "please enter a n umber");

} else {

MessageDialog.openInformation(shell, "", "your enter the n umber is true");

}

}

});

okButton.setText("OK.");

okButton.setBounds(81, 183, 244, 54);

text = new Text(shell, SWT.BORDER);

text.setTextLimit(10); //最都只能输入10个字符

text.setBounds(70, 85, 228, 46);

text.addVerifyListener(new VerifyListener(){//检查监听器,每输入一个字符都回触发

public void verifyText(VerifyEvent e) {

//检查输入字符(e.text)是否在0123456789这个字符串中,不在index Of会返回-1

boolean b = "0123456789".indexOf(e.text) >= 0 ;

e.doit = b; //doit属性如果为true,则字符允许输入,反之不允许

}

});

https://www.doczj.com/doc/fb16552347.html,yout();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

}

}

注意到这次MessageDialog的第一个参数用了shell做参数,而不是以前的null。两者的区别在于:用shell时,则弹出提示窗口时,windows任务栏不会新增一个任务项;用null时,则多出一个任务项。

常用方法:

1.setEchoChar(char echo)

说明:将输入到文本框的字符表示成echo字符.

例子:text.setEchoChar('*');相当于SWT.PASSWORD式样。

2.setTabs(int tabs)

说明:按Tab键时前进多少个空格的长度,默认值为8.只有当text的样式为SWT.MU

LTI,SWT.V_SCROLL,SWT.H_SCROLL时,此设置才会有效。

例子:text.setTabs(4) 按键时前进4个空格长度

3.setTopIndex(int index)

说明:转到文本框的第index行,0为第一行,此命令可以在文本框中进行快速行定位。

例子:text.setTopIndex(0); 将当前行定位到首行上。

4.setTextLimit(int limit)

说明:设置最大入力数。

例子:text.setTextLimit(10); 文本框最多只能输入10个字符。

一个下拉框(combo类)的实例

public class ComboTest {

private static Combo combo;

public static void main(String[] args) {

final Display display = Display.getDefault();

final Shell shell = new Shell();

shell.setSize(500, 375);

shell.setText("SWT Application");

shell.open();

combo = new Combo(shell, SWT.READ_ONLY);//定义一个只读的下拉框

combo.setBounds(84, 67, 308, 59);

final Button button = new Button(shell, SWT.NONE);

button.setText("input key");

button.setBounds(54, 220, 135, 52);

button.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent e) {

combo.removeAll(); //先清空combo

for(int i=1;i<10;i++)

combo.add(i+"");//在combo中显示 1 到 9

combo.select(0); //设置当前项是第一项

}

});

final Button button_1 = new Button(shell, SWT.NONE);

button_1.setText("get key");

button_1.setBounds(276, 220, 124, 52);

button_1.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent e) {

MessageDialog.openInformation(shell, null, combo.getText());

}

});

https://www.doczj.com/doc/fb16552347.html,yout();

while (!shell.isDisposed()) {

if (!display.readAndDispatch())

display.sleep();

}

}

}

程序说明:

在这个例子中最关键的是设置值部分的代码,它是用add添加的,还有一种combo类设置值的方法,是将所有的值存到一个字符串数组,然后将这个数组作为参数,批量加入到c ombo中,语句如下:

combo.setItems(new String[]{"1","2","3"});

让combo的各项和对象一一对应

combo中的项只能是字符串,但是在实际应用中有很多这样的需要:将combo中的各项和一些对象一一对应起来。这些对象可以是任何类,这时就可以根据选择各项来得到相应的对象。

要实现这样的功能,使用setData方法就可以了。基于上面的例子,只需要修改设值和取值的事件代码。代码如下:

... ...

final Button button = new Button(shell, SWT.NONE);

button.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent e) {

combo.removeAll();

for(int i=1;i<10;i++){

combo.add(i+"no used");//这时的这行代码的作用就仅仅是在页面上显示的标签

combo.setData(""+(i-1), new Integer(i)); //关键代码,具体说明看下面的【代码说明】

}

combo.select(0);

}

});

... ...

final Button button_1 = new Button(shell, SWT.NONE);

button_1.addSelectionListener(new SelectionAdapter() {

public void widgetSelected(SelectionEvent e) {

String key = "" + combo.getSelectionIndex(); //取得key

Integer selectObject = (Integer)combo.getData(key);//通过ke

y 取得object

//下面是显示结果

MessageDialog.openInformation(shell, null, "select the Integer i s "+ selectObject.toString());

}

});

... ...

程序说明:

setData方法的格式是:setData(key,Object),它将对象(Object)对应一个键值(key),然后附着在combo上,键值可以是任意字符串,上例中之所以用""+(i-1),是因为它的值正好和combo的SelectionIndex值(当前项的序号)相同,这样在取值时就方便了。另外SelectionIndex的起始值是0,所以要i -1 (i 循环起始值是1)。combo中的样式SWT.SIMPLE(无须单击下拉框,列表一直显示)

常用方法除了上面用到的,还有combo.deselectAll();就是让当前的选择项为空,就是不选择任何项。

select( int index); 将index+1项设置为当前选择项。combo.select(0);使首项为选择项。

setText(String string) 此方法和上面的一样也是设置当前选择项的。区别是上面是通过Index来选择的,这个是通过combo里面的String的内容来选择的,例如:combo.s etText("中国"); 就是把中国的那项选择为当前选择的,另外setText没有选择的背景阴影,select则有。

列表框(List类)

list的用法和combo基本一致,combo的两个例子只要将Text定义部分改为list的定义语句,再稍微修改,即可成为list类的例子。

在list中设值的方法和combo是一样的,但取值有所不同,这时因为list可以选择多项,而combo只能选择一项,combo'的getText可以得到当前选择项的字符串,而list由于可以选择多项,所以就不行了。

list取值用getSelection()方法,它返回的是一个所有选项组成的String数组。eclipse学习笔记!(5) ----- SWT Designer 下容器类收藏

在前面的例子中,所有的组件都是放在shell中的,但是Composite才是最常用的容器类。组件是构建在容器类中的,这样就可以通过容器对组件进行集体操作了,例如,

容器在页面上移动,其他组件也会跟着移动;容器隐藏,其他组件页会隐藏,容器销毁,其他组件也会销毁。

面板(Composite类)

格式:Composite(Composite parent ,int sytle )

用法:Composite composite = new Composite(shell,SWT.NONE);

说明:这里第一个参数还是用了shell类,因为shell类属于Composite的子类,所以sh ell也可以当作Composite类型来用。Composite的式样一般都是用SWT.NONE,这时Composite的界面是不显示出来的,只暗地里发挥容器的作用,当然也可以用SWT.BOR DER式样让它形成凹陷效果。

常用方法:

composite.getLayout(); 得到布局管理器

composite.getLayoutData(); 得到本身的布局数据

composite.getParent(); 得到容纳composite的父容器

composite.getShell(); 得到容纳composite的shell

https://www.doczj.com/doc/fb16552347.html,yout(); 将composite的组件重新布局,相当于刷新功能

分组框(Group类)

Group是composite的子类,所以Group和composite基本一样,主要区别是Group 显示有一个方框,且方框上可以显示一串文字说明。

选项卡(TabFolder 类和TabItem 类)

TabItem 并非容器类,所以Group是不能建立在TabItem 中的,Group和TabItem 以及其他组件一样建立在TabFolder容器下。

每一个TabItem 只能用setControl方法来控制一个页面组件。这样我们把页面上的组件放到一个Group中,或composite中,在用TabItem 来控制一个Group的话,就相当于控制了一个页面了。

分割窗(SashForm类)

分割窗是一个很常用的组件,资源管理器左右两个容器就是用分割窗分割开来的,只需要将组件创建在分割窗容器上,它就会自动的按设计好的方式分割排列好,在使用上很简单。

带滚动条的面板(ScrolledComposite类)

有些界面的组件会多到一个窗口无法装下,这时ScrolledComposite类就派上用场了。不过,ScrolledComposite虽然是Composite的子类,但不要将组件直接建立在Scrolled Composite中,而应该将组件都建立在Composite上,然后在将composite建立在Sc rolledComposite中,也就是说用一个composite来做中转。

eclipse学习笔记!(6) ----- SWT Designer 下布局管理器收藏

?

布局管理器简介

VB,Delphi程序不需要布局管理器,而java GUI 程序卻需要,是因為java开发程序的目标是要跨平台的,而每一个OS对屏幕的定义是不一样的。如果像 VB,Delp hi那样使用绝对坐标定位界面组件,那么在windows下看着好好的界面,到了Linux,M acOS下,就变的一塌糊涂。除非你开发的java GUI只在Windows下运行,但即便如此,在不同的屏幕分辨率下,界面的形状也会大不一样!所以用了布局管理器的话,不论在说明OS,说明分辨率下,界面都不会变形。

SWT中主要的几种布局管理器如下所示:

FillLayout 充满式布局管理器,组件的大小会尽量充满整个容器。RowLayout 行列式布局管理器,简单的排列组件。

GridLayout 网格式布局管理器,非常强大,可以胜任所有布局。FormLayout 表格式布局管理器,通过创建组件各个边的距离来布局组件,和GridLayout一样强大。

StackLayout 堆栈式布局管理器,项书页一样只显示最前面的组件。

?充满式(FillLayout 类)

FillLayout 是最简单的布局类,它把组件摆放在一排或一列,并强制组件大小一致。一般的组件的高度和最高组件相同,组件的宽度和最宽组件相同。另外,FillLayout 不能折行,不能设置边界距离和间距。

FillLayout 一般使用与任务栏,工具栏,Group中的一组复选框,或者容器中只有一个组件的时候。例如,如果一个shell内只有一个Group组件,那么将FillLayout用于Shell,则其内的Group将完全充满Shell.

FillLayout 默认情况下,是从左到右以此排列的,如果项上下来的话,只需要,将“n ew FillLayout()”改为“new FillLayout(SWT.VERTICAL)”,则可以上下来显示了。

行列式(RowLayout类)

RowLayout可以使组件折行显示,并可以设置边界距离和间距。另外,它可以对每个组件通过setLayoutData方法设置RowData对象,RowData用来设置组件的大小。

其中相应的代码new RowLayout(); 的时候还可以对RowLayout进行设置(代码设置和页面desigin设置都可以),如:组件和容器上边缘距离,左边缘...组件之间间隔(spacing)等等。

使用rowLayout.wrap控制自动折行(默认为true),可以通过RowLayout的详细属性的设定来改变,也可以通过代码来实现,rowLayout.wrap = false;效果相同,页面上的组件会不折行的显示(后面的就看不到了,晕!)

使用SWT.VERTICAL式样,则变为垂直排列组件。同样可以通过RowLayout的详细属性的设定来改变。

使用RowLayout.pack控制组件大小(默认为true,大小可以控制)RowLayout. pack=false,组件大小相同。

使用RowLayout.justify控制空间伸展(默认为false)rowLayout.justify=true,让组件可以根据空间进行伸展。

使用RowData更改按钮的外观

当RowLayout.pack=false 的时候,进行其他它的设置的时候,只是改变按钮在容器中的布局,而对按钮的外观形状(如:大小)没有影响。

如果要改变按钮本身的外观,则要使用RowData类,RowData称为布局管理类,为RowLayout专用。GridLayout类也有专门的布局管理类GridData,GridData的目

的也和RowData一样,即改变容器中组件的外观形状。

RowData最常用的格式是:new RowData(int width ,int height)。

例如:b1.setLayoutData(new RowData(30,50)); 是把b1組件设定大小!

网格式(GridLayout 类)

GridLayout类可能是最常用,功能最强大的标准布局类了,当然它也最复杂。Gri dLayout的布局方式是把容器里的组件摆放在一个个格子里,它有许多可设置项,并且和RowLayout一样也有专用的布局管理类GridData。GridData的使用颇为复杂,而Grid Layout的强大之处也在于它可以通过GridData来设置每一个组件的外观形状!

使用GridLayout.numColumns设置列数,numColumns 是GridLayout 最重要的属性,通常它是要第一个设置的属性。GridLayout.numColumns=2,就把容器分成2列。

使用makeColumnsEqualWidth把组件等距离分开(默认为false),这时相当于把容器等距离分成几份(横向)。

GridLayout边距和间距的设置和RowLayout类似:

同样可以分别设置horizontalSpacing(列之间的间距) 和verticalSpacing (垂直间距) ,RowLayout 中的间距格局组件是水平or 垂直排列来设置水平间距或垂直间距。

不同的是,左边距右边距统一成marginWidth ,上边距下边距,统一成margin Heigth.

使用GridData 来控制复杂布局,GridLayout 和GridData 相结合可以变化出很多复杂的布局方式。需要注意的是:一个GridData 对象只能用于一个组件,如果多个组件共用,会引起界面的紊乱。

1. horizontalSpan 是设置组件占用的列数。给出一个实例,代码如下:

public class Tabfolder1 {

public static void main(String[] args) {

final Display display = Display.getDefault();

final Shell shell = new Shell();

shell.setLayout(new GridLayout(2,false)); //2列

shell.setMinimumSize(new Point(5, 26));

相关主题
文本预览
相关文档 最新文档