博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于SWT/JFace的事件模型的四种方式
阅读量:6412 次
发布时间:2019-06-23

本文共 6323 字,大约阅读时间需要 21 分钟。

事件的4种写法

1.匿名内部类方式的写法

2.命名内部类的写法

3.外部类写法

4.实现监听接口的写法

 第一种用匿名内部类的方法: 

1 public class HelloWorld { 2     private static Text text; 3     public static void main(String[] args) { 4         // 创建一个典型的SWT应用程序的步骤 5         // display负责管理实践循环和控制UI县城和其他线程之间的通信 6         Display display = Display.getDefault(); // 1.创建一个Display 7         Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口) 8         shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小) 9         shell.setText("SWT Application");10 11         text = new Text(shell, SWT.BORDER);12         text.setBounds(71, 90, 76, 21);13         // addMouseListener加入鼠标事件的监听器14         text.addMouseListener(new MouseAdapter() {15             public void mouseDoubleClick(MouseEvent e) {
// 鼠标双击事件的方法16 // 打开一个信息框17 MessageDialog.openInformation(null, "", "Hello World");18 }19 });20 21 // 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)22 shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口23 shell.layout();// shell应用界面布置24 // 6.写一个事件转发循环.25 while (!shell.isDisposed()) {
// 如果主窗口没有关闭,则一直循环26 if (!display.readAndDispatch()) {
// 如果display不忙27 display.sleep();// display休眠28 }29 }30 }31 }

 这个是运行完之后的结果,在面板上增加了一个textbox.

代码中给这个textbox增加的一个双击的事件:双击弹出一个HelloWorld.

 

 new MouseAdapter()就是一个匿名内部类.我们建立了一个继承于MouseAdapter的类,但是并没有给这个类命名.并且没有用通常的写法.

而是直接在text.addMouseListener方法中写下了类的代码,这就是所谓的匿名内部类.(我记得动态代理模式中用的就是这个匿名内部类的方式)

使用匿名内部类来写事件代码简单方便.但也要注意它的一些缺点:

(一)由于事件处理代码会随着组件一起分散在代码中的各个部分,不够集中,这样会导致代码阅读与维护上的不便.

(二)各事件的处理全部由嵌套的程序块组成,视觉上会显示有些乱.如果事件处理代码很长,也会导致阅读与维护上的不便.

(三)当工具栏,菜单栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致了代码不够简洁.

 

第二种:命名内部类的写法

事件代码使用命名内部类的方式,可以解决匿名内部类存在的问题.首先,事件处理代码都集中在一起,并且都具有意义的名称,程序容易阅读与维护:另外,单个的事件处理程序也可以被工具栏,菜单栏等重用.

示例代码如下:

1 public class HelloWorld { 2     private static Text text; 3     public static void main(String[] args) { 4         // 创建一个典型的SWT应用程序的步骤 5         // display负责管理实践循环和控制UI县城和其他线程之间的通信 6         Display display = Display.getDefault(); // 1.创建一个Display 7         Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口) 8         shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小) 9         shell.setText("SWT Application");10 11         text = new Text(shell, SWT.BORDER);12         text.setBounds(71, 90, 76, 21);13         // 加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象14         text.addMouseListener(new MyMouseDoubleClick());15 16         // 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)17         shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口18         shell.layout();// shell应用界面布置19         // 6.写一个事件转发循环.20         while (!shell.isDisposed()) {
// 如果主窗口没有关闭,则一直循环21 if (!display.readAndDispatch()) {
// 如果display不忙22 display.sleep();// display休眠23 }24 }25 }26 // 定义一个名为MyMouseDoubleClick的内部类27 private static final class MyMouseDoubleClick extends MouseAdapter {28 @Override29 public void mouseDoubleClick(MouseEvent e) {30 MessageDialog.openInformation(null, "", "HelloWorld");31 }32 }33 }

第三种外部类实现的方式.

这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java中拿出去,单独写成一个类文件.

这种写法有和命名内部类一样的优点.但因为要单独写成一个文件,写起来会麻烦一些.实现代码如下:

HelloWorld3.java

1 public class HelloWorld3 { 2  3     private static Text text; 4  5     public static void main(String[] args) { 6         // 创建一个典型的SWT应用程序的步骤 7         // display负责管理实践循环和控制UI县城和其他线程之间的通信 8         Display display = Display.getDefault(); // 1.创建一个Display 9         Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口)10         shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小)11         shell.setText("SWT Application");12 13         text = new Text(shell, SWT.BORDER);14         text.setBounds(71, 90, 76, 21);15         // 加入鼠标事件监听器,并用下面代码所定义的内部类生成一个对象16         text.addMouseListener(new MyMouseDoubleClick());17 18         // 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)19         shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口20         shell.layout();// shell应用界面布置21         // 6.写一个事件转发循环.22         while (!shell.isDisposed()) {
// 如果主窗口没有关闭,则一直循环23 if (!display.readAndDispatch()) {
// 如果display不忙24 display.sleep();// display休眠25 }26 }27 }28 29 }

MyMouseDoubleClick.java

1 public class MyMouseDoubleClick extends MouseAdapter {2 3     @Override4     public void mouseDoubleClick(MouseEvent e) {5         MessageDialog.openInformation(null, "", "HelloWorld");6     }7 }

第四种写法:实现监听接口的写法:

将HelloWorld类实现MouseListener接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更及简洁.

这种方式适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用.

这种方式还有一个要注意的地方:事件方法和其他方法混合在了一起,容易引起误读,所以应该在事件方法前加入详细的注释说明.

实现MouseListener接口要写的事件方法多一些,当然没有用的事件方法可以空实现,如果继承MouseListener接口的适配器MouseAdaper

则只写需要的方法就行了.(这就是MouseAdapter的这种类的好处和优点)

另外要注意:只有接口才能有多继承的特性.所以如果HelloWorld已经是某个类的子类.就只能用实现接口的方式,而不能继承接口的适配器了.

1 public class HelloWorld4 extends MouseAdapter {
// 或者implements MouseListener 2 private static Text text; 3 public static void main(String[] args) { 4 HelloWorld4 hw4 = new HelloWorld4(); 5 // 创建一个典型的SWT应用程序的步骤 6 // display负责管理实践循环和控制UI县城和其他线程之间的通信 7 Display display = Display.getDefault(); // 1.创建一个Display 8 Shell shell = new Shell();// 2.创建一个或者多个Shell(shell是程序的主窗口) 9 shell.setSize(450, 300);// 3.设置Shell的布局(设置主窗口的大小)10 shell.setText("SWT Application");11 12 Text text1 = new Text(shell, SWT.BORDER);13 14 text1.addMouseListener(hw4);//这个地方参考书中是用的this关键字,这个addMouseListener()中要传的是一个监听器对象.我就用的new出来的对象.15 text1.setBounds(71, 90, 76, 21);16 17 // 4.创建Shell中的组件(这个例子中没有加入组件,只是一个空窗口)18 shell.open();// 5.用Open()方法打开Shell窗口 打开shell主窗口19 shell.layout();// shell应用界面布置20 // 6.写一个事件转发循环.21 while (!shell.isDisposed()) {
// 如果主窗口没有关闭,则一直循环22 if (!display.readAndDispatch()) {
// 如果display不忙23 display.sleep();// display休眠24 }25 }26 }27 @Override28 public void mouseDoubleClick(MouseEvent e) {29 MessageDialog.openInformation(null, "", "HelloWorld");30 }31 }

 

总结:

匿名内部类方式写起来要方便些.但不适合事件代码太长,太多的情况.

从代码书写,阅读,维护以及程序的可扩展性角度来看,命名内部类写法最为值得推荐.

外部类的写法主要是为了代码重用才考虑使用,如果包(package)外的类要用到此事件处理代码,这时外部类就派上用场了.

而第四种写法,要求组件都可以共用事件代码时才能使用.

转载于:https://www.cnblogs.com/DreamDrive/p/4159672.html

你可能感兴趣的文章
JavaScript面向对象轻松入门之多态(demo by ES5、ES6、TypeScript)
查看>>
【数据结构】线性表(一):顺序列表
查看>>
利用Mallet工具自动挖掘文本Topic
查看>>
Windows下oracle打补丁步骤
查看>>
Python教程(一)Python简介
查看>>
asp.net forms认证
查看>>
Hadoop 公平调度器算法调度解析
查看>>
Linux Foundation(笔记)
查看>>
Java学习第二十五天
查看>>
vim配置
查看>>
ubuntu 把软件源修改为国内源和更新
查看>>
随机产生四则运算,导入导出文件
查看>>
位运算符
查看>>
winform自定义控件
查看>>
C#编码好习惯
查看>>
避其锋芒,侧翼出击。——司马亮创业回忆录(一)
查看>>
scope
查看>>
一起谈.NET技术,晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo
查看>>
一起谈.NET技术,.Net Framework源代码中的模式之Prototype(原型模式)
查看>>
[shell 命令] find 查找文件
查看>>