SWT 基础

2024-02-17 01:38
文章标签 基础 swt

本文主要是介绍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框架只能提供两者的交集。

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

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

 

SWT编程组件:

SWT应用程序的基本构成模块是DisplayShellWidgetsDisplay负责管理事件循环以及控制UI线程和其他线程之间的通信;Shell是应用程序中由操作系统窗口管理程序管理的窗口;每个SWT应用程序都至少包含一个DisplayShell实例。
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 bitsstyle bitsSW类中被定义为常量,例如,Button button = new Button(shell, <styleBits>)。可以通过OR操作符( | )使用多个style bit。例如,而乐使用一个推样式的带边框的按钮,可以使用SWT.PUSH | SWT.BORDER作为style bit参数。

 

设置环境:

设置方法一:

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

首先需要的libswt.jar文件,位于:

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

注:该路径为eclipse3.4swt库文件所处位置,对于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部分下载SWTzip文件。(http://www.eclipse.org/swt/)

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

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

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

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

(选择要使用SWTprojectProject->Propertes->Java Build Path->Projects->org.eclipse.swt)

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

 

SWT组成包功能简介:

org.eclipse.swt :  SWT常量和错误处理,即SWTExceptionSWTError

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.*;

然后创建DisplayShell对象

Display display = new Display();

Shell shell = new Shell(display);

Display对象包含所有的GUI组件,Display并不是可见的,但是添加到display的对象是可以见的。一般来说,对于一个应用程序只创建一个Display对象。 Shell是应用程序中的一个窗口,一个应用程序可以包含多个shellshell可以是顶层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,WRAPSEPARATORSEPARATOR样式是一种特殊的label,它在标签和其他的组件之间画一条线。可以添加到separator的样式有HORIZONTAL,VERTICAL,SHADOW_IN,SHADOW_OUTSHADOW_NONE。下面的代码创建了五个标签,其中有两个标签使用了separators

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

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

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

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

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

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

Button支持的style包括PUSH,CHECK,RADIO,TOGGLEARROW。还可以使用FLAT,BORDER,LEFT,RIGHTCENTER

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

  }

 });

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

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

其他可选的style包括BORDER,H_SCROLL,V_SCROLL,SINGLEMULTI。可以通过使用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类型。

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

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

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

CompositeComposite组件是可以包含其他组件的组件。放在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);

 

GroupGroup也是可以包含其他组件的组件。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的原则是将其他的控件分割成不同的部分。 GroupComposite的子类,并且工作方式和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类中有以下的属性:buttoncountstateMaskxy。其中xystateMaskbutton是专门用于MouseListener的,button属性返回按下或者释放的button的数量。所以,shell上的第一个为1,第二个返回2,依次类推。xy返回事件发生时的坐标。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组件时,有很多监听器可以使用。例如ModifyListenerVerifyListener。当文本内容被修改时,ModifyListener被调用。在文本修改之前,VerifyListener被调用,可以使用它来验证新输入的值是否合法。

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

VerifyListener:只包含一个方法verifyText(),事件对象是VerifyEvent,该事件包含了TypedEventKeyEvent事件的所有属性,例如startenddoittext等。startend属性表示将被修改的文本的范围,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:该监听器接口包含两个方法,focusGainedfocusLost。事件是FocusEvent。这个事件包含了所有的TypedEvent

TraverseListener:该监听器接口只包含一个方法,即keyTraversed()。当组件被遍历的时候(例如通过tabs键或者箭头键)被触发。事件的名称为TraverseEvent,事件的属性包括detaildoitdetail属性表示那种遍历发生了。遍历的类型通过SWT.TRAVERSE_XXXXX。在下面的例子中,将detailSWT.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 SWThttp://www.cs.umanitoba.ca/~eclipse/

这篇关于SWT 基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/716306

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

c++基础版

c++基础版 Windows环境搭建第一个C++程序c++程序运行原理注释常亮字面常亮符号常亮 变量数据类型整型实型常量类型确定char类型字符串布尔类型 控制台输入随机数产生枚举定义数组数组便利 指针基础野指针空指针指针运算动态内存分配 结构体结构体默认值结构体数组结构体指针结构体指针数组函数无返回值函数和void类型地址传递函数传递数组 引用函数引用传参返回指针的正确写法函数返回数组

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

【MRI基础】TR 和 TE 时间概念

重复时间 (TR) 磁共振成像 (MRI) 中的 TR(重复时间,repetition time)是施加于同一切片的连续脉冲序列之间的时间间隔。具体而言,TR 是施加一个 RF(射频)脉冲与施加下一个 RF 脉冲之间的持续时间。TR 以毫秒 (ms) 为单位,主要控制后续脉冲之前的纵向弛豫程度(T1 弛豫),使其成为显著影响 MRI 中的图像对比度和信号特性的重要参数。 回声时间 (TE)

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma