关于SWT/JFace的事件模型的四种方式
2014-12-12 14:30
441 查看
事件的4种写法
1.匿名内部类方式的写法
2.命名内部类的写法
3.外部类写法
4.实现监听接口的写法
第一种用匿名内部类的方法:
这个是运行完之后的结果,在面板上增加了一个textbox.
代码中给这个textbox增加的一个双击的事件:双击弹出一个HelloWorld.
new MouseAdapter()就是一个匿名内部类.我们建立了一个继承于MouseAdapter的类,但是并没有给这个类命名.并且没有用通常的写法.
而是直接在text.addMouseListener方法中写下了类的代码,这就是所谓的匿名内部类.(我记得动态代理模式中用的就是这个匿名内部类的方式)
使用匿名内部类来写事件代码简单方便.但也要注意它的一些缺点:
(一)由于事件处理代码会随着组件一起分散在代码中的各个部分,不够集中,这样会导致代码阅读与维护上的不便.
(二)各事件的处理全部由嵌套的程序块组成,视觉上会显示有些乱.如果事件处理代码很长,也会导致阅读与维护上的不便.
(三)当工具栏,菜单栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致了代码不够简洁.
第二种:命名内部类的写法
事件代码使用命名内部类的方式,可以解决匿名内部类存在的问题.首先,事件处理代码都集中在一起,并且都具有意义的名称,程序容易阅读与维护:另外,单个的事件处理程序也可以被工具栏,菜单栏等重用.
示例代码如下:
第三种外部类实现的方式.
这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java中拿出去,单独写成一个类文件.
这种写法有和命名内部类一样的优点.但因为要单独写成一个文件,写起来会麻烦一些.实现代码如下:
HelloWorld3.java
MyMouseDoubleClick.java
第四种写法:实现监听接口的写法:
将HelloWorld类实现MouseListener接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更及简洁.
这种方式适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用.
这种方式还有一个要注意的地方:事件方法和其他方法混合在了一起,容易引起误读,所以应该在事件方法前加入详细的注释说明.
实现MouseListener接口要写的事件方法多一些,当然没有用的事件方法可以空实现,如果继承MouseListener接口的适配器MouseAdaper
则只写需要的方法就行了.(这就是MouseAdapter的这种类的好处和优点)
另外要注意:只有接口才能有多继承的特性.所以如果HelloWorld已经是某个类的子类.就只能用实现接口的方式,而不能继承接口的适配器了.
总结:
匿名内部类方式写起来要方便些.但不适合事件代码太长,太多的情况.
从代码书写,阅读,维护以及程序的可扩展性角度来看,命名内部类写法最为值得推荐.
外部类的写法主要是为了代码重用才考虑使用,如果包(package)外的类要用到此事件处理代码,这时外部类就派上用场了.
而第四种写法,要求组件都可以共用事件代码时才能使用.
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中其他常用的事件
- 详解react关于事件绑定this的四种方式
- JAVA.SWT/JFace: SWT中的事件模型/SWT常见的事件/SWT类所代表的事件常量/按键与其对应的常量表、KeyEvent事件比较、VerifyEvent事件比较
- SWT事件模型概述与事件处理的常用写法
- Java事件处理机制- 事件监听器的四种实现方式
- 三本书-关于现实事件抽象为模型
- SWT事件的四种写法 (转)
- Java事件处理机制 - 事件监听器的四种实现方式
- Java事件处理机制 - 事件监听器的四种实现方式(转)
- 关于DOM事件模型的两件事
- JAVA.SWT/JFace: SWT类所代表的事件常量
- IOS种四种持有化数据方式——(2)对模型对象进行归档
- 关于不同窗体之间的控件查询 - 方式二(事件与回调)
- 关于DOM事件模型的两件事
- SWT事件的四种写法
- c++ 关于强制转换的四种方式
- SWT事件的四种写法 推荐
- 关于SWT/JFACE
- 关于XML文档模型的事件驱动
- 关于javascript DOM事件模型的两件事