转自:
http://blog.csdn.net/yjyvsdream/archive/2007/04/05/1552978.aspx
好像楼主也是转自《Eclipse 从入门到精通》,非常感谢ChenGang。
SWT/JFace 事件的四种写法
SWT 的事件模型和 JAVA 标准的 AWT 基本一样的。下面将按照,事件的四种写法来实现它。下面的代码都是和上一个学习笔记里的小例子变化来的。
在原来代码行"HelloWorldText = new Text(shell, SWT.BORDER);"下面插入如下的代码:
HelloWorldText.addMouseListener(new MouseAdapter()...{
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello world");
}
});
new MouseAdapter(); 就是一个匿名内部类。 我们建立了一个继承于MouseAdapter的类,但并没有给这个类命名,并且没有用通常的写法,而是直接在HelloWorldText.addMouseListener()中,写下了这个类的代码,这就是所谓的匿名内部类。
缺点:
- 由于事件处理,代码会随着组件一起分散到代码中的各个部分,不集中,导致阅读和维护的不便。
- 各事件的处理全部由嵌套的程序块组成,视觉上很乱,如果事件处理代码很长,也会导致阅读和维护不便。
- 当菜单栏,工具栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致代码不够简洁。
事件代码使用命名内部类的方式,可以解决匿名内部类的存在的问题, 首先,事件处理代码都集中在一起,并具有有意义的名字,程序容易阅读和维护;另外单个事件的处理程序也可以被工具栏,菜单栏等重用。代码如下:
public class HelloWorld ...{
private static Text HelloWorldText;
public static void main(String[] args) ...{
... ...
HelloWorldText = new Text(shell, SWT.BORDER);
HelloWorldText.addMouseListener(new MyMouseDoubleClick());//引用定义的类
... ...
}
// 定义一个匿名内部类
private static final class MyMouseDoubleClick extends MouseAdapter...{
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello ... ai wo , ni shi wo de !!!");
}
}
}
这种写法和命名内部类有些相似,只不过是将MyMouseDoubleClick类从HelloWorld.java 中拿出去,单独写成一个类文件。代码和命名内部类的相同,我就不重复了。
将HelloWorld 类实现 MouseListener 接口,这样类本身就成了一个监听器,使得加入监听器的代码可以更加的简洁,这种方式适合加入监听器的组件较多,并且要求监听器的事件处理代码可以被组件共用。
实现MouseListener接口要写的事件方法多一些,没有用到的可以为空实现。如果继承MouseListener 接口的适配器MouseAdapter, 则只写需要的方法就可以了。另外需要注意的是,只有接口才有多继承的特性,所以,如果HelloWorld已经是某个类的子类了,就只能用实现接口的方式,而不能继承接口的适配器了。代码如下:
public class HelloWorld implements MouseListener...{ // or extends MouseAdapter
public static void main(String[] args) ...{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
shell.open();
Text HelloWorldText = new Text(shell, SWT.BORDER);
HelloWorldText.addMouseListener(new HelloWorld());
HelloWorldText.setText("HelloWorld");
HelloWorldText.setBounds(52, 68, 349, 29);
shell.layout();
while (!shell.isDisposed()) ...{
if (!display.readAndDispatch())
display.sleep();
}
}
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello ... ai wo de re !!");
}
//if extends MouseAdapter , delete the follow methods
public void mouseDown(MouseEvent e) ...{
}
public void mouseUp(MouseEvent e) ...{
}
}
SWT/JFace 中常用的事件
除了,上面用到的addMouseListener, Eclipse 还有一些常用的监听器,它们在各组件里的使用方法相同(如果该组件支持此种事件),简单介绍如下:
addSelectionListener: 这个监听器最常用。
widgetSelected 方法:当组件被选择(单击鼠标或按回车键)时触发此方法的事件处理程序。
widgetDefaultSelected 方法: 用于某些很少触发选择事件的组件,例如:文本框回车事件,列表框双击事件等。
addKeyListener:
keyPressed 方法:当前焦点停留在组件时,按下键盘任意键时触发,但对于某些组件(如:button),按回车键无法执行此方法。
keyReleased方法: 按键弹起时触发。
addFocusListener
focusGained方法: 得到焦点时触发。
focusLost方法: 失去焦点时触发。