首页 > 代码库 > SWT基本类说明

SWT基本类说明

    实例变量也被翻译成"域"和"成员变量"。在面向数据库的实体类中叶被称为

"属性"或"字段"的变量。Hibernate中也称为POJO,即简单原始的Java变量。使

用变量的一般原则是:尽量使变量的有效范围最小化,即优先考虑用局部变量。其次是

实例变量,最后才是类变量。

    还有一种常量的写法,比类常量前多了一个final,如下:

    final static int ALL_CLICKS =  0;  //something

    ALL_CLICKS全是大写的,这是常量的规范式命名方式。这时的ALL_CLICKS被

final约束,它不能再被赋值了。

 

SWT 的Button分为四类样式。他们分别是

SWT.PUSH:这是最正常的按钮

SWT.CHECK

SWT.RADIO:和上面的有点相似。

SWT.ARROW。

Button中间的字体可以调节向左或着居中什么的。他的表面还提供了深凹陷和平面型等外观设置。

使用符号"|"可以让一个控件(如:Button)应用多个样式。

如:new Button(shell,SWT.LEFT|SWT.BORDER|SWT.CHECK);

其方法参数:new Button(Composite parent,int style)

 

    标签类:Label   Label是SWT中最简单的界面组件,给出一个类实例如下:

Label label = new Label(shell,SWT.NONE);

Label.setBounds(38,21,100,18);

Label.setText("姓名");

    Label类提供了样式列表。包括居中、靠左等,SWT.WRAP:自动换行。还有SWT.BORDER:深陷型。他还有分栏符的功能。 。分栏符有横有竖。SWT.SEPARATOR等。

 

    文本框类:Text   文本框类也是比较简单的界面组件,但他很重要。

他可以限定你最多输入多少个字符:setTextLimit(int n).

 

    MessageDialog 当MessageDialog调用shell 和null做参数的时候,是有区别的。当MessageDialog调用shell作为参数而弹出提示窗口的时候,Windows的任务栏不会新增一个任务项;当MessageDialog调用null的时候,Windows任务栏会多出来一个任务项。

 

    下拉框类:Combo

    下拉框样式:

    下拉框设置:

1)  在combo中显示字符,for(int I =1;I<=10;I++);combo.add(int i)。

2)  在combo中显示字符 Combo.setItems(new String[]{"第一项", "第二项","第三项"});

3)  设置第一项为当前项Combo.select(0)

4)  Combo的各项与 陌生类型对象 实现对应关系:setData(key,Object);他将对象(Objcet)对应一个键值(key),然后附在combo上。键值可以使用任意字符,key对应的是combo的SelectionIndex的值(初始值为0)。看下例:

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

{

     Combo.add("第"+ i + "项");

     Combo.setData(i-1,new Integer(i));

}   关于Combo还有更多细致代码操作,可参考Eclipse从入门到精通 68~69页内容。

 

列表框类:List

    List和Combo有很多相似点,但有一点不同:List可以选择多项,而Combo只能选择一项。故:List没有getText()方法。List取值用的是getSelection()方法,返回的是所有选项组成的数组。

 

布局管理器:Layout

 

FillLayout:是最简单的布局管理器,他把组件摆成一行或一列,并强制组件的大小与其一致。他里面的组件都会尽量充满这个容器。FillLayout不能折行,不能设置边界距离和间距。    FillLayout一般使用于任务栏、工具栏、Group中的一组复选框或者容器内只有一个组件的时候。例如,如果一个Shell内只有一个Group组件,那么将FillLayout用于Shell,则其内的Group将完全充满Shell。他在SWT界面设中很常用。

给2个示例代码段:

Shell.etLayout(new FillLayout());//将FillLayout对象应用于shell上。

new Button(shell,SWT.NONE).setText("sure");//Button建于shell中。

 

 

 

 

 

 

 

当shell中有两个组件的情况会是这样的:

Shell.etLayout(new FillLayout());//将FillLayout对象应用于shell上。

new Button(shell,SWT.NONE).setText("sure");//Button建于shell中

new Button(shell,SWT.NONE).setText("cancel");

 

这两个按钮的排列方式是可以更改的,比如让这两个按钮横着放,你要在new FillLayout()这里动手。改成:new FillLayout(SWT.VERTICAL);

 

 

RowLayout:行列式布局管理器。可以使组件折行显示,并可以设置边界距离和间距。他还可以对每个组件通过setLayoutData方法设置RowData对象,RowData用来设置组件的大小。

RowLayout rowLayout = new RowLayout();

 

rowLayout.marginTop = 30;//组件距离容器上边缘30个像素间隔

rowLayout.marginLeft = 59//左边 50个。

rowLayout.spacing = 3;//组件间的间隔为3个像素

 

shell.setLayout(rowLayout);//shell应用RowLayout布局

//在shell里建立3个按钮

New Button(shell,SWT.NONE).setText("b1");

New Button(shell,SWT.NONE).setText("button2");

New Button(shell,SWT.NONE).setText("button3");

 

窗口宽度不足,按钮自动折行:rowLayout.wrap = true;

 

可以使用rowLayout.pack控制组件大小,默认值为true。

rowLayout.pack = false的作用是让组件大小相同。

 

 

使用rowLayout.justify控制空间伸展,默认值为false。

rowLayout.justify = true的作用是让组件可根据空间进行伸展。如下图:

 

 

使用RowData更改按钮外观,对组件的大小、形状、表现形式会有影响。RowData被称为布局数据类,他是RowLayout专用类,对其他Layout不起作用。GridLayout有自己的专用布局数据类:GridData。他们的作用一样:改变容器中组件的外观形状。

RowData最常用的定义格式:new RowData(int width,int height);

代码示例:

Shell.setLayout(new RowLayout());

Button Bi = new Button(shell,SWT.NONE);

Bi.setText("BUTTON 1");

Bi.setLayoutData(new RowData(30,50));

New Button(shell,SWT.NONE).setText("BUTTON 2");效果图如下:

 

 

GridLayout:网格布局管理器。GridData的使用很复杂。

示例代码:

GridLayout gl = new GridLayout();//生成一个GridLayout对象

shell.setLayout(gl);//将gl布局应用于shell面板

//Creat Five Buttons

new Button(shell,SWT.NONE).setText("b1");

new Button(shell,SWT.NONE).setText("BUTTON 2");

new Button(shell,SWT.NONE).setText("b3");

new Button(shell,SWT.NONE).setText("BUTTON 4");

new Button(shell,SWT.NONE).setText("BUTTON 5");

 

设置列数:gl.numColumns,他的默认值为1. numColumns是GridLayout的重要属性,通常他是第一个设置的属性。如:gl. numColumns = 2,是指把容器分为两列,组件从左道又摆放在那里,这时第三个组件将自动添加新的一行。

Gridlayout  gl  =   new GridLayout();

gl. numColumns = 3 //

shell.setLayout(gl);

另一种写法是:用GridLayout的另一个构造函数:

shell.setLayout(new GridLayout(3,false));不同numColumns值的效果图如下:

 

 

使用makeColumnsEqualWidth把组件等距分开,默认值为false。

效果如下:

 

组件都是向左紧挨着排列的,但如果加一句:gridLayout.makeColumnsEqualWidth = true;

则组件会按等距分开。

 

前面所讲的内容只能控制容器的布局,例如将容器分成几列,没列间隔多少,列是否平分宽度等。但容器中的组件的外观形状并没有改变!比如:让一个按钮加宽到占用两个列,或者加长到占用两行,让按钮跳过一列排到下一行等。但是:如果你用按钮本身的设置长宽的方法来实现这些效果,虽然他可以使按钮变宽、变长,然而他也影响到了其他组件的布局,并没有打到我们真正想要的效果。

     GridData与GridLayout相结合可以变换出很多复杂的布局方式。一个GridData对象只能用于一个组件,GridData是不能多个组件共用的,否则界面会紊乱。

      GridData用法演示:

1.    horizotalSpan。设置组件占用的列数。

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

New Button(shell,SWT.NONE).setText("b1");

New Button(shell,SWT.NONE).setText("Button2");

 

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

GridData  gridData = http://www.mamicode.com/new GridData();//define a GridData Object.

gridData.horizotalSpan = 2//让Button抢占两个列的空间。

 

Button.setLayoutData(gridData);

Button.setText("b3");

New Button(shell,SWT.NONE).setText("Button4");

New Button(shell,SWT.NONE).setText("Button5");

 

2.    GridData.HORIZONTAL_ALLGN_FILL对其式充满。

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

New Button(shell,SWT.NONE).setText("b1");

New Button(shell,SWT.NONE).setText("Button2");

 

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

GridData  gridData = http://www.mamicode.com/new GridData(HORIZONTAL_ALLGN_FILL);

//define a GridData Object.

gridData.horizotalSpan = 2//让Button抢占两个列的空间。

 

Button.setLayoutData(gridData);

Button.setText("b3");

New Button(shell,SWT.NONE).setText("Button4");

New Button(shell,SWT.NONE).setText("Button5");

 

3.    水平抢占式充满:GridData.FILL_HORIZONTAL

 

 

单独选定button 5水平抢占:

将这句代码New Button(shell,SWT.NONE).setText("Button5");

改为:

Button button5  =  new  Button(shell,SWT.NONE);

GridData  gridData2  =  new  GridData(GridData.HORIZONTAL_ALIGN_FULL);

button5.setLayoutData(gridData2);

button5.set("button5");

 

 

 

4.    GridData.FILL_BOTH双向抢占式

他相当于:FILL_HORIZONTAL(水平抢占式)和FILL_VERTICAL(垂直抢占式)的合并效果。

 

 

5.    gridData.horizontalAlignment and gridData.verticalAlignment.

这两个属性用来设置组件在格子里的对其方式,使用方法如下:

gridData.horizontalAlignment = GridData.CENTER;以下是4种不同效果

 

 

 

 

 

 

6.    gridData.horizontalIndent属性可以使组件向右移动指定长度。

此属性只有当horizontalAlignment设为BEGINNING(默认值)时有效。以下代码将b5向右移动10个像素:

GridData gridData  =  new  GridData();

gridData.horizontalIndent  =  10 ;l

b5.setLayoutData(gridData);

 

 

7.    动态缩扩:gridData.grabExcessHorizontalSpace||gridData.grabExcessBerticalSpace (默认值:false)。

这两个属性主要用在Text和list中。效果是:当组件所在容器大小改变时,组件的占有空间也自动增大或减小。例如:设置一个Text组件为:grabExcessHorizontalSpace  =  true,那么当用户调整窗口,导致容器的宽度变化时,Text所在列空间也会随着变化,但同一行上的其他组件会保持宽度不变。

 

强调:改变的是他们占有的空间,但他们本身的大小不会改变。要让他们本身的大小也随着改变,还要加一句:gridData.horizontalAligment = GridData.FULL

代码如下:

//3列,且makeColumnsEqualWidth = false

shell.setLayout(new GridLayout(3,false));

new Button(shell,SWT.NONE).setText("button1");

new Button(shell,SWT.NONE).setText("button2");

new Button(shell,SWT.NONE).setText("button3");

new Button(shell,SWT.NONE).setText("button4");

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

GridData  gridData  =   new GridData();//define a  gridData object.

gridData.gradExcessHorizontalSpace  =  true ;//空间横向随容器变化

button.setLayout(gridData);

button.setText("b5");

8.    改变组件的宽度和高度:gridData.widthHint和heightHint

下列代码改变b5为:200长  和  15高

 

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

2 GridData  gridData   =  new  GridData();

3 gridData.widthHint  = 100;

4 gridData.heightHint  =  15;

5 button.setLayoutData(gridData);

6 button.setText("b5");

由上图可看,b5大小不随窗口变化。但是,在下面这句代码被改写了时,会出现矛盾。当与GridLayout其他设置相矛盾其表现如下:

2 GridData  gridData  = new GridData(GridData.FILL_HORIZONTAL);

 

 

 

    堆栈式Layout:StackLayout

    他像一副叠在一起的扑克牌,一叠UI面板只显示位于最上面的那个面板。

 

    右边部分就是一个用了堆栈式布局管理的容器,当左边选择不同的项时,右边部分就显示这一项相应的设置组件。Eclipse从入门到精通92~93页

 

    表格式布局管理器FormLayout

    FormLayout和GridLayout一样强大,而且还很灵活,精确。这个布局是SWT2.0新增的。他们可以做成同样的效果,但有时使用后者更有效,它不会像GridLayout因为容器大小变化而导致布局错位。

1.   设置边距:marginWidth 和 marginHeight

他们用来设置左边距和右边距。

FormLayout  formLayout  =   new  FormLayout();

formLayout.marginWidth  =  100;

formLayout.marginHeight  =  50;

shell.setLayout(formLayout);

new Button(shell,SWT.NONE).setText("button 1");

 

2.   FormData构造函数

FormLayout的布局数据类,使用方法:

new  FormData() 或 new FormData(int width, int height);

示例代码:

shell.setLayout(new FormLayout());

//new FormData();

Button  button1  =  new  Button(shell,SWT.NONE);

Button1.setText("button1");

FormData  formData  =  new  FormData();

button1.setLayoutData(formData);

 

Button  button2  =  new  Button(shell,SWT.NONE);

button2.setText("button2");

FormData  formData2  =  new  FormData(200,50);//button2长200,宽50;

button2.setLayoutData(formData2);

 

 

3.   FormAttachment类用法

FormAttachment是FormData下的更进一步的布局数据类,他的用法主要体现在它不同的构造函数中。

new FormAttachment(int numerator , int offset)

numerator:分子,占得百分比

offset:偏移量,在原来位置下移多少个像素。

button1的顶边(formData.top)离shell容器的空白边距是shell容器总体空白长度的60%,偏移点数(points)为0

 

 

 

shell.setLayout(new FormLayout());

new  Text(shell,SWT.BORDER).setText("text 1");

//将button1应用于FormData

Button  button1  =  new  Button(shell,SWT.NONE);

button1.setText("button1");

FormData  formData  =  new FormData();

//button1顶端应用FormAttachment设置

formData.top =  new  FormAttachment(60,0);

button1.setLayoutData(formData);

**********************************************************

如果formData.top =  new  FormAttachment(60,0);变成

formData.top =  new  FormAttachment(60,10);则按钮向下移动10单位

 

**********************************************************

**********************************************************

new FormAttachment(Control control,int offset, int alignment)

参数1是一个Control类,一般在上用的时候都传入一个组件,如文本框等,来作参数。应用此FormAttachment的 组件将依据参数1的control为标准布局,offset是control的偏移量(单位:像素),alignment为对其方式。

shell.setLayout(new FormLayout());

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

text1.setLayoutData(new  FormData(100,50));

FormData  formData   =  new  FormData();

//以text1为基准偏移50

FormAttachment  formA  = new  FormAttachment(text1,50);

formData.top = formA;

formData.left = formA;

Button  button1  =  new  Button(shell,SWT.NONE);

button1.setText("button 1");

button1.setLayoutData(formData);//效果图如下:

 

FormAttachment(text1,50, int alignment)。alignment为对其方式。

FormAttachment(text1,50)相当于默认alignment = SWT.DEFAULT

 

 

 

 

 

其他SWT组件

工具栏类:ToolBar类、ToolItem类、ViewForm类

ViewForm是一个容器,他是编辑器的基座,用来容纳工具栏和文本框。

ToolBar是一个工具栏,同时也是一个容器,他容纳工具栏的一个个按钮:ToolItem

 

ToolItem样式如下:

SWT.PUSH:普通按钮。

SWT.CHECK:单击按钮则下陷,再单击则会弹起来。

SWT.RADIO:一组RADIO类型按钮,如果一个按下,其他都会弹起来。

SWT.SEPARATOR:按钮间的分割线

SWT.DROP_DOWN:旁边带个下拉条的按钮。

 

动态工具栏类:CoolBar类、CoolItem类

CoolBar组件是一个可以放置多个工具栏的容器类,基于CoolBar做出的工具栏可以通过拖动操作来改变排放位置,这种工具栏也被称为CoolBar类型工具栏。

 

CoolBar是一个容器类,它需要结合其子项CoolItem来使用。要得到Coolbar型工具栏,必须是CoolBar、CoolItem、ToolBar和ToolItem四者一起使用。他们的关系图普如下所示:

ToolBar是建立在CoolBar容器里的,且CoolItem并非用来显示按钮,而是用来帮助CoolBar控制ToolBar的。比较可以发现CoolBar、CoolItem和ToolBar三者的关系正好与TabFolder、TabItem和Group三者的关系是一样的。

 

 

 

菜单类:Menu类、MenuItem类。

 

示例代码如下:

Menu  mainMenu  =  new  Menu(shell,SWT.BAR);

shell.setMenuBar(mainMenu);

{

    //"文件"项

    MenuItem  fileItem = new MenuItem(mainMenu,SWT.CASCADE);

    fileItem.setText("文件(&F)");

 

    //文件菜单

    Menu fileMenu = new Menu(shell,SWT.DROP_DOWN);

    fileItem.setMenu(fileMenu);

    {

        //新建 项

        MenuItem newFileItem  = new MenuItem(fileMenu,SWT.CASCADE);

        newFileItem.setText("新建&(F)");

//新建 菜单

        Menu newFileMenu  =  new  Menu(shell,SWT.DROP_DOWN);

        newFileItem.setMenu(newFileMenu);

        {

            //新建项目  项

            MenuItem  newProItem = new MenuItem(newFileMenu,SWT.PUSH);

            //"\t"相当于间隔Tab键空间

            newProItem.setText("项目\tCtrl+Shift+N");

            //定义快捷键Ctrl+Shift+N

            newProItem.setAccelerator(SWT.CTRL+SWT.SHIFT+N);

            //设置菜单项的图标

            newProItem.setImage(new Image(null,"icons/project.gif"));

            //菜单项的单击事件

            newProItem.addSelectionListener(new SelectionAdapter(){

                public void widgetSelected(SelectionEvent e{

                    MessageDialog.openInformation(null,"","新建项目");}

            });

            //建立其他菜单项

            new MenuItem(newFileMenu,SWT.SEPARATOR);

            new MenuItem(newFileMenu,SWT.PUSH).setText("包");

            new MenuItem(newFileMenu,SWT.PUSH).setText("类");

            new MenuItem(newFileMenu,SWT.PUSH).setText("接口");

            new MenuItem(newFileMenu,SWT.SEPARATOR);//分隔符

            new MenuItem(newFileMenu,SWT.PUSH).setText("其他(&O)");

        }

    }

    new MenuItem(fileMenu,SWT.CASCADE).setText("退出");

}

//"文件"项

    MenuItem  menuItem = new MenuItem(mainMenu,SWT.CASCADE);

    menuItem.setText("帮助(&H)");

 

Menu样式罗列如下:

SWT.BAR:用于主菜单

SWT.DROP_DOWN:用于子菜单

SWT.POP_UP:用于右键菜单

 

MenuItem样式罗列如下:

SWT.CHECK:选择后前面会出现一个小勾。

SWT.CASCADE:有子菜单的。

SWT.PUSH:普通型。

SWT.RADIO:选择后前面会显示一个圆点。

SWT.SEPARATOR:分隔符。

 

右键弹出式菜单,效果如下:

 

上述程序开头更改如下:

//Menu  mainMenu  =  new  Menu(shell,SWT.BAR);

//shell.setMenuBar(mainMenu);

Menu  mainMenu  =  new  Menu(shell,SWT.POP_UP);

shell.setMenuBar(mainMenu);

 

滑动条(Slider)、刻度条(Scale)和进度条(ProgressBar)

1.  滑动条:Slider

滑动条窗口里有连个组件:右边是一个滑动条,左边是一个用来显示滑动条当前值的文本框,其样式如下图所示:

 

代码示例:

shell.setLayout(new RowLayout());

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

//创建一个滑动条,默认水平,用SWT.VERTICAL可变垂直

final Slider  slider  =  new Slider(shell,SWT.NONE);

silder.setMinimum(0);

silder.setMaximun(100);

slider.setPageincrement(10)//翻页间隔值

slider.setSelection(25);//初始值

//监听滑动条值的改变,并将值显示在文本框中。

slider.addSelectionListener(new SelectionAdapter(){

     public void widgetSelected(SelectionEvent e){

         text.setText("" +  slider.getSelection());

     }

});

 

2.  刻度条:Scale

 

final Scale scale = new Scale(shell,SWT.NONE);

 

3.  进度条:ProgressBar

 

主要也是三种方法:setMinimum setMaximum setSelection

setSelection方法控制进度条的当前位置,代码如下:

 

shell.setLayout(new RowLayout());

//平滑型样式:SWT.SMOOTH,默认方格型。

final ProgressBar progBar =  new  ProgressBar(shell,SWT.SMOOTH);

progBar.setMinimum(0);

progBar.setMaximum(100);

//创建一个GO按钮

Button  bg  =  new Button(shell,SWT.BORDER);

bg.setText("GO");

bg.addSelectionListener(new SelectionAdapter(){

     public void widgetSelected(SelectionEvent e){

         //每次循环前进一格

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

             try{

                 Thread.sleep(1000);

             }catch(Throwable e2){}//间隔一秒

             progBar.setSelection(i*10);

         }

     }

});

在JFace包中有一种Dialog组件叫做:ProgressMonitorDialog,他也有表示任务执行进度的功能。

 

 

画布:Canvas类

    Canvas类主要用于显示图像,即可以在Canvas上画图,也可以直接将图片显示其中。设置图像、更换图像、清除图像。P113有示例代码。

 

 

 

表格类:Table

前面介绍了选项卡的TabFolder、TabItem,菜单的Menu、MenuItem,工具栏的ToolBar,ToolItem,同样,Table也有自己的Item:TableItem。TableItem代表表格中的一条记录。不过在实际项目中,特别是数据库项目一般都不用Table,而用JFace中基于Table扩展的TableViewer来作为表格组件。

 

 

 

 

 

示例代码:

shell.setLayout(new FillLayout);

/*

 * 创建一个Table对象,在央视里设置它为:可多选,全列选择

 * 并设置它的表头和表格线

*/

final Table table = new Table(shell,SWT.MULTI|SWT.FULL_SELEOTION);

table.setHeaderVisible(true);

table.setLinesVisible(true);

//为Table增加两列,并设置列宽都是80

TableColumn  col1  =  new  TableColumn(table,SWT.NONE);

col1.setText("ID");

col1.setWidth(80);

TableColumn  col2  =  new  TableColumn(table,SWT.NONE);

col2.setText("姓名");

col2.setWidth(80);

//创建一个Composite容器,放入两个按钮

Composite  comp  =  new  Composite(shell,SWT.NONE);

comp.setLayout(new  RowLayout());

Button  addButton  =  new Button(comp,SWT.NONE);

addButton.setText("新增");

addButton.addSelectionListener(new SelectionAdapter(){

    int i = 1;

    public void widgetSelected(SelectionEvent e){

        TableItem  tableItem  =  new  TableItem(table,0);//

        tableItem.setText(new String[]{"" + "Sister Qin"}

 

        i++;

    }

});

Button  removeButton  =  new Button(comp,SWT.NONE);

removeButton.setText("删除");

removeButton.addSelectionListener(new  SelectionAdapter(){

    public void  widgetSelected(SelectionEvent e){

        //得到装有所有被选择记录的序号的数组

        int[] setlnice  =  table.getSelectionIndices()

        //Table根据数组中的序号将Item删除

        table.remove(sellnices);

    }

});

//监听Table的鼠标双击事件

table.addMouseLintener(new MouseListener(){

    public void mouseDoubleClick(MouseEvent e){

        int selIndex =table.getSelectionIndex();

        TableItem  item  =  table.getItem(SelIndex);

        String str  = "列1=" + item.getText(0) + "\n 列2=" + item.getText(1);

        MessageDialog.openInformation(null,null,str);

    }

    public void mouseDown(MouseEvent e){}

    public void mouseUp(MouseEvent e){}

});

 

 

树:Tree

    和Table一样,Tree也有自己的Item:TreeItem,由它表示树中的每一个节点。JFace也有一个基于Tree扩展的TreeViewer,实际用到数据库的项目一般都用它。

117

 

表格型树:TableTree

 

图   像

    SWT中图像时Image类,它属于:org.eclipse.swt.graphics包。他有多种构造函数,最常用的是:new Image(Device device , String filename)。其中Device称为:设备

它包含Display(显示)和Printer(打印)两种设备。如果要在屏幕上显示,Display适用。

 

    以下代码是使用 "绝对路径"来得到一个图像,并设置图像背景为红色,然后显示在一个按钮上。

    button.setText("button");

    Image image  =  new Image(display," C:\\refresh.gif ");

    image.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_RED);

    button.setImage(image);

 

    new Image(null , "c:\\refresh.gif");他的第一个参数为null,这时会默认使用当前的Display来做显示设备。

    如果在指示的路径没发现图片,会弹出错误提示。因为你不知道用户会将软件安装在什么目录下,故采用绝对路径的做法往往会出现问题,最好采用相对路径:

button.setImage(new Image(display , "icons/refresh.gif"));相对路径的起点是项目主目录,如:C:\\eclipse\workspac\myswt\icons\refresh.gif。

    如果开发插件,由于插件是基于Eclipse运行环境的,所以还可以利用Eclipse自带的图像。方法如下:

ISharedImage  sharedImage =  PlathformUI.getWorkbench().getSharedImages();

Image  image  =  sharedImage.getImage(ISharedImages.IMG_OBJS_WARN_TSK);

 

图像类存在的问题:它是比较重量级的对象,内存占用很大,一般来说不再使用的Image对象应该用Image的dispose()方法立即释放掉。像Image这样的情况还有Font(字体)、Color(颜色)等。

 

图像描述符:ImageDescriptor

由于Image存在的一些问题,JFace提供了一个轻量级的ImageDescriptor类,它属于:org.eclipse.jface.resource包。ImageDescriptor不存储图像本身,只有程序需要时候才创建。ImageDescriptor是一个抽象类,他不能用new来创建,它有两个静态方法:createFormFile、createFormURL来生成图像描述符的方法。

 

 

1.  createFormFile方法

ImageDescriptor imageDesc = ImageDescriptor.createFormFile(

abc.class,"icons\*.gif);

 

代码含义:当要创建图像时,会通过Abc.class类所在目录下的icons子目录来加载*.gif。此时,imageDesc指示包含了指向*.gif的信息,还没有真正加载*.gif。abc.class 可以是项目中的其他类,甚至是写这个语句的类也可以。

2.  createFormURL 方法

创建一个图像描述符,图像定位在C:\\icons\refresh.gif路径

URL  url  =  new URL(file:\\C:\\icons\\refresh.gif);

ImageDescriptor  imageDesc = ImageDescriptor.createFormURL(url);

 

 

创建一个图像描述符

        URL  url  =  new  URL("file:icons/refresh.gif");

ImageDescriptor  imageDesc = ImageDescriptor.createFormURL(url);

注意!这里会抛出异常,注意捕捉

 

Eclipse自带图像

        用于开发基于Eclipse运行环境的插件

ImageDescriptor  imageDesc =

WorkbenchImages.getImageDescriptor(WorkbenchGraphicConstants.IMG_ETOOL_HOME_NAV);

 

ImagaeDescriptor比Image好处是:如果所指路径错误,则会自动用一个红方块图像来代替,而不会像Image那样弹出一个错误提示框。另外,由ImageDescriptor也可以得到Image,语句如下:

Image image  =   imageDesc.createImage();

 

图像注册表:ImageRegistry类

JFace提供了一个能告诉缓存图像和图像描述的图像注册表。他的设计思路是:先创建指向图像的图像描述符,然后将图像描述符加上一个键值添加到图像注册表中去,这个键值是和图像描述符一一对应的。当希望获得图像时,就可以用键值从注册表中取得。

SWT基本类说明