我不知道大家有没有这样的体验:其实软件使用者要求的东西都很基本,而现在软件做得越来越复杂,有相当大一部分是在于软件开发者把自己的注重力放在了一些附加功能(这些功能可能让用户感到惊喜,但是假如没有它们用户也不会不满足)上,而真正用户的要求却得不到满足。所以大家在设计程序的时候,一定要明白,有时候简单就是一种美,把时间花费到真正有价值的地方去。
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.OKSWT.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方法添加了代码,并在其中创建了一个对话框。
假如总结一下,我们可以得出处理事件的几个步骤:
1. 针对你所处理的事件,找出合适的XyzListener接口
2. 编写一个新的类,这个类实现了XyzListener接口
3. 在你所感爱好的事件中编写处理代码,而对于那些你不感爱好的方法可以让它们保持空白(就像实例中的widgetDefaultSelected()方法)一样
让事件处理更加简单:使用适配器(adapter)
有时候我们可能会感觉这样仍然不够简单,比如我只对SelectionListener中的widgetSelected()方法感爱好,但是为了能够通过编译器的编译,我却不得不写一个空白的widgetDefaultSelected()方法(因为SelectionListener是一个接口,你必须实现它所有的方法)。
幸运的是,swt帮我们解决了这个问题,途径就是使用adapter。在swt中,对应于一个XyzListener都有一个XyzAdapter,adapter都是抽象类并且实现了对应的listener接口,它为对应listener接口中的每个方法都定义了一个默认实现(基本上就是什么都不做),我们在使用时候只需要override掉自己感爱好的方法就可以了。
结合上一小节中的代码,假如使用SelectionAdapter代替SelectionListener的话,我们的代码就可以这样写: