posts - 20, comments - 16, trackbacks - 0, articles - 0

SWT/JFace 事件的四种写法(转)

Posted on 2008-01-04 16:15 Raul Gong 阅读(757) 评论(0)  编辑  收藏 所属分类: eclipse
转自: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()中,写下了这个类的代码,这就是所谓的匿名内部类。

缺点:

  1. 由于事件处理,代码会随着组件一起分散到代码中的各个部分,不集中,导致阅读和维护的不便。
  2. 各事件的处理全部由嵌套的程序块组成,视觉上很乱,如果事件处理代码很长,也会导致阅读和维护不便。
  3. 当菜单栏,工具栏等也需要处理相同的用户行为时,无法重用事件中的处理代码,导致代码不够简洁。
  • 命名内部类写法

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

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(
500375);
        shell.setText(
"SWT Application");
        shell.open();

        Text HelloWorldText 
= new Text(shell, SWT.BORDER);
        HelloWorldText.addMouseListener(
new HelloWorld());
        HelloWorldText.setText(
"HelloWorld");
        HelloWorldText.setBounds(
526834929);
        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方法: 失去焦点时触发。


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问