SWT 基础

SWT 基础(Standard Widget Toolkit)

 

SWT简介:

SWT(Standard Widget Toolkit)是开源的窗口组件工具包,Java可以通过使用SWT来设计可以提供高效,可移植访问的操作系统UI设施。

Sun提供了AWT以及后来的Swing,但是这两者都有着其缺点:

AWT(Abstract Windowing Toolkit):AWT使用本地组件但是存在LCD问题,LCD问题丢失了一些平台特性,也就是说,如果平台A有组件1-40,而平台B有组件20-25,那么跨平台的AWT框架只能提供两者的交集。

Swing:Swing是为了解决LCD问题而产生的,通过使用模拟的组件来代替本地组件,解决了LCD问题,同时提供了更加丰富的轻量级组件。但是它有一个问题就是Swing应用程序看起来并不像本地应用程序,虽然后来的JVM提供了改善,但是swing应用程序仍然受到性能的困扰,同时swing消耗太多的内存,这使得其无法移植到类似于PDA或者移动电话平台。

正因为以上两个原因,IBM决定开发一个新的GUI lib,以满足他们的需求,SWT的出现解决了AWT和Swing框架的缺点。 SWT通过JNI(Java Native Interface)来访问本地组件,如果操作系统平台上没有可用的组件,那么SWT模拟不可用的组件。

 

SWT编程组件:

SWT应用程序的基本构成模块是Display、Shell和Widgets。Display负责管理事件循环以及控制UI线程和其他线程之间的通信;Shell是应用程序中由操作系统窗口管理程序管理的窗口;每个SWT应用程序都至少包含一个Display和Shell实例。
https://p-blog.csdn.net/images/p_blog_csdn_net/sunjavaduke/EntryImages/20090407/003.png

 

上图从不同的角度描述了SWT应用程序。第一部分是简化的继承层次图,第二部分是UI对象的包含关系图,第三部分是生成的UI。

如果应用程序包含多个线程,每个线程使用自己的Display对象的实例。可以通过Display.getCurrent()方法来获取当前的Display对象的活跃实例。

Shell代表了特定操作系统中的窗口,Shell可以被最大化,正常化以及最小化。一共有两种类型的Shell,一种是顶层Shell,作为Display的主窗口,第二种是基于其他Shell(对话框或者顶层Shell)的对话框Shell。

Shell的类型取决于传递给Shell构造器的参数的类型。默认的值是DialogShell,也就是说,如果使用默认的构造器,那么创建的Shell是对话框Shell。如果传递一个Display对象给构造器,那么创建的是顶层Shell。

一些组件的属性必须在创建的时候就被设置。这些组件的属性成为style bits。style bits在SW类中被定义为常量,例如,Button button = new Button(shell, <styleBits>)。可以通过OR操作符( | )使用多个style bit。例如,而乐使用一个推样式的带边框的按钮,可以使用SWT.PUSH | SWT.BORDER作为style bit参数。

 

设置环境:

设置方法一:

开发SWT应用和开发Swing应用不同,开发SWT应用时需要添加SWT应用程序库(swing使用的api是jdk自带的)。

首先需要的lib是swt.jar文件,位于:

$eclipse.home/plugins/org.eclipse.swt.win32.win32.x86_3.4.1.v3452b.jar文件。

注:该路径为eclipse3.4中swt库文件所处位置,对于eclipse之前的版本,可能位于:

$eclipse.home/plugins/org.eclipse.swt.win32_2.1.0/ws/win32目录下的swt.jar。

SWT对应的jar需要添加到SWT应用程序的classpath中。可以通过选择对应的project,然后通过:

Project->Properies->JavaBuildPath->Libraries->Add Variable -> Eclipse Home ->Extend

选择对应的jar文件。

之后就可以正常的编译SWT应用程序了,但是在运行时,还会产生如下的运行时异常:

java.lang.UnsatisfiedLinkError: no swt-win32-2133 in java.library.path

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1403)

at java.lang.Runtime.loadLibrary0(Runtime.java:788)

at java.lang.System.loadLibrary(System.java:832)

...

at org.eclipse.swt.widgets.Display.<init>(Display.java:287)

at Main.main(Main.java:25)

Exception in thread "main"

由于swt.jar会使用本地库,所以需要设置java.lib.path环境变量,使其可以在Java中使用本地库。

Run-> Run...-> Java Applicaton-> New ->Arguments -> VM Arguments

然后将下面的路径添加到VM Arguments部分:

-Djava.library.path=c:/eclipse/plugins/org.eclipse.swt.win32_2.1.0/os/win32/x86

(根据eclipse版本以及安装位置的不同,需要修改上述参数的设置)

可以通过Runtime.getPlatform.loadLibrary(“libraryName”)来加载本地库。

设置完上述环境之后,就可以在eclipse环境下开发SWT应用了。

 

设置方法二:

虽然SWT作为Eclipse plugin API的一部分被集成,但是如果要开发独立的应用程序,那么最好还是下载SWT独立软件包。本部分将介绍使用独立的SWT设置开发环境。

首先在SWT主页中的Releases部分下载SWT的zip文件。(http://www.eclipse.org/swt/)

将下载的zip文件导入到eclipse的workspace中,可以通过:

File->Import->General->Existing Projects into Workspace->Select archive file选择下载的zip文件后,可以看到Projects区域包含了project:org.eclipse.swt(/)。

(默认的将zip文件中的内容拷贝到workspace中)

最后,在开发的project中通过设置project依赖,可以在其他的project中使用SWT。

(选择要使用SWT的project,Project->Propertes->Java Build Path->Projects->org.eclipse.swt)

此时就可以在该项目(依赖SWT的项目)中使用SWT中的API了。

 

SWT组成包功能简介:

org.eclipse.swt :  SWT常量和错误处理,即SWTException和SWTError。

org.eclipse.swt.accessibility :  SWT可访问性。

org.eclipse.swt.awt :  SWT AWT嵌入式支持。

org.eclipse.swt.browser :  SWT浏览器组件。

org.eclipse.swt.custom :  SWT自定义组件。

org.eclipse.swt.dnd :  SWT拖拽支持组件。

org.eclipse.swt.events :  SWT事件监听器。

org.eclipse.swt.graphics :  SWT图形类。

org.eclipse.swt.layout :  SWT布局管理类。

org.eclipse.swt.ole.win32 :  SWT Win32 OLE实现类。

org.eclipse.swt.opengl :  SWT OpenGL支持。

org.eclipse.swt.printing :  SWT打印支持。

org.eclipse.swt.program :  SWT程序支持。

org.eclipse.swt.widgets :  SWT标准组件API。

widgets包下面的类层次结构:

-class org.eclipse.swt.graphics.Device (implements org.eclipse.swt.graphics.Drawable)

    + class org.eclipse.swt.widgets.Display

-class org.eclipse.swt.widgets.Dialog

    + class org.eclipse.swt.widgets.ColorDialog

    + class org.eclipse.swt.widgets.DirectoryDialog

    + class org.eclipse.swt.widgets.FileDialog

    + class org.eclipse.swt.widgets.FontDialog

    + class org.eclipse.swt.widgets.MessageBox

-class org.eclipse.swt.widgets.Event

-class org.eclipse.swt.widgets.Layout

-class org.eclipse.swt.widgets.Monitor

-class org.eclipse.swt.widgets.Synchronizer

-class org.eclipse.swt.widgets.TypedListener (implements org.eclipse.swt.widgets.Listener)

-class org.eclipse.swt.widgets.Widget

    + class org.eclipse.swt.widgets.Caret

    + class org.eclipse.swt.widgets.Control (implements org.eclipse.swt.graphics.Drawable)

          # class org.eclipse.swt.widgets.Button

          # class org.eclipse.swt.widgets.Label

          # class org.eclipse.swt.widgets.Link

          # class org.eclipse.swt.widgets.ProgressBar

          # class org.eclipse.swt.widgets.Sash

          # class org.eclipse.swt.widgets.Scale

          # class org.eclipse.swt.widgets.Scrollable

                * class org.eclipse.swt.widgets.Composite

                      -class org.eclipse.swt.widgets.Canvas

                            + class org.eclipse.swt.widgets.Decorations

                                  # class org.eclipse.swt.widgets.Shell

                      -class org.eclipse.swt.widgets.Combo

                      -class org.eclipse.swt.widgets.CoolBar

                      -class org.eclipse.swt.widgets.DateTime

                      -class org.eclipse.swt.widgets.ExpandBar

                      -class org.eclipse.swt.widgets.Group

                      -class org.eclipse.swt.widgets.Spinner

                      -class org.eclipse.swt.widgets.TabFolder

                      -class org.eclipse.swt.widgets.Table

                      -class org.eclipse.swt.widgets.ToolBar

                      -class org.eclipse.swt.widgets.Tree

                * class org.eclipse.swt.widgets.List

                * class org.eclipse.swt.widgets.Text

          # class org.eclipse.swt.widgets.Slider

    + class org.eclipse.swt.widgets.IME

    + class org.eclipse.swt.widgets.Item

          # class org.eclipse.swt.widgets.CoolItem

          # class org.eclipse.swt.widgets.ExpandItem

          # class org.eclipse.swt.widgets.MenuItem

          # class org.eclipse.swt.widgets.TabItem

          # class org.eclipse.swt.widgets.TableColumn

          # class org.eclipse.swt.widgets.TableItem

          # class org.eclipse.swt.widgets.ToolItem

          # class org.eclipse.swt.widgets.TrayItem

          # class org.eclipse.swt.widgets.TreeColumn

          # class org.eclipse.swt.widgets.TreeItem

    + class org.eclipse.swt.widgets.Menu

    + class org.eclipse.swt.widgets.ScrollBar

    + class org.eclipse.swt.widgets.ToolTip

    + class org.eclipse.swt.widgets.Tracker

    + class org.eclipse.swt.widgets.Tray

 

基本窗口组件:

基本的SWT应用程序的框架如下:

import org.eclipse.swt.*;

import org.eclipse.swt.widgets.*;

import org.eclipse.swt.xxx.*;

 

public class Snippet1 {

 

public static void main (String [] args) {

    Display display = new Display ();

    Shell shell = new Shell(display);

    shell.setLayout(new RowLayout());

    // ------------------------

    // Your code comes to here.

    // ------------------------

    shell.pack();

    shell.open ();

    while (!shell.isDisposed ()) {

        if (!display.readAndDispatch ()) display.sleep ();

    }

    display.dispose ();

}

}

 

创建SWT组件的应用程序,首先要导入以下两个packages:

org.eclipse.swt.*;

org.eclipse.swt.widgets.*;

然后创建Display和Shell对象

Display display = new Display();

Shell shell = new Shell(display);

Display对象包含所有的GUI组件,Display并不是可见的,但是添加到display的对象是可以见的。一般来说,对于一个应用程序只创建一个Display对象。 Shell是应用程序中的一个窗口,一个应用程序可以包含多个shell,shell可以是顶层shell(附在Display上)或者是对话框shell(附在其他shell上)。

SWT组件的属性可以被初始化或者修改,方式和java swing一样。例如:

shell.setSize(100,100);

最后,需要打开shell,然后运行事件循环。事件循环对于shell在屏幕上可见是必须的。可以将其放在对所有组件的初始化之后。当shell被关闭时,display也必须被disposed。

shell.open();

while(!shell.isDisposed()){

    if(!display.readAndDispatch()){

        display.sleep();

    }

display.dispose();

现在,已经准备好将任何组件添加到shell中了。目前还没有使用布局管理器,因为使用布局管理器来生成组件有些复杂。下面的是一些关于将组件添加到shell的例子,并没有使用布局管理器。

Label:标签是字符的一个集合,不可以被用户修改。可以通过以下的代码将标签添加到shell中:

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

标签可以有不同的style,例如BORDER,CENTER,LEFT,RIGHT,WRAP和SEPARATOR。SEPARATOR样式是一种特殊的label,它在标签和其他的组件之间画一条线。可以添加到separator的样式有HORIZONTAL,VERTICAL,SHADOW_IN,SHADOW_OUT和SHADOW_NONE。下面的代码创建了五个标签,其中有两个标签使用了separators。

另外,还可以为Label设置图片。

Text:text组件包含了可以被用户修改的文本内容。

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

支持Text的样式包含BORDER,H_SCROLL,V_SCROLL,MULTI,SINGLE,READ_ONLY和WRAP。Text如果是可以编辑的,那么可以设置最大的字符数text.setTextLimit(30);还可以创建一个密码框,通过使用setEchoChar()方法。

Button:Button组件用于提供特定的处理,用户可以通过点击Button来完成想要的动作。

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

Button支持的style包括PUSH,CHECK,RADIO,TOGGLE和ARROW。还可以使用FLAT,BORDER,LEFT,RIGHT和CENTER。

Note: Only one of the styles ARROW, CHECK, PUSH, RADIO, and TOGGLE may be specified.

Note: Only one of the styles LEFT, RIGHT, and CENTER may be specified.

Note: Only one of the styles UP, DOWN, LEFT, and RIGHT may be specified when the ARROW style is specified.

可以通过set方法来设置按钮文字,背景图片,背景颜色等属性。还可以为button追加事件处理器。此时需要导入org.eclipse.swt.events.*;该包内包含了事件处理的监听器以及adapter。基本的事件处理器是选择事件处理器,当按钮被点击时触发事件:

button1.addSelectionListener(new SelectionAdapter() {

   public void widgetSelected(SelectionEvent e) {

   System.out.println("Button1 was clicked");

  }

 });

List:List组件中可以包含很多item,用户可以从中选择item。

List list1 = new List(shell,SWT.MULTI);

其他可选的style包括BORDER,H_SCROLL,V_SCROLL,SINGLE和MULTI。可以通过使用setItems()方法或者add()方法来为list添加item。可以为list添加MouseListener来监听鼠标的一些事件。

List list1 = new List(shell, SWT.MULTI | SWT.H_SCROLL);

 list1.setItems(new String[] {"Strawberry","Banana","Apple"});

 list1.add("Pickle");

 list1.setBounds(0,0,60,100);

  

  final List list2 = new List(shell, SWT.SINGLE | SWT.BORDER);

 list2.setItems(new String[] {"Rock","Paper","Scissors"});

 list2.setBounds(110,0,50,50);

 list2.addMouseListener(new MouseAdapter() {

   public void mouseDown(MouseEvent e) {

   System.out.println(list2.getSelection()[0] +" wins");

  }

   public void mouseUp(MouseEvent e) {

   System.out.println("Try again!");

  }

 });

注意,为了在监听器中使用对象,list2必须声明为final类型。

Combo:combo组件允许用户从中选择一个item。用户还可以向combo组件中输入值。

Combo combo1 =  new Combo(shell, SWT.DROP_DOWN | SWT.READ_ONLY);

可选的样式包括:BORDER,DROP_DOWN,READ_ONLY和SIMPLE。可以通过setItems方法添加item,String数组作为参数的类型。使用select方法选择列表项目中的项目,该方法接受项目的索引作为参数。

Composite:Composite组件是可以包含其他组件的组件。放在Composite中的组件和放在shell中的组件一样。Composite中的组件的位置是相对于Composite的。

Composite composite = new Composite (shell, SWT.BORDER);

支持Composite的样式包括BORDER,H_SCROLL,V_SCROLL。

可以为Composite设置属性,例如背景色,但是不可以为它设置文本内容。下面的代码片段将一个Composite放在另一个Composite中。第一个Composite具有边框和背景颜色,为了使用setBackground方法,首先需要导入org.eclipse.swt.graphics.*包,并创建一个Color对象:

import org.eclipse.swt.graphics.*;

Color myColor = new Color(display,0,0,0);

注意,如果不为composite设置边框和背景颜色,那么就无法将其和shell的其他部分区分。第二个composite存在于第一个之中,包含了水平和垂直滚动条。

Composite composite1 = new Composite(shell,SWT.BORDER);

composite1.setBounds(10,10,270,250);

composite1.setBackground(new Color(display,31,133,31));  

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

label.setText("Here is a green composite");

label.setBounds(10,10,200,20);

Composite composite2 = new 

Composite(composite1,SWT.H_SCROLL|SWT.V_SCROLL);

composite2.setBounds(10,40,200,200);

 

List list = new List(composite2,SWT.MULTI);

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

list.add("Item " + i);

}

list.setSize(300,300);

 

Group:Group也是可以包含其他组件的组件。Group可以有边框以及一个可选的标题。 和Composite一样,Group中的每个组件的位置是相对于Group的。

Group group = new Group(shell, SWT.BORDER);

支持的样式包括BORDER, SHADOW_ETCHED_IN, SHADOW_ETCHED_OUT, SHADOW_IN, SHADOW_OUT and SHADOW_NONE。

可以为Group设置标准属性,例如大小,位置,背景色等等。但是使用Group的原则是将其他的控件分割成不同的部分。Group是Composite的子类,并且工作方式和Composite很类似。但是它可以设置文本。

Group group1 = new Group(shell, SWT.BORDER);

group1.setBounds(30,30,200,200);

group1.setText("Group 1");

 

Button button = new Button(group1, SWT.PUSH);

button.setBounds(10,20,80,20);

button.setText("I'm in a group");

 

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

label.setBounds(10,50,80,20);

label.setText("So am I!!");

 

Group group2 = new Group (group1, SWT.NONE);

group2.setBounds(10,100,150,50);

group2.setBackground(new Color(display,233,20,233));

group2.setText("I'm a group inside a group");

 

Button button2 = new Button(group2, SWT.PUSH);

button2.setBounds(10,20,50,20);

button2.setText("Twice..");

上面的代码将Group2放在Group1中,又将Group1放在shell中。同时每个Group内部又包含了其他的组件。

 

事件:

为了在SWT中捕获事件,首先要将为控件添加监听器,当监听器监听的事件发生时,执行监听器代码。完成这个功能需要两个步骤:首先,创建一个要捕获的事件的监听器,对于每个事件都有对应的监听器接口(i.e. SelectionListener),同时,也包含了每个事件对应的类(i.e. SelectionEvent)。在创建的监听器里面,必须实现监听器接口定义的方法。例如:

SelectionListener listener = new SelectionListener() {

public void widgetSelected(SelectionEvent arg0) {

System.out.println("Button Selected");

}

public void widgetDefaultSelected(SelectionEvent arg0) {

}

};

当监听器接口有很多个方法时,可以创建一个适配器类。适配器提供了对监听器接口的方法的空实现。这样的话,就不必为不需要的监听器接口的方法提供实现了。例如:

SelectionAdapter adapter = new SelectionAdapter() {

   public void widgetSelected(SelectionEvent arg0) {

   System.out.println("Button Selected");

  }

 };

如上所示,不再需要实现SelectionListener的不关注的方法(widegetDefaultSelected)了。

步骤二就是将监听器添加给组件。例如:

Button button = new Button(shell, SWT.PUSH

button.addSelectionListener(listener);

或者:

button.addSelectionListener(adapter);

一些常见的Listener类包括刚刚介绍的SelectionListener:

void      widgetDefaultSelected(SelectionEvent e)

      Sent when default selection occurs in the control.

void      widgetSelected(SelectionEvent e)

      Sent when selection occurs in the control.

KeyListener:

void      keyPressed(KeyEvent e)

      Sent when a key is pressed on the system keyboard.

void      keyReleased(KeyEvent e)

      Sent when a key is released on the system keyboard.

KeyEvent类中包含一个属性character,可以通过这个属性来判断事件源的键盘按键。一些特殊的组合键在SWT类中定义为常量,例如Control键为SWT.CTRL,回车为SWT.CR。

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

text.setBounds(10,10,100,100);

text.addKeyListener(new KeyListener() {

    public void keyPressed(KeyEvent e) {

        String string = "";

        switch (e.character) {

            case 0:     string += " '//0'"; break;

            case SWT.BS:  string += " '//b'"; break;

            case SWT.CR:  string += " '//r'"; break;

            case SWT.DEL:  string += " DEL"; break;

            case SWT.ESC:  string += " ESC"; break;

            case SWT.LF:  string += " '//n'"; break;

            default: string +=  " '" + e.character +"'"; break;

        }

        System.out.println (string);

        }

        public void keyReleased(KeyEvent e) {

            if (e.stateMask == SWT.CTRL && e.keyCode != SWT.CTRL)

            System.out.println("Command can execute here");

        }

});

上面的代码将一些特殊字符打印出来,例如按下Delete键时,输出DEL。如果是正常字符,那么正常输出。

MouseListener:监听双击,鼠标按下以及鼠标释放事件。

void      mouseDoubleClick(MouseEvent e)

      Sent when a mouse button is pressed twice within the (operating system specified) double click period.

void      mouseDown(MouseEvent e)

      Sent when a mouse button is pressed.

void      mouseUp(MouseEvent e)

      Sent when a mouse button is released.

MouseMoveListener:监听鼠标移动事件。

void      mouseMove(MouseEvent e)

          Sent when the mouse moves.

MouseTrackListener:监听鼠标划过某个区域或者组件。

void      mouseEnter(MouseEvent e)

      Sent when the mouse pointer passes into the area of the screen covered by a control.

void      mouseExit(MouseEvent e)

      Sent when the mouse pointer passes out of the area of the screen covered by a control.

void      mouseHover(MouseEvent e)

      Sent when the mouse pointer hovers (that is, stops moving for an (operating system specified) period of time) over a control.

MouseEvent类中有以下的属性:button,count,stateMask,x,y。其中x,y,stateMask和button是专门用于MouseListener的,button属性返回按下或者释放的button的数量。所以,shell上的第一个为1,第二个返回2,依次类推。x和y返回事件发生时的坐标。stateMask属性返回键盘的状态。

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

button.setText("Push Me");

button.setBounds(10, 10, 60, 20);

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

button.setText("Push Me Too");

button.setBounds(100, 10, 60, 20);

 

MouseAdapter mouseAdapter = new MouseAdapter() {

              public void mouseDown(MouseEvent e) {

                            System.out.println("Button " + e.button + " pressed");

                            System.out

                                                        .println("Mouse pressed at (" + e.x + "," + e.y + ")");

              }

 

              public void mouseUp(MouseEvent e) {

                            System.out.println("Mouse released at (" + e.x + "," + e.y

                                                        + ")");

              }

};

button.addMouseListener(mouseAdapter);

button2.addMouseListener(mouseAdapter);

 

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

label.setText("Double Click Me");

label.setBounds(10, 40, 100, 20);

label.addMouseListener(new MouseAdapter() {

              public void mouseDoubleClick(MouseEvent e) {

                            Shell shell2 = new Shell(display);

                            shell2.setSize(100, 100);

                            Label label2 = new Label(shell2, SWT.NONE);

                            label2.setText("Hello New Window!");

                            label2.setBounds(0, 50, 100, 20);

                            shell2.open();

              }

});

分别按下鼠标左键,中键和右键,输出如下:

Button 1 pressed

Mouse pressed at (13,13)

Mouse released at (38,9)

Button 2 pressed

Mouse pressed at (38,9)

Mouse released at (-32,10)

Button 3 pressed

Mouse pressed at (41,8)

Mouse released at (50,9)

 

文本监听器:当使用Text组件时,有很多监听器可以使用。例如ModifyListener和VerifyListener。当文本内容被修改时,ModifyListener被调用。在文本修改之前,VerifyListener被调用,可以使用它来验证新输入的值是否合法。

ModifyListner:只包含一个方法modifyText(),事件对象是ModifyEvent。该事件和TypedEvent相似,包含time和widget成员。当需要提示文本已经被修改时,使用ModifyListener。每当一个字符被修改时,modifyText方法都被调用。

VerifyListener:只包含一个方法verifyText(),事件对象是VerifyEvent,该事件包含了TypedEvent和KeyEvent事件的所有属性,例如start,end,doit,text等。start和end属性表示将被修改的文本的范围,text属性表示新的输入文本。doit标记表示是否需要完成事件触发的动作。可以通过使用这个监听器来检查和确保特定的字符被输入到特定的field中。例如在下面的例子中,*号不允许被输入,动作被取消。

Text text = new Text(shell, SWT.MULTI | SWT.WRAP);

text.setBounds(10, 10, 200, 100);

text.setText("Here is some sample text");

text.addModifyListener(new ModifyListener() {

              public void modifyText(ModifyEvent e) {

                            System.out.println("Modified at " + e.time);

              }

});

text.addVerifyListener(new VerifyListener() {

              public void verifyText(VerifyEvent e) {

                            if (e.text.equals("*")) {

                                          System.out.println("Cannot type *");

                                          e.doit = false;

                            }

              }

});

注:但是可以通过拷贝来粘贴*,将e.text.contains(“*”)即可。

焦点监听器:当组件获取焦点时,触发焦点事件,当组件通过遍历获取焦点时,触发遍历事件(TraverseEvent)。

FocusListener:该监听器接口包含两个方法,focusGained和focusLost。事件是FocusEvent。这个事件包含了所有的TypedEvent。

TraverseListener:该监听器接口只包含一个方法,即keyTraversed()。当组件被遍历的时候(例如通过tabs键或者箭头键)被触发。事件的名称为TraverseEvent,事件的属性包括detail和doit。detail属性表示那种遍历发生了。遍历的类型通过SWT.TRAVERSE_XXXXX。在下面的例子中,将detail和SWT.TRAVERSE_TAB_PREVIOUS.如果遍历是向前的tab,那么取消操作。

Button b1 = new Button(shell, SWT.PUSH);

Button b2 = new Button(shell, SWT.PUSH);

Button b3 = new Button(shell, SWT.PUSH);

Button b4 = new Button(shell, SWT.PUSH);

Button b5 = new Button(shell, SWT.PUSH);

Button b6 = new Button(shell, SWT.PUSH);

b1.setBounds(10, 10, 50, 50);

b2.setBounds(100, 10, 50, 50);

b3.setBounds(200, 10, 50, 50);

b4.setBounds(10, 100, 50, 50);

b5.setBounds(100, 100, 50, 50);

b6.setBounds(200, 100, 50, 50);

b1.setText("1");

b2.setText("2");

b3.setText("3");

b4.setText("4");

b5.setText("5");

b6.setText("6");

 

FocusListener focusListener = new FocusListener() {

              public void focusGained(FocusEvent e) {

                            System.out.println(e.widget + " has focus");

              }

 

              public void focusLost(FocusEvent e) {

                            System.out.println("And now has lost it.");

              }

};

TraverseListener traverseListener = new TraverseListener() {

              public void keyTraversed(TraverseEvent e) {

                            if (e.detail == SWT.TRAVERSE_TAB_PREVIOUS) {

                                          System.out.println("You can't go back!");

                                          e.doit = false;

                            }

                            System.out.println(e.widget + " was traversed");

              }

};

 

b1.addFocusListener(focusListener);

b4.addTraverseListener(traverseListener);

b4.addFocusListener(focusListener);

b6.addTraverseListener(traverseLi

 

参考资料:

SWT主页:http://www.eclipse.org/swt

SWT小例子:http://www.eclipse.org/swt/snippets/

SWT例子:http://www.eclipse.org/swt/examples.php

SWT文档:http://www.eclipse.org/swt/docs.php

Getting Started with Eclipse 2.1 and the SWT:http://www.cs.umanitoba.ca/~eclipse/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值