首页 SWT-JFace开发入门指南

SWT-JFace开发入门指南

举报
开通vip

SWT-JFace开发入门指南 本文档摘自中国 Eclipse 社区,文章地址:http://www.eclipseworld.org/bbs/read-cec-tid-172.html,作者博客地址: http://blog.csdn.net/jayliu ——by wakinfan,2008.10.14,20:35 SWT/JFace开发入门指南 SWT/JFace 开发入门指南(一) 写在前面的话 终于决定提起笔来写一篇关于 swt 和 JFace 编程的文章。在开始之前,我想先介绍一下你能 够从将要出现的这一...

SWT-JFace开发入门指南
本文档摘自中国 Eclipse 社区,文章地址:http://www.eclipseworld.org/bbs/read-cec-tid-172.html,作者博客地址: http://blog.csdn.net/jayliu ——by wakinfan,2008.10.14,20:35 SWT/JFace开发入门指南 SWT/JFace 开发入门指南(一) 写在前面的话 终于决定提起笔来写一篇关于 swt 和 JFace 编程的文章。在开始之前,我想先介绍一下你能 够从将要出现的这一系列文章里得到什么,以及更重要的,你不能得到什么。我们的时间是 如此之重要,以至于我们很难容忍把它浪费在自己不关心的事情上。 因为我刚开始写,所以到底这些文章会分成几次发布出来,也很难讲。但是我心里大体有这 样一个提纲。也就是说,我打算介绍以下方面的内容: 设定 swt 以及 JFace 的开发环境 swt 的一些简单部件(widget)介绍 JFace 的一些入门性介绍 swt 和 JFace 的事件模式 通过一些简单的例子说明如何利用 swt 和 JFace 编写图形化应用程序 我还要说明一下你不能从本文中得到的信息,这些信息包括: swt 和 JFace 相关内容非常深入的介绍:正如你从题目中了解到的,本文的定位是“入 门”,也就是说假定的读者是那些对 swt 和 JFace 开发没有什么了解的人。所以我并不打算 进行一个深入的介绍。因为我相信在入门之后,他们能够找到更好的资料(此外,我可能会 写另外一个系列文章来介绍)。 eclipse 的使用:我假定你在读这篇文章的时候已经对 eclipse 有所了解,所以不会解释 到具体 eclipse 如何使用。 eclipse 插件开发:虽然 eclipse 插件开发和本文内容有着千丝万缕的联系,我决定还是 不把它列为介绍的内容。这方面,你仍然可以找到相当多的资料供参考。 与作者联系 如果你希望和我联系的话,你可以发 email 到 jayliu@mail.csdn.net。 延伸阅读 你不知道什么是 eclipse 么?你可以打开 http://www.eclipse.org,这是 eclipse 的官方站点。 如果你希望对 eclipse 功能有详细的了解,你可以读一下这本 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 《CONTRIBUTING TO ECLIPSE》。 你不知道什么是 swt/JFace 么?你可以看一下 Wikipedia 中的介绍: http://en.wikipedia.org/wiki/Swt http://en.wikipedia.org/wiki/Eclipse_%28computing%29 你对 eclipse,swt 的历史感兴趣么?我强烈推荐你看一下这篇八卦: http://www.csdn.net/news/newstopic/20/20433.shtml 如果你对 eclipse 的一些新闻比较感兴趣的话,可以关注一下大胃的 blog: http://www.blogjava.net/sean/ 最后你可以从一个地方得到所有你想要的东西:http://www.google.com OK,介绍到此为止,下面我开始正文: Hello,world!:搭建一个 swt/JFace 开发环境 在前面我曾经提到过:我们假定你对 eclipse 开发有一些了解。所以在这一节中,我将示范 如何搭建一个 swt/JFace 开发环境,并且用一个老掉牙的 Hello,world!程序作为示范。 建立开发环境 你完全可以不使用 eclipse,而是使用别的 IDE 来进行开发,但是你需要有 swt/JFace 的一些 库文件。 为了能够进行正常的 swt/JFace 开发,你需要做以下工作: 第一步:建立一个 Java 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 :因为这个是大家都非常熟悉的,所以就不再赘述,你可以建 立一个任何名字的 Java 工程。 第二步:导入 swt 以及 JFace 的库文件。这也就意味着:将 swt/JFace 相关的库文件导入到 工程的 classpath 中去。 需要的库文件有哪些呢?打开 eclipse 安装目录下的 plugins 文件夹,我们需要找到以下 jar 文件: org.eclipse.swt_3.x.x.jar org.eclipse.jface_3.x.x.jar org.eclipse.core.runtime_3.x.x.jar org.eclipse.ui.workbench_3.x.x.jar 这就是我们搭建一个基本 SWT/JFace 程序所需要基本的一些库文件了。其中 3.x.x 视你所 使用的 eclipse 版本而定,譬如我的 eclipse 版本是 3.1M6,这些 3.x.x 就是 3.1.0。将他们加 入你程序的 classpath 中。 为了更加清楚地说明如何做,你可以看一下下面的图 1。这是我在 eclipse 的做法:打开工程 的 properties 对话框,然后选择 Java Build Path 中的 Libraries 选项卡,将这些 jar 导入进来。 当然你可以有自己的做法。 图 1 第三步:为你的 java 程序添加本地库文件。如果你使用 windows 的话,你可能注意到在 eclipse 的 plugins目录下还有一个 org.eclipse.swt.win32_3.x.x.jar,将这个 jar解压以后在 os/win32/x86 目录下有几个 dll 文件。这几个 dll 为 swt 通过 JNI 访问 windows 本地 API 提供了接口,我 们需要将使 java 程序在启动时候即能够访问它。你可以有多种办法实现这个目的: 最简单的办法就是直接把这几个文件拷贝到你 jre 的 bin 目录下 你也可以设定环境变量时候,在 PATH 中加入这几个 dll 文件的目录。 你还可以在运行程序时候指定 java.library.path 为这几个 dll 所在的目录,在 eclipse 中,如果 你打开 Help 菜单中 About eclipse Platform,然后在出现的对话框中选择 configuration details 按钮,你可以在接下来出现的对话框中找到 java.library.path 配置 java.library.path 你还有另外一种办法,就是在最后运行程序的时候,从 Run 菜单中选 择 Run As..而不是 Run As Java Application,填写好必要的其他参数以后打开 Argument 选项 卡,然后在 VM Argument 输入框中填写该参数为 dll 文件的路径,如图 2 所示 图 2 通过这三步工作,你就可以编写 swt/JFace 程序了。 Hello,World! 下面的内容就是我们 Hello,world!的示例。首先建立一个类,我将这个类取名为 HelloSwt, 在我的工程中,它位于 swtjfacesample 包的下面。类的内容如下: 1package swtjfacesample; 2 3 import org.eclipse.swt.SWT; 4 import org.eclipse.swt.widgets.Display; 5 import org.eclipse.swt.widgets.Shell; 6 import org.eclipse.swt.widgets.Text; 7 8 public class HelloSwt { 9 /** 10 * Hello,world! 11 * 12 * @param args 13 */ 14 public static void main(String[] args) { 15 Display display = new Display(); 16 Shell shell = new Shell(display); 17 18 Text helloText = new Text(shell, SWT.CENTER); 19 helloText.setText("Hello,World!"); 20 helloText.pack(); 21 22 shell.pack(); 23 shell.open(); 24 25 while (!shell.isDisposed()) { 26 if (!display.readAndDispatch()) { 27 display.sleep(); 28 } 29 } 30 display.dispose(); 31 32 } 33 } 34 代码段 1 关于这段代码的内容,我们会在下面的内容中进行详细介绍。现在我们可以尝试着运行一下, 确定已经编译完成后从 eclipse 的 Package Explorer 中选中这个类然后点右键,在弹出的菜单 中你会看到 Run As,进一步选中这一项,然后在二级菜单中选“Run As Java Application”, 如果运行正常的话你会看到如图 3 的运行结果: 图 3 Q&A:出现了问题怎么办 Q:我的程序编译时候出现了错误! A:如果是提示诸如 Text,Display 这些类不能够被成功引入,那么你需要检查一下是否我们前 面提到的 jar 都已经被成功引入到你的 classpath Q:编译成功了但是不能运行,出现了异常 A:检查一下异常信息,如果你的异常信息类似这样: Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3128 in java.library.path 的话,那说明我们在前面第三步提到的那些 dll 没有正常工作,最好能够按照前面的说明重 新配置一下。 SWT/JFace 开发入门指南(二) 从 Hello, world!开始了解 Display 和 Shell 在这一节中,我们从前面所列举出来的 Hello, world!程序开始对 swt 进行一些初步的探索。 所谓的初步是指,我们会介绍编写 swt程序的基本思路,以及对两个重要的类:Display和 Shell 作一些介绍。 因为这一节和前一节是分成两个部分贴出来的,所以我仍然将 Hello, world!的代码段在下面 列出来: 1 package swtjfacesample; 2 3 import org.eclipse.swt.SWT; 4 import org.eclipse.swt.widgets.Display; 5 import org.eclipse.swt.widgets.Shell; 6 import org.eclipse.swt.widgets.Text; 7 8 public class HelloSwt { 9 /** 10 * Hello,world! 11 * 12 * @param args 13 */ 14 public static void main(String[] args) { 15 Display display = new Display(); 16 Shell shell = new Shell(display); 17 18 Text helloText = new Text(shell, SWT.CENTER); 19 helloText.setText("Hello,World!"); 20 helloText.pack(); 21 22 shell.pack(); 23 shell.open(); 24 25 while (!shell.isDisposed()) { 26 if (!display.readAndDispatch()) { 27 display.sleep(); 28 } 29 } 30 display.dispose(); 31 32 } 33 } 代码段 2 这段程序虽然很简单,但是它反映了我们书写 swt 程序的步骤,这些步骤是: 1. 创建一个 Display 对象 2. 创建一个或者多个 Shell 对象,你可以认为 Shell 代 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 了程序的窗口。 3. 在 Shell 内创建各种部件(widget) 4. 对各个部件进行初始化(外观,状态等),同时为各种部件的事件创建监听器(listener) 5. 调用 Shell 对象的 open()方法以显示窗体 6. 各种事件进行监听并处理,直到程序发出退出消息 7. 调用 Display 对象的 dispose()方法以结束程序。 在 Hello,world!程序中,为了让程序更加简单,我们没有创建事件监听器,在以后的内容中 会进行专门介绍。 现在让我们稍微深入一些,看一下这些 Display,Shell 有什么作用以至于我们每个程序都必须 有它们存在。 Display:与操作系统沟通的桥梁 我们在前面说过,每个 swt 程序在最开始都必须创建一个 Display 对象。Display 对象起什么 作用呢?它是 swt 与操作系统沟通的一座桥梁。它负责 swt 和操作系统之间的通信。它将 swt/JFace 的各种调用转化为系统的底层调用,控制操作系统为 swt 分配的资源。同时我们 也可以通过 Display 对象得到操作系统的一些信息。 Display 是一个“幕后工作者”,它为 swt/JFace 提供支持,但是你并不能够从某个用户界面中 看到它的影子。 在前面的 Hello,world!程序中,我们可以看到构建一个 Display 对象是和普通的 Java 对象一 样通过构造函数实现的。它为实现图形界面准备了最基本的条件。而在程序结束时我们必须 显式地调用 dispose() 方法来释放程序运行中所获得的资源。一般来说,一个程序只需要一 个 Display 对象,当然没有人禁止你创建多个 Display 对象。但是在 swt 的 javadoc 中,我们 可以看到关于这个问题一些描述: “Applications which are built with SWT will almost always require only a single display. In particular, some platforms which SWT supports will not allow more than one active display. In other words, some platforms do not support creating a new display if one already exists that has not been sent the dispose() message.” Display 有着众多的方法,我们不可能一一介绍。在这里只挑选几个可能会比较常用的作一 些简单介绍。 setData()和 getData():这一对函数允许我们为 Display 对象设定一些数据,setData()的参数中 key 和 value 类似于我们在使用 Map 对象中 key 和 value 的含义。 getShells()得到关联到该 Display 对象的所有没有 dispose 的 Shell 对象 getCurrent()得到与用户交互的当前线程 readAndDispatch()得到事件并且调用对应的监听器进行处理 sleep()等待事件发生 Shell:窗口 一个 Shell 对象就是一个窗口。你可以在上面放置各种部件创建丰富的图形界面。 我们都知道窗口有很多种,比如窗口有可以调整大小的,有不可以的,有的没有最大化最小 化按钮。这些窗体的特征在 swt 中被成为风格(style)。一个窗体的风格可以用一个整数进 行定义。这些风格的定义在 org.eclipse.swt.SWT 中。 Shell 对象可用的风格包括:BORDER, CLOSE, MIN, MAX, NO_TRIM, RESIZE, TITLE , PLICATION_MODAL, MODELESS, PRIMARY_MODAL,S YSTEM_MODAL 这些风格我们不作一一介绍,你可以从他们字面意义看出一些含义来,当然也可以参考对应 的 javadoc。 我们可以在一个 Shell 的构造函数中定义它的风格,比如在前面的 Hello,world!程序中,我们 可以这样定义 Shell。 Shell shell = new Shell(display,SWT.CLOSE | SWT.SYSTEM_MODAL); 最后得到的窗体没有最大化和最小化按钮,并且大小是固定不变的。 因为 swt 运行于各种平台之上,而这些平台上的窗口管理器千差万别,所以所有这些风格都 不是肯定可以实现的。在 swt 的 javadoc 中,这被称为暗示(hints)。 Shell 对象的方法大都和 GUI 有关,比如 setEnabled()设定了窗体是否能够和用户进行交互, setVisble()设定了窗体是否可见,setActive()将窗体设为当前的活动窗口。 我们可以用 open()方法打开一个窗体,close()方法关闭一个窗体。 小结 学校三防设施建设情况幼儿园教研工作小结高血压知识讲座小结防范电信网络诈骗宣传幼儿园师德小结 本节讨论了 Display 和 Shell 的一些概念,这是我们以后进一步了解 swt 的基础。在下一节中, 我将介绍各种部件(widget)的用法,所谓部件,是指文本框,标签等 UI 实体。 SWT/JFace 开发入门指南(三) 初步体验 widget 在前面的两篇文章中,我向大家介绍了 swt 的一些基本知识,现在让我们继续下去讨论一下 swt 中的 widget 相关的一些知识以及介绍几种最为简单的 widget。 从 Widget 和 Control 开始 Widget 是 Control 的父类,而 Control 是我们使用的大多数部件的父类。我们在以前的一些 编程语言中可能接触过“控件”或者“组件”之类的概念,部件(widget)的概念大体和这些相 当。 在 org.eclipse.swt.widgets 中定义了众多的 widget,甚至我们前面介绍的 Shell 也被当成 widget 的一种。 因为可用的 widget 如此之多,所以我大概没有办法全部一一介绍。在这一节中,我会介绍 几种常用的 widget。相信善于触类旁通的你通过这些极为简略的介绍应该可以开始使用各种 widget,在使用中不断完善自己的认识。 首先我们来介绍 Widget。它是一个抽象类,也是所有 widget 的父类。通过介绍这个类,我 们可以得出这所有 widget 的一些共有特性。 Widget 的方法中 dispose()方法我们在以前曾经见到过,调用这个方法时候,所谓的接收者 (receiver,譬如我们这样写:awidget.dispose(),那么 awidget 就是接收者,而这句话所处的 对象成为调用者或者 caller)和接收者中所包含的其他 widget 会释放它们所占用底层操作系 统的资源。这也就是说你不必显式地为程序中创建的每个 widget 进行 dispose()调用,而只 需要确保最外层的 widget(比如 Display)进行了 dispose()就可以了。 另外还可以通过 isDisposed()判断是否该 widget(接收者)已经进行了 dispose。 Widget 中的 getStyle()方法得到 widget 的风格,而 getDisplay()得到所处的 Display 对象。 此外 Widget 中还有两个重要方法 getData()和 setData(),这两个方法允许我们为一个 widget 附加其他的信息。特别是在你需要跨模块传递 widget 的时候,这个功能显得非常有用。比 如如果一个文本框中显示了一段文章中的某句话,如果我们同时希望把这整篇文章的题目和 作者附加上的话可以这样写: 1 atext.setData("title","I Have A Dream"); 2 atext.setData("author","Martin Luther King"); 代码段 3 在 程 序 的 其 他 部 分 可 以 用 atext.getData(“title”) 得 到 这 篇 文 章 的 题 目 , 或 者 用 atext.getData("author")得到作者。 在前面我们提到过,Control 是今后我们所使用大部分 widget 的父类。在这里我不单独进行 介绍,而是在后面的部分中介绍。 创建部件 和创建其他 java object 一样,我们通过使用 new 操作符创建部件的实例。有一点比较特殊的 可能你需要使用带参数的构造函数进行 new 操作。类似下面的程序: Text text=new Text(shell,SWT.CENTER); 这种方法适用于几乎所有的 widget,其中第一个参数是父 widget,也就是指明了该 widget 需要被放置道另外哪一个 widget 之中,而第二个参数是这个 widget 的风格。 大小和位置 仅仅创建一个部件并不足以让你看到它,因为一个部件初始的长和宽都是 0。你还需要设定 它的大小。你可以用 setSize()或者 setBounds()方法手动设定部件的大小,也可以让系统自动 调整部件的大小到一个合适的值,这个值也被成为首选尺寸(preferred size)。 可以通过调用 pack()方法让系统调整控件大小。如果你希望系统自动调整,那么你需要首先 设定控件需要表达的内容。举个例子来说,如果你的部件是一个文本框或者标签,你应该首 先设定它所要显示的文本,这样系统可以通过文本的长度计算。 对于部件的位置,同样可以使用 setLocation()或者 setBounds()进行设定。 这里值得一提的是所谓的 bounds,其实 bounds 可以看成是大小和尺寸的综合。比如 setBounds(int x, int y,int width,int height)的参数中,x和 y描述的是位置信息,而width和 height 描述了大小。 隐藏与失效 通过部件的 setVisible 方法可以控制部件进行隐藏或是显示。通过 setEnabled 方法可以控制 部件是否有效。一个无效的部件不会对用户的任何动作作出响应。这两个方法的参数都是布 尔型的。 提示文本 可以通过 setToolTipText()方法设定部件的提示文本。 几种常用的部件 Label 标签用来显示静态的文本或者图像。关于图像和色彩我会在后面的部分进行介绍。 标签可以使用 SWT.CENTER, SWT.LEFT, SWT.RIGHT 中的一种指明文本的对齐方式(居中 对齐,左对齐,右对齐)。 你也可以通过设置标签属性为 SWT. SEPARATOR 使标签成为一条分隔符。 下面这个程序给出了标签的两种表现形式,其中使用了 Layout,关于 Layout 的详细情况也 会在后面的部分进行介绍: 1 public class Labels { 2 3 public static void main(String[] args) { 4 Display display = new Display(); 5 Shell shell = new Shell(display,SWT.SHELL_TRIM); 6 RowLayout layout=new RowLayout(SWT.VERTICAL); 7 shell.setLayout(layout); 8 shell.setText("Labels"); 9 Label label1=new Label(shell,SWT.CENTER); 10 label1.setText("Label Demo"); 11 Label label2=new Label(shell,SWT.SEPARATOR | SWT.HORIZONTAL); 12 shell.setSize(100,100); 13 shell.open(); 14 15 while (!shell.isDisposed()) { 16 if (!display.readAndDispatch()) { 17 display.sleep(); 18 } 19 } 20 display.dispose(); 21 } 22 } 23 代码段 4 最后得到的效果可以参照下图: 图 4 Text Text 就是最简单的文本框,与标签一样,我们可以通过设定它的风格来表示它的对齐方式 (SWT.CENTER,SWT.LEFT,SWT.RIGHT),另外还有其他一些用于文本支持的方法,比 如 insert(),paster(),copy(),setSelection(),selectAll()等,这些方法在后面介绍 swt 事件模 式会进行更详细的介绍。 Button 在 swt 中,Button 并不仅仅是按钮。构造时候定义的风格不同,所体现出的外观也不一样。 如果风格定义成 SWT.PUSH,它就是一个普通的按钮。 如果定义为 SWT.TOGGLE,它在被按下以后会保持按下的形状(而不会弹起来),直到鼠标 再次在上面按一下才会回复弹起的形状。 如果风格定义为 SWT.ARROW,它是一个带箭头的按钮,箭头的指向可以选择 SWT.LEFT, SWT.RIGHT,SWT.UP,SWT.DOWN 中的一个。 如果定义为 SWT.CHECK,它是一个复选框。 如果定义为 SWT.RADIO,它是一个单选框。 下面一段程序演示了各种不同的 Button。 1 public class Buttons { 2 3 public static void main(String[] args) { 4 Display display = new Display(); 5 Shell shell = new Shell(display,SWT.SHELL_TRIM); 6 RowLayout layout=new RowLayout(SWT.VERTICAL); 7 shell.setLayout(layout); 8 shell.setText("Buttons"); 9 10 Button pushbutton=new Button(shell,SWT.PUSH | SWT.CENTER); 11 pushbutton.setText("SWT.PUSH"); 12 13 Button togglebutton=new Button(shell,SWT.TOGGLE | SWT.LEFT); 14 togglebutton.setText("SWT.TOGGLE"); 15 togglebutton.setSelection(true); 16 17 Button arrowbutton=new Button(shell,SWT.ARROW | SWT.LEFT); 18 19 20 Button checkbox=new Button(shell,SWT.CHECK); 21 checkbox.setText("SWT.CHECK"); 22 23 Button radio=new Button(shell,SWT.RADIO); 24 radio.setText("SWT.RADIO"); 25 radio.setSelection(true); 26 27 shell.pack(); 28 shell.open(); 29 30 while (!shell.isDisposed()) { 31 if (!display.readAndDispatch()) { 32 display.sleep(); 33 } 34 } 35 display.dispose(); 36 } 37 } 代码段 5 最后得到的窗口如下图: 图 5 小结 在这一节中我向大家介绍了 widget 的一些基本知识,还有几种简单的 widget。你可能注意 到这些描述仅仅限于外观方面,如何让 widget 和用户交互起来呢?这需要我们处理各种用 户事件,在下一节中我会向大家介绍 swt 的事件模式。 SWT/JFace 开发入门指南(四) 让你的 swt 程序动起来 在向使用者提供最差的用户体验方面,中国的 IT 企业始终走在时代的最前端。之所以有这 样的感慨其实是来源于往 blog 上贴上一节的内容:我用了一整天的功夫,不断与 CSDN 各 种莫名其妙的出错提示进行斗争,最后终于成功的贴了上去。 其实作为 CSDN blog 一个使用者,我的要求并不高:只要能写 blog,能够正常访问就可以 了。然而就是这么一点基本的要求好像也得不到满足。 我不知道大家有没有这样的体验:其实软件使用者要求的东西都很基本,而现在软件做得越 来越复杂,有相当大一部分是在于软件开发者把自己的注意力放在了一些附加功能(这些功 能可能让用户感到惊喜,但是如果没有它们用户也不会不满意)上,而真正用户的要求却得 不到满足。所以大家在 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 程序的时候,一定要明白,有时候简单就是一种美,把时间花费 到真正有价值的地方去。 OK,回到我们的主题上来。在这一节中,我将给大家介绍 swt 的事件模式。在前面我们也 提到过,写一个 swt 程序,无非就是分几步走。其中比较需要费心的就是布置好用户界面和 处理各种事件。 添加了事件处理的 Hello,world! 其实 swt 中处理事件非常简单,对应于各种事件都有相应的 listener 类,如果一种事件叫做 Xyz,那么对应的 listener 类就是 XyzListener。比如对应于鼠标事件的有 MouseListener,对 应于键盘事件的就是 KeyListener。而在每种 widget 中,对于它可以处理的事件都有 addXyzListener 方法,只要把对应的 listener 实例作为参数传给它就可以了。 为了更加清楚的说明,我们先来看下面一段程序: 1 public class EventDemo { 2 3 private Shell _shell; 4 5 public EventDemo() { 6 Display display = new Display(); 7 Shell shell = new Shell(display,SWT.SHELL_TRIM); 8 setShell(shell); 9 RowLayout layout=new RowLayout(); 10 shell.setLayout(layout); 11 shell.setText("Event demo"); 12 13 Button button=new Button(shell,SWT.PUSH | SWT.CENTER); 14 button.setText("Click me!"); 15 16 button.addSelectionListener(new SelectionListener(){ 17 18 public void widgetSelected(SelectionEvent event) { 19 handleSelectionEvent(); 20 } 21 22 public void widgetDefaultSelected(SelectionEvent event) { 23 } 24 }); 25 shell.setBounds(200,300,100,100); 26 shell.open(); 27 28 while (!shell.isDisposed()) { 29 if (!display.readAndDispatch()) { 30 display.sleep(); 31 } 32 } 33 display.dispose(); 34 35 } 36 37 protected void handleSelectionEvent() { 38 MessageBox dialog=new MessageBox(getShell(),SWT.OK|SWT.ICON_INFORMATION ); 39 dialog.setText("Hello"); 40 dialog.setMessage("Hello,world!"); 41 dialog.open(); 42 } 43 44 /** 45 * @param args 46 */ 47 public static void main(String[] args) { 48 49 EventDemo eventdemo=new EventDemo(); 50 } 51 52 /** 53 * @return Returns the _shell. 54 */ 55 public Shell getShell() { 56 return _shell; 57 } 58 59 /** 60 * @param _shell The _shell to set. 61 */ 62 public void setShell(Shell shell) { 63 this._shell =shell; 64 } 65 } 66 代码段 6 你可以看到在这段程序中,我们只创建了一个 Button,随后调用了它的 addSelectionListener() 方法,在这个新创建的 Listener,我们只为 widgetSelected 方法添加了代码,并在其中创建 了一个对话框。实际运行效果如下图,其中那个标有 Hello,world 的对话框是按了按钮以后 出现的: 图 6 如果总结一下,我们可以得出处理事件的几个步骤: 1. 针对你所处理的事件,找出合适的 XyzListener 接口 2. 编写一个新的类,这个类实现了 XyzListener 接口 3. 在你所感兴趣的事件中编写处理代码,而对于那些你不感兴趣的方法可以让它们保持空白 (就像实例中的 widgetDefaultSelected()方法)一样 让事件处理更加简单:使用适配器(adapter) 有时候我们可能会感觉这样仍然不够简单,比如我只对 SelectionListener 中的 widgetSelected() 方法感兴趣,但是为了能够通过编译器的编译,我却不得不写一个空白 的 widgetDefaultSelected()方法(因为 SelectionListener 是一个接口,你必须实现它所有的方法)。 幸运的是,swt 帮我们解决了这个问题,途径就是使用 adapter。在 swt 中,对应于一个 XyzListener 都有一个 XyzAdapter,adapter 都是抽象类并且实现了对应的 listener 接口,它为 对应 listener 接口中的每个方法都定义了一个默认实现(基本上就是什么都不做),我们在使 用时候只需要 override 掉自己感兴趣的方法就可以了。 结合上一小节中的代码,如果使用 SelectionAdapter 代替 SelectionListener 的话,我们的代码 就可以这样写: button.addSelectionListener(new SelectionAdapter(){ public void widgetSelected(SelectionEvent event) { handleSelectionEvent(); } }); 这样是不是很方便呢? EventObject:事件处理的附加信息 在处理各种事件时,我们需要一些附加信息,而 EventObject 给我们提供了这些信息。 我们先来看下面这个简单的小程序,在这段程序中,我们创建了两个文本框,当在第一个文 本框输入时,第二个文本框中显示输入的字符。 1 public class EventDemo2 { 2 3 Text logText; 4 5 public EventDemo2() { 6 Display display = new Display(); 7 Shell shell = new Shell(display,SWT.SHELL_TRIM); 8 9 GridLayout layout=new GridLayout(); 10 layout.numColumns=2; 11 shell.setLayout(layout); 12 shell.setText("Event demo"); 13 14 Label label1=new Label(shell,SWT.RIGHT); 15 label1.setText("text1:"); 16 Text text1=new Text(shell,SWT.NONE); 17 18 text1.addKeyListener(new KeyAdapter(){ 19 public void keyPressed(KeyEvent e) { 20 Text t=getLogText(); 21 String s=t.getText(); 22 t.setText(String.valueOf(e.character)); 23 } 24 } 25 ); 26 27 Label label2=new Label(shell,SWT.RIGHT); 28 label2.setText("text2:"); 29 Text text2=new Text(shell,SWT.NONE); 30 text2.setEditable(false); 31 text2.setBackground(new Color(display,255,255,255)); 32 setLogText(text2); 33 34 shell.pack(); 35 shell.open(); 36 37 while (!shell.isDisposed()) { 38 if (!display.readAndDispatch()) { 39 display.sleep(); 40 } 41 } 42 display.dispose(); 43 } 44 /** 45 * @param args 46 */ 47 public static void main(String[] args) { 48 EventDemo2 demo2=new EventDemo2(); 49 } 50 /** 51 * @return Returns the logText. 52 */ 53 public Text getLogText() { 54 return logText; 55 } 56 /** 57 * @param logText The logText to set. 58 */ 59 public void setLogText(Text logText) { 60 this.logText = logText; 61 } 62 } 63 代码段 7 你可能没有兴趣仔细研究这么长的代码,那么让我们只关注这一小段代码: text1.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e) { Text t=getLogText(); String s=t.getText(); t.setText(String.valueOf(e.character)); } } ); 在这段代码中,我们使用了 KeyAdapter 来处理键盘事件,而 keyPressed 会在有键按下时候 被调用,我们在函数中使用了 KeyEvent 类型的参数 e,并且通过 e.character 得到了按下键对 应的字符。 各种 EventObject(例如上面示例中的 KeyEvent)在事件处理函数中作为参数出现,它们可 能有不同的属性和方法,利用这些特性我们可以做很多有意思的事情。 我们下面只简单介绍几种 EventObject,它们分别是对应于窗口事件(ShellListener, ShellAdapter)的 ShellEvent,对应于键盘事件(KeyListener,KeyAdapter)的 KeyEvent 和对应 于鼠标事件(MouseListener,MouseAdapter)的 MouseEvent。希望可以起到窥一斑而见全 豹的作用。 几种 EventObject 简介 ShellEvent 如果你打开 ShellEvent 的 API,你会很惊讶的发现它只有一个布尔型的属性,就是 doit。这 个莫名其妙的属性是用来做什么的呢? 我们知道,Shell 对应的就是程序的窗口,在 ShellListener 中定义的几种事件包括窗口激活 时候的 shellActivated,窗口即将被关闭时候的 shellClosed等等。ShellEvent中唯一的属性doit, 就是用来设定是否这些动作将有效的。 再说得具体一些,比如 Windows 下通常我们会通过点击窗口右上角的关闭按钮来关闭窗
本文档为【SWT-JFace开发入门指南】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_825839
暂无简介~
格式:pdf
大小:650KB
软件:PDF阅读器
页数:35
分类:互联网
上传时间:2011-10-12
浏览量:82