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));