本文主要是介绍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/
这篇关于SWT 基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!