关于SWT/JFace的事件模型的四种方式
事件的4种写法
1.匿名内部类方式的写法
2.命名内部类的写法
3.外部类写法
4.实现监听接口的写法
第一种用匿名内部类的方法:
public class HelloWorld {
private static Text text;
public static void main(String[] args) {
// 创建一个典型的SWT应用程序的步骤
// display负责管理实践循环和控制UI县城和其他线程之间的通信
Display display = Display.getDefault(); // 1.创建一个Display
Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口)
shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小)
shell.setText("SWT Application");
text = new Text(shell, SWT.BORDER);
text.setBounds(71, 90, 76, 21);
// addMouseListener加入鼠标事件的监听器
text.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent e) {// 鼠标双击事件的方法
// 打开一个信息框
MessageDialog.openInformation(null, "", "Hello World");
}
});
// 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)
shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口
shell.layout();// shell应用界面布置
// 6.写一个事件转发循环.
while (!shell.isDisposed()) {// 如果主窗口没有关闭,则一直循环
if (!display.readAndDispatch()) {// 如果display不忙
display.sleep();// display休眠
}
}
}
}
这个是运行完之后的结果,在面板上增加了一个textbox.
代码中给这个textbox增加的一个双击的事件:双击弹出一个HelloWorld.

new MouseAdapter()就是一个匿名内部类.我们建立了一个继承于MouseAdapter的类,但是并没有给这个类命名.并且没有用通常的写法.
而是直接在text.addMouseListener方法中写下了类的代码,这就是所谓的匿名内部类.(我记得动态代理模式中用的就是这个匿名内部类的方式)
使用匿名内部类来写事件代码简单方便.但也要注意它的一些缺点:
(一)由于事件处理代码会随着组件一起分散在代码中的各个部分,不够集中,这样会导致代码阅读与维护上的不便.
(二)各事件的处理全部由嵌套的程序块组成,视觉上会显示有些乱.如果事件处理代码很长,也会导致阅读与维护上的不便.
(三)当工具栏,菜单栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致了代码不够简洁.
第二种:命名内部类的写法
事件代码使用命名内部类的方式,可以解决匿名内部类存在的问题.首先,事件处理代码都集中在一起,并且都具有意义的名称,程序容易阅读与维护:另外,单个的事件处理程序也可以被工具栏,菜单栏等重用.
示例代码如下:
public class HelloWorld {
private static Text text;
public static void main(String[] args) {
// 创建一个典型的SWT应用程序的步骤
// display负责管理实践循环和控制UI县城和其他线程之间的通信
Display display = Display.getDefault(); // 1.创建一个Display
Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口)
shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小)
shell.setText("SWT Application");
text = new Text(shell, SWT.BORDER);
text.setBounds(71, 90, 76, 21);
// 加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
// 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)
shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口
shell.layout();// shell应用界面布置
// 6.写一个事件转发循环.
while (!shell.isDisposed()) {// 如果主窗口没有关闭,则一直循环
if (!display.readAndDispatch()) {// 如果display不忙
display.sleep();// display休眠
}
}
}
// 定义一个名为MyMouseDoubleClick的内部类
private static final class MyMouseDoubleClick extends MouseAdapter {
@Override
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "HelloWorld");
}
}
}
第三种外部类实现的方式.
这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java中拿出去,单独写成一个类文件.
这种写法有和命名内部类一样的优点.但因为要单独写成一个文件,写起来会麻烦一些.实现代码如下:
HelloWorld3.java
public class HelloWorld3 {
private static Text text;
public static void main(String[] args) {
// 创建一个典型的SWT应用程序的步骤
// display负责管理实践循环和控制UI县城和其他线程之间的通信
Display display = Display.getDefault(); // 1.创建一个Display
Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口)
shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小)
shell.setText("SWT Application");
text = new Text(shell, SWT.BORDER);
text.setBounds(71, 90, 76, 21);
// 加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象
text.addMouseListener(new MyMouseDoubleClick());
// 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)
shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口
shell.layout();// shell应用界面布置
// 6.写一个事件转发循环.
while (!shell.isDisposed()) {// 如果主窗口没有关闭,则一直循环
if (!display.readAndDispatch()) {// 如果display不忙
display.sleep();// display休眠
}
}
}
}
MyMouseDoubleClick.java
public class MyMouseDoubleClick extends MouseAdapter {
@Override
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "HelloWorld");
}
}
第四种写法:实现监听接口的写法:
将HelloWorld类实现MouseListener接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更及简洁.
这种方式适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用.
这种方式还有一个要注意的地方:事件方法和其他方法混合在了一起,容易引起误读,所以应该在事件方法前加入详细的注释说明.
实现MouseListener接口要写的事件方法多一些,当然没有用的事件方法可以空实现,如果继承MouseListener接口的适配器MouseAdaper
则只写需要的方法就行了.(这就是MouseAdapter的这种类的好处和优点)
另外要注意:只有接口才能有多继承的特性.所以如果HelloWorld已经是某个类的子类.就只能用实现接口的方式,而不能继承接口的适配器了.
public class HelloWorld4 extends MouseAdapter {// 或者implements MouseListener
private static Text text;
public static void main(String[] args) {
HelloWorld4 hw4 = new HelloWorld4();
// 创建一个典型的SWT应用程序的步骤
// display负责管理实践循环和控制UI县城和其他线程之间的通信
Display display = Display.getDefault(); // 1.创建一个Display
Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口)
shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小)
shell.setText("SWT Application");
Text text1 = new Text(shell, SWT.BORDER);
text1.addMouseListener(hw4);//这个地方参考书中是用的this关键字,这个addMouseListener()中要传的是一个监听器对象.我就用的new出来的对象.
text1.setBounds(71, 90, 76, 21);
// 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)
shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口
shell.layout();// shell应用界面布置
// 6.写一个事件转发循环.
while (!shell.isDisposed()) {// 如果主窗口没有关闭,则一直循环
if (!display.readAndDispatch()) {// 如果display不忙
display.sleep();// display休眠
}
}
}
@Override
public void mouseDoubleClick(MouseEvent e) {
MessageDialog.openInformation(null, "", "HelloWorld");
}
}
总结:
匿名内部类方式写起来要方便些.但不适合事件代码太长,太多的情况.
从代码书写,阅读,维护以及程序的可扩展性角度来看,命名内部类写法最为值得推荐.
外部类的写法主要是为了代码重用才考虑使用,如果包(package)外的类要用到此事件处理代码,这时外部类就派上用场了.
而第四种写法,要求组件都可以共用事件代码时才能使用.
关于SWT/JFace的事件模型的四种方式的更多相关文章
- SWT组件添加事件的四种方式
在我们CS日常开发过程中会经常去为组件添加事件,我们常用的为AWT与SWT.SWT的事件模型是和标准的AWT基本一样的.下面将按照事件的四种写法来实现它. 一.匿名内部类的写法 new MouseAd ...
- android点击事件的四种方式
android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...
- jQuery绑定事件的四种方式:bind、live、delegate、on
1.jQuery操作DOM元素的绑定事件的四种方式 jQuery中提供了四种事件监听方式,分别是bind.live.delegate.on,对应的解除监听的函数分别是unbind.die.undele ...
- JAVA解析XML的四种方式
java解析xml文件四种方式 1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这 ...
- JavaScript事件处理程序的3种方式
最近这段时间因为每天要修改网站,为网站做特效,所以看了很多的js接触事件,自己只会使用一小部分,有时用的时候也比较混乱,现在系统的整理了一下,首先跟大家在马海祥博客上跟大家分享的是JavaScript ...
- 实现web数据同步的四种方式
http://www.admin10000.com/document/6067.html 实现web数据同步的四种方式 1.nfs实现web数据共享 2.rsync +inotify实现web数据同步 ...
- 解析xml文件的四种方式
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- 第三节:Action向View传值的四种方式(ViewData、ViewBag、TempData、Model)
简 介 在前面的章节中,我们已经很清楚,MVC工作模型的流程,Controller中的Action接收到客户端的请求,处理后要将数据返回给View,那么Action中是如何将数据返回给View的,二 ...
- .net core 2.x - 缓存的四种方式
其实这些微软docs都有现成的,但是现在的人想对浮躁些,去看的不会太多,所以这里就再记录下 ,大家一起懒一起浮躁,呵呵. 0.基础知识 通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性 ...
随机推荐
- LeetCode题解——Longest Palindromic Substring
题目: 给定一个字符串S,返回S中最长的回文子串.S最长为1000,且最长回文子串是唯一. 解法: ①遍历,对于每个字符,计算以它为中心的回文子串长度(长度为奇数),同时计算以它和右边相邻字符为中心的 ...
- VBScript Sample:遍历文件夹并获取XML文件中指定内容
案例: 我有一个文件夹,里面有很多子文件夹,每个子文件夹中都存在一个相同名字的XML文件,XML文件里面的标签结构相同,只是内容不同,XML文件中包含ID,Name等标签. 文件夹及文件结构如下图: ...
- Linux与Windows的8个不同
(整理来自网络) 对刚刚接触Linux的人来说,很容易从windows的观念去理解Linux系统.今天扒一扒Win和Linux之间常见的8个区别. 一.Linux终端输入密码不回显字符 用户的密码在L ...
- eclipse配置tomcat加大内存的方法
双击tomcat -Dcatalina.base="E:\work\whykt\.metadata\.plugins\org.eclipse.wst.server.core\tmp0&quo ...
- n & (n-1)
n&(n-1)作用:将n的二进制表示中的最低位为1的改为0,先看一个简单的例子: n = 10100(二进制),则(n-1) = 10011 ==>n&(n-1) = 10000 ...
- POJ3922 A simple stone game
网上有很多解题报告,我的理解就是可以用类似数学归纳的方法证明,就是取一个数,让对手进入必败态. 详细见论文.
- 【现代程序设计】【homework-04】
Personal Software Process Stages 时间百分比(%) 实际花费的时间 (分钟) 原来估计的时间 (分钟) 计划 0 0 0 · 估计这个任务需要多少时 ...
- Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)
反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...
- xampp配置host和httpd可以随意访问任何本机的地址
1.修改host 不管你用的是什么系统,windows, mac,电脑上都会有一个 hosts 文件,修改这个文件,可以改变主机名所对应的 ip 地址.比如你安装了 Web 开发环境(MAMP 或 W ...
- web工作方式,浏览网页,打开浏览器,输入网址按下回车键,然后会显示出内容,这个过程是怎样的呢?
以下内容摘自<Go Web编程>,介绍的通俗易懂. 我们平时浏览网页的时候,会打开浏览器,输入网址后按下回车键,然后就会显示出你想要浏览的内容.在这个看似简单的用户行为背后,到底隐藏了些什 ...