注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

隐龙 为了一生的信念

今日默默沉于水,他日飞腾在九天...

 
 
 

日志

 
 

eclipse swt / jface 中事件的四种写法  

2012-09-19 09:58:44|  分类: 开发工具 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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方法: 失去焦点时触发。

  评论这张
 
阅读(513)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018