免费预览已结束,剩余17页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用Eclipse进行SWT编程The best way to predict the future is to invent it.Alan Kay1. 为什么要使用SWT?SWT是IBM开发一套跨平台的GUI开发框架。为什么IBM要创建另一种GUI呢?为什么他们不使用现有的Java GUI框架呢?要回答这些问题,我需要回到Java的早期时代。Sun已经创建了一套跨平台的GUI框架 AWT (Abstract Windowing Toolkit)。 这个AWT框架使用了本地窗口组件(native widgets)不过它存在LCD问题. 这个LCD问题导致了它失去主要的平台特性。换句话说,如果平台A有窗口组件140而平台B有窗口组件2025,那么这个跨平台的AWT框架只能提供这两个集合的交集。为了解决这个问题,Sun创建了一个新的框架使用模拟窗口组件(emulated widgets)来代替本地窗口组件(native widgets)。这个方法解决了LCD问题同时提供了丰富的窗口组件,不过也产生了其他的问题。例如,Swing应用程序不再和本地程序在样子上一致。虽然JVM有了很大的改善, 但是Swing应用程序仍然存在它们本地配对物所没有的性能问题。而且,Swing应用程序消耗了太多的内存,故不适合用于PDA和移动电话等小型设备。IBM发现这些方法都无法满足他们的需求。因此,IBM创建了新的GUI库叫做SWT,它解决了AWT和Swing框架中的问题。SWT框架使用JNI访问本地窗口组件(native widgets),如果一个窗口组件在主机平台上不能获得,那么SWT会模拟这个不能获取的窗口组件。2. 一个SWT应用程序的基础材料Display, Shell和Widgets是一个SWT应用程序的基础材料。Displays用于管理事件循环(event loops)和控制UI线程和其他线程之间的通讯。Shell是应用程序中由操作系统窗体管理器来管理的窗体。任何SWT应用程序都需要至少一个Display实例和1个或更多的Shell实例。图 1.不同视角看的SWT程序图1 说明了一个SWT应用程序的不同看法。第一幅图是简化的UI对象的继承图。第二幅图是UI对象的包含结构。第三幅图就是创建了的UI。如果一个应用程序使用多个线程,每个线程使用自己的Display对象实例。那么你可以通过使用静态的Display.getCurent()方法得到当前活跃的Display对象实例。一个Shell表示一个特别操作系统中的一个窗口。一个Shell可以最大化,正常化,和最小化。有两种类型的shell。一种是顶层(top-level)Shell作为Display的主窗口创建的,另一种是依赖于其他shell的对话shell。Shell的类型是由传给Shell构造函数的style位决定的。Shell的默认值是对话Shell。也就是说,如果没有传递任何值给构造函数参数,那么创建的是默认的对话Shell。如果一个Display对象作为参数,那么它是顶层(top-level)Shell。有些窗口组件(widget)的属性必须在创建时设定。这些窗口组件(widget)属性叫做style bits。Style bits是在SWT类中定义的常量。如Button button = new Button( shell, )。当然可以通过或操作|来使用多个style bit。例如,要使用一个有边的按钮,你需要使用SWT.PUSH | SWT.BORDER作为style bit参数。3. 环境设置开发一个SWT应用程序与开发一个Swing应用程序不同。为了可以开始一个SWT应用程序的开发,你需要把SWT库加到classpath中,同时设置好对应的必要的环境变量。第一个需要的库是swt.jar文件,它位于ECLIPSE_HOMEeclipsepluginsorg.eclipse.swt.win32_2.1.0wswin32目录。根据你使用的Eclipse版本,你可能需要使用不同的目录。这个swt.jar文件必须加到你的classpath中,为此到Project-Properies-JavaBuildPath-Libraries-Add Variable - Eclipse Home -Extend并按上述路径选择swt.jar库,然后单击OK。然后,你可以编译SWT应用程序,但是由于抛出下边所示的运行时异常,无法运行它,因为swt.jar使用了本地库。你需要设置java.library.path环境变量来在Java中使用本地库。Console outputjava.lang.UnsatisfiedLinkError: no swt-win32-2133 in java.library.pathat 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.(Display.java:287)at Main.main(Main.java:25)Exception in thread main要设置java.library.path变量,到Run- Run.- Java Applicaton- New -Arguments - VM Arguments。然后,如何需要,如下修改path,把它粘贴到VM Arguments部分。-Djava.library.path=c:eclipsepluginsorg.eclipse.swt.win32_2.1.0oswin32x86装载本地库如果你需要装载应用程序使用的任何本地库,你可以使用Runtime.getPlatform.loadLibrary(libraryname)方法。完成这些步骤,你就可以在你的eclipse环境下运行SWT程序了。4. 你的第一个SWT应用程序创建一个典型的SWT应用程序需要一下步骤: 创建一个Display 创建一个或多个Shells 设置Shell的Layout manager 创建Shell中的widgets 开启Shell窗口 写一个事件转发循环 销毁display你可以使用下边的代码模板来快速的运行本文中的代码片断。你可以复制粘贴这些代码至合适的区域。如源代码1所示:源代码 1. SWT应用程序模板import org.eclipse.swt.layout.RowLayout;import org.eclipse.swt.widgets.Display;import org.eclipse.swt.widgets.Shell;public class SliderExample 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(); 这个例子显示了一个空的窗口。你可以加widget到上边的模板。任何SWT应用程序需要一个Display和一个或多个Shells。这个Shell是个合成对象;它可以容纳其他的合成对象。如果没有设置shell的layout,加到Shell的widget是不能看见的。Shell窗口必须打开才能显示。事件处理循环读取并转发GUI事件。如果没有事件处理循环应用程序窗口是无法显示的。即使通过open()方法来打开Shell窗口。让后,需要在Shell被丢弃的时候销毁Display。导入需要的库你可以使用Source-Organize Imports菜单或者Ctrl+Shift+O来自动导入需要的库。5. 在Eclipse外运行SWT应用程序要在不使用Eclipse的环境下运行SWT应用程序,swt.jar库必须在classpath中,并且java.library.path环境变量必须正确设置。根据主机平台,必须有合适的本地库存在。对于Windows平台,你可以根据如下来完成本地库的配置:1. 把swt.dll放在和程序相同的文件夹下。2. 把swt.dll放在JAVA_HOMEbin文件夹下。3. 把swt.dll放在c:windowssystem32文件夹下。javac -classpath c:swtswt.jar HelloWorld.javaJava -classpath c:swtswt.jar;. -Djava.library.path=c:swt HelloWorldjava.library.path是JNI必需的环境变量。如果你没有设置这个环境变量。你的DLL 类是不能访问的。在这种情况下,应用程序不能正常的运行,并会抛出异常。SWT库Swt库存在于Eclipse的plug-in目录下。如果你想不下载整个Eclipse包而获得SWT库,你可以在/downloads目录下单独下载这个SWT库。6. SWT包(Packages)SWT主要由下列包组成。这些包的定义是从Eclipse的API文档上得到的。你可以在Eclipse的网站上获得整个API文档。org.eclipse.swt: 包含了定义了SWT需要使用的常量和异常的类。这个包由三个类组成:SWT, SWTException和SWTError。SWT类可能是最受欢迎的类,因为它包含了SWT库所需要的常量如键盘、错误、颜色、布局、文本样式、按钮等常量。org.eclipse.swt.widgets: 包含了大多数核心SWT窗口组件,包括支持的接口和类。org.eclipse.swt.events: 定义了SWT组件使用的typed events, listeners和events。这个包有三组不同的类:Listener接口,Adapter类和Event类。org.eclipse.swt.dnd: 包含了对SWT窗口组件拖放(drag-and-drop)支持的类。org.eclipse.swt.layout: 包含了提供对SWT窗口组件自动安置和大小控制的类。org.eclipse.swt.print: 包含了对SWT窗口组件提供打印支持的类。org.eclipse.swt.graphics: 这个包提供了实现基本绘图操作需要的点,长方形、区域,颜色,光标,字体,图像上下文(GC)等的类和包含了显示图像代码和载入/保存他们的公有API的图像类。7. 对话框对话框的实现是本地的。也就是说,对话框像窗口组件一样是平台组件。SWT的Dialogs是从Dialog抽象类继承的。对话框不是窗口组件但是他可以容纳窗口组件。图 2. Dialog类层次图.SWT有不同类型的对话框。有些对话框具有特殊的属性。Dialog类可以如源代码 2中使用。源代码2. MessageBox例子MessageBox messageBox = new MessageBox(shell, SWT.OK|SWT.CANCEL);if (messageBox.open() = SWT.OK) System.out.println(Ok is pressed.);每个对话框的open()方法返回不同的类型。例如, MessageBox对话框从open()方法返回int类型。因此,需要编写不同的条件来处理每一个对话框的返回值。ColorDialog显示一个色彩选择调色板。它从return方法返回一个RGB对象。DirectoryDialog使你可以选择一个目录。它从open()方法返回一个字符串。返回值就是选择的目录。当然,也可以设置额外的过滤器来过滤有些目录。FontDialog使用户能够从系统所有的字体中选择一种字体。它从open()方法返回一个FontData对象。FileDialog使用户能够选择一个文件。另外,可以设置扩展名过滤器,路径过滤器和文件名过滤器。对话框有如表1所示的样式:表1. SWT对话框style bit常量SWT.OPENShows Open button in the dialogSWT.SAVEShows Save button in the dialogPrintDialog使用户在打印之前选择打印机。它从open()方法返回一个PrinterData对象。MessageBox用于给用户回馈信息。你可以使用或(|)操作来联合不同的样式,如源代码3所示:源代码3. MessageBox例子 MessageBox messageBox = new MessageBox(shell, SWT.OK| SWT.CANCEL| SWT.ICON_WARNING); messageBox.setMessage(www.korayguclu.de); messageBox.open();图3就是上边例子的运行消息框。图 3. MessageBox对话框可用的按钮常量如下所列。使或操作可以完成不同按钮的联合。SWT框架按照style bits创建对话框。按钮常量有:SWT.ABORT, SWT.OK, SWT.CANCEL, SWT.RETRY, SWT.IGNORE,SWT.YES和SWT.NO。表2 显示了对话框可以使用的图标。表2. SWT图标style bit常量SWT.ICON_ERRORSWT.ICON_INFORMATIONSWT.ICON_QUESTIONSWT.ICON_WARNINGSWT.ICON_WORKING8. WidgetsSWT GUI对象是从Widget和Control类继承而来的。Widget对象是基类定义了GUI类的通用方法。Control类是所有窗口GUI类的基类也就是说从Control类继承的组件需要一个窗口或者对话框来显示。Menu对象也需要一个窗口来显示,但是这个需求间接得到了满足。一个Menu对象需要一个Control对象。图4. Widget类层次图图 4 显示了Widget的类层次图。Widget,Item,ScrollBar和Control类是抽象类。8.1. Widget事件Widget事件总结表3。简化起见,表中只包含了事件名称。我们可以很容易的使用Event 想出事件类的名称。同样地,使用Listener得到相关联地Listener地名称。并不是每一事件都有相配地Adapter类。所以,有adapter地事件用粗体表明。我们可以通过Adaptor 来得到对应地adapter名字。例子:事件名称是Control,事件类就是ControlEvent,listener类是ControlListener,adaptor 类是ControlAdaptor。表3. SWT Events事件名称窗口组件产生的时间ArmMenuItem一个菜单项加亮时ControlControl, TableColumn, Tracker一个控件被改变大小或者移动时DisposeWidget窗口组件被销毁时FocusControl一个控件得到或者失去焦点时HelpControl, Menu, MenuItem用户需要帮助时(例如按F1键)KeyControl当控件得到键盘焦点并且一个键按下或者释放时MenuMenu菜单显示或者隐藏时ModifyCombo, Text窗口组件的文本被修改时MouseControl在控件范围内鼠标被按下,释放或者双击时MouseMoveControl鼠标越过控件MouseTrackControl鼠标进入,离开或者盘旋在控件上方PaintControl控件需要被重绘时SelectionButton, Combo, CoolItem, List, MenuItem, Sash, Scale, ScrollBar, Slider, StyledText, TabFolder, Table, TableColumn, TableTree, Text, ToolItem, Tree一个Item在控件中被选择时ShellShellShell被最小化,最大化,激活,钝化或者关闭时TraverseControl控件被遍历(tabbed)时 TreeTree, TableTree一个tree item被收缩或者展开时VerifyText, StyledText窗口组件的文本将要被修改时8.2. 有用的窗口组件图 5. Control类层次图所有的Control类都可以有边框。你可以使用SWT.BORDER常量来给控件类增加边框。SWT style常量一般都需要标明样式常量 (style bit).如果你不知道用哪个常量或者你不想要标明它,你可以使用SWT.NULL。8.2.1. 按钮按钮可以具有不同的样式。按钮的样式由style bit决定。表4显示了按钮列表和他们的样式常量。Table 4. SWT按钮style bit常量和例子常量例子描述SWT.ARROW一个按钮用于显示弹出对话框。箭头的方向由alignment常量决定。SWT.CHECK选择框,可以是图像。SWT.PUSH一个按钮SWT.RADIO在group中可以使用的单选按钮SWT.TOGGLE同SWT.PUSH类似, 但是它可以保持按下状态直到第二次单击。8.2.2. 滑块(Slider), 标尺(Scale)和进度条(ProgressBar)窗口组件标尺(Scale)表示一段可选择的连续值。范围可以用Scale类的setMinimum() 和setMaximum()方法设定。并可以使用getSelection()方法得到所选择的值。标尺在一次只有一个选择的值。也就是说,没有多选的可能。图 6. 包含在一起的滑块和标尺根据传递给构造函数的参数值的不同,我们可以创建不同的滑块和标尺。滑块和标尺常量如表5所示:表 5. SWT滑块和标尺的样式常量SWT.HORIZONTALSWT.VERTICAL显示水平或者垂直组件随意地,你可以使用SWT.BORDER常量来在标尺周围创建边框。这个常量对滑块没有作用。Source 4. Slider widget example final Slider slider = new Slider(shell,SWT.VERTICAL); slider.setMinimum(0); slider.setMaximum(100); slider.setIncrement(5); slider.setPageIncrement(10); slider.setSelection(25); slider.addSelectionListener( new SelectionAdapter() public void widgetSelected(SelectionEvent e) System.out.println(Selection:+ slider.getSelection(); );进度条组件类似于滑块和标尺组件,但是它不能被选择。它用于显示一个任务的进度。你可以对进度条组件使用SWT.SMOOTH and SWT.INTERMINATE常量。8.2.3. 文本窗口组件一个文本窗口组件可以用于显示或者编辑文本。另外,你可以使用StyledText窗口组件来用不同的字体和颜色显示文本。StyledText窗口组件允许设置前景、背景色和指定范围文本块的字体。图 7. Text窗口组件我们可以使用表6所列的常量来创建Text窗口组件。因此,SWT.H_SCROLL和SWT.V_SCROLL常量可用于对Text窗口组件增加滚动条。表 6. SWT Text style bit常量SWT.MULTISWT.SINGLE显示单行还是多行窗口组件SWT.READ_ONLY创建只读的组件SWT.WRAP文本自动换行源代码 5是一个简单的使用Text组件的例子.Source 5. Text widget example Text text = new Text(shell, SWT.MULTI|SWT.WRAP);8.2.4. 列表(List)窗口组件List窗口组件可用于显示可选择的字符串列表。在选择的情况下,List对象会发送事件通告给它的listeners。这种类型的选择可以是单选,也可以是多选。选择的类型是由SWT.SINGLE和SWT.MULTI常量决定的。List窗口组件是可滚动的组件。因此SWT.H_SCROLL和SWT.V_SCROLL常量可用于给Text窗口组件增加滚动条。图 8. List 窗口组件下边的代码片断显示了一个简单的List窗口组件。Source 6. List example final List list = new List(shell,SWT.MULTI); for (int i = 1; i 11; i+) list.add(i+.)www.korayguclu.de); list.addSelectionListener( new SelectionAdapter() public void widgetSelected(SelectionEvent e) List list = (List) e.getSource(); String str = list.getSelection(); for (int i = 0; i str.length; i+) System.out.println(Selection: +stri); );8.2.5. 窗框组件窗框组件可用于在可改变的区域里显示组合窗口组件。下图就是一个窗框组件例子。图 9. 窗框组件下边是一个基本的窗框组件例子:Source 7. Sash example Button button = new Button(shell,SWT.PUSH); Sash sash = new Sash(shell, SWT.VERTICAL); Button button1 = new Button(shell,SWT.PUSH);8.3. 组合窗口组件Composite Widgets组合窗口组件可以容纳其他的组合窗口组件。Composite类是组合窗口组件的父类。图 10. Composite可以容纳其他的组合类组合类可以容纳其他的组合类。这种容纳关系是用一个组合窗口组件类的构造函数来建造的。与Swing相比,SWT没有add() 方法;作为代替,你必须使用构造函数来建立包容关系结构。 正如图10中所看到的,Shell类也是一个组合类。也就是说,Shell对象,可以容纳其他的组合类。组合类是可以卷起的,也就是说可以使用SWT.H_SCROLL和SWT.V_SCROLL常量给组合窗口组件加上滚动条。8.3.1. Table窗口组件Table窗口组件可以显示一批字符串项或者图片。与其他的组合窗口组件相比,不能给table窗口组件增加组合控件。Table窗口组件的子构件必须是TableItem类型的。图 11. Table窗口组件表7中的常量可以用于table窗口组件表 7. SWT Table style bit常量SWT.MULTISWT.SINGLE使能够进行单一或者多项选择SWT.FULL_SELECTION使能够进行行全选SWT.CHECK在每一行的开始显示一个选择框源代码 8 中的代码片断表明了含有两列的table组件的使用方法源代码 8. Table窗口组件例子 final Table table = new Table(shell,SWT.SINGLE); TableColumn col1 = new TableColumn(table,SWT.LEFT); col1.setText(Coloumn 1); col1.setWidth(80); TableColumn col2 = new TableColumn(table,SWT.LEFT); col2.setText(Coloumn 2); col2.setWidth(80); TableItem item1 = new TableItem(table,0); item1.setText(new Stringa,b); TableItem item2 = new TableItem(table,0); item2.setText(new Stringa,b); table.setHeaderVisible(true); table.setLinesVisible(true);8.3.2. Combo(组合框)窗口组件Combo窗口组件允许用户从值列表中选择一个值或者随意输入一个新值。组合框(combo)类似于列表组件,却使用了有限的空间。虽然组合框是组合性质的,但是对它增加子元素是没有意义的。它的元素必须是String类型。一元素可以使用Combo类中定义的add(String element)方法来添加到组合框中。图 12. 不同样式的组合框下边的SWT常量可以用于Combo窗口组件:Table 8. SWT Combo style bit constantsSWT.DROP_DOWN下拉式组合框SWT.READ_ONLY只读组合框SWT.SIMPLE简单的组合框(非下拉式组合框)。如图11所示下边的例子说明了Combo组件的使用:Source 9. Combo example final Combo combo = new Combo(shell,SWT.DROP_DOWN); for (int i = 1; i 11; i+) combo.add(i+.) element ); combo.setText(Text); combo.addSelectionListener( new SelectionAdapter() public void widgetSelected(SelectionEvent e) System.out.println(Selection:+ combo.getText(); );8.3.3. Tree窗口组件Tree窗口组件描绘了树中项的可选择层次结构。虽然Tree类是组合的,但是不能对它增加组合类对象。Tree类的子项必须是ThreeItem类型。图 13. 不同样式的Tree窗口组件下表是Tree组件常量的列表。表 9. SWT Tree style bit 常量SWT.SINGLESWT.MULTI允许单选或者多选SWT.CHECK在每个节点的开始显示一个选择框。下边是一个简单的Tree组件例子。源代码 10. Tree例子 final Tree tree = new Tree(shell,SWT.SINGLE); for (int i = 1; i 11; i+) final TreeItem item1 = new TreeItem(tree,SWT.NULL); item1.setText(node +i); for (int j = 1; j 6; j+) final TreeItem item11 = new TreeItem(item1,SWT.NULL); item11.setText(node +i+.+j); tree.addSelectionListener( new SelectionAdapter() public void widgetSelected(SelectionEvent e) System.out.println(Selection:+ tree.getSelection()0); );8.3.4. TabFolderTabFolder组件允许用户从一些页面中选择一页。虽然它是组合的,但是它不能增加其他的组合窗口组件。加到TabFolder的组件必须是TabItem类型。Tab的内容可以使用TabItem的setControl(Control control) 方法来设置。图 14. TabFolder窗口组件一个简单的TabFolder例子:源代码 11. TabFolder例子 final TabFolder tabFolder = new TabFolder( shell, SWT.BORDER); for (int i=1; i5; i+) / create a TabItem TabItem item = new TabItem( tabFolder, SWT.NULL); item.setText( TabItem + i); / create a control Label label = new Label( tabFolder, SWT.BORDER); label.setText( Page + i); / add a control to the TabItem item.setControl( label ); 8.3.5. CoolBar窗口组件CoolBar窗口组件提供了一个可以在动态摆放空间上增加项的区域。你可以增加一个或多个ToolBar组件到CoolBar上。一个CoolBar可一容纳一个或多个CoolItems。虽然是一个组合窗口组件,但是不能把其他组合类加到它上。CoolBar的子元素必须是CoolItem类型。图 15. Coolbar窗口组件CoolBar窗口组件使用的例子:Source 12. CoolBar example CoolBar coolBar = new CoolBar(shell, SWT.BORDER); coolBar.setLayoutData( new FillLayout(); / create a tool bar which it / the control of the coolItem for (int k = 1; k 3; k+) ToolBar toolBar = new ToolBar(coolBar, SWT.FLAT); for (int i = 1; i 5; i+) ToolItem item = new ToolItem(toolBar, SWT.NULL); item.setText(B+k+.+i); / Add a coolItem to a coolBar CoolItem coolItem = new CoolItem(coolBar, SWT.NULL); / set the control of the coolItem coolItem.setControl(toolBar); / You have to specify the size Point size = toolBputeSize( SWT.DEFAULT, SWT.D
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科普资助项目协议书
- 租车区块链合同范本
- 电动门加工合同范本
- 电焊车间承包协议书
- 消毒供应中心护理质量评价标准
- 溃疡性结肠炎症状解析及护理学习
- 2025-2026学年广东省广州市高一上学期期中模拟地理试卷03人教版(解析版)
- 2025-2026学年安徽省县中联盟高一上学期10月联考试地理试卷(解析版)
- 子宫肌瘤常见症状及护理方法讲解
- 礼仪风采大赛自我介绍
- 刘老根大舞台开幕曲简谱乐谱
- 新闻采访学2023章节测试答案-新闻采访学超星尔雅答案
- 西安某综合办公楼弱电智能化设计方案
- 西南交通大学机械原理课后习题答案
- 初始理论课件 CHAPTER4自动飞行
- GB/T 8642-2002热喷涂抗拉结合强度的测定
- GB/T 38145-2019高含量贵金属合金首饰金、铂、钯含量的测定ICP差减法
- 计量基础知识培训 课件
- 超星网络课隋唐史答案
- 9tomo临床应用3年汇报
- 《风景名胜区条例》解读课件
评论
0/150
提交评论