Eclipse 插件开发——远离讨厌的ESC

Advertisement

问题描述:

在Eclipse插件开发过程中,都会涉及到“弹出对话框”的问题,今天偶然发现了一个现象:弹出的对话框打开后,再按ESC键,对话框自动就关闭了。后来发现在Eclipse中也是一样的。比如创建一个类的时候,弹出对话框以后按ESC,对话框就直接关闭了。这样设计主要是为了方便用户,可是当我们不需要这样的效果的时候,应该怎么做呢?

问题分析:

在Eclipse中,在键盘上按下的每一个键,都会触发相应的事件,Eclipse拦截到事件后,再进行后续的处理。再回到我们上面提到的问题: 既然对话框是在按ESC键后关闭的,那我们很自然的想到:如果能够屏蔽按下ESC键触发的事件,对话框应该就不会关闭了。

解决方案:

经过上面的分析,问题已经清楚了:为了解决这个问题,我们需要搞定下面的两件事儿:

1、找到按ESC时触发的事件;

2、拦截这个事件,不让事件生效(相当于用户没按ESC)。

感谢万能的Google大神,我们找到了这个接口:TraverseListener。上源码:

/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.events;

import org.eclipse.swt.internal.SWTEventListener;

/**
 * Classes which implement this interface provide a method
 * that deals with the events that are generated when a
 * traverse event occurs in a control.
 * <p>
 * After creating an instance of a class that implements
 * this interface it can be added to a control using the
 * <code>addTraverseListener</code> method and removed using
 * the <code>removeTraverseListener</code> method. When a
 * traverse event occurs in a control, the keyTraversed method
 * will be invoked.
 * </p>
 *
 * @see TraverseEvent
 */
public interface TraverseListener extends SWTEventListener {

/**
 * Sent when a traverse event occurs in a control.
 * <p>
 * A traverse event occurs when the user presses a traversal
 * key. Traversal keys are typically tab and arrow keys, along
 * with certain other keys on some platforms. Traversal key
 * constants beginning with <code>TRAVERSE_</code> are defined
 * in the <code>SWT</code> class.
 * </p>
 *
 * @param e an event containing information about the traverse
 */
public void keyTraversed(TraverseEvent e);
}

从描述中可以看出,这个接口是专门用来监听特殊按键的。具体的信息大家可以自己去看SWT的源码。

第一个问题已经解决,我们看看怎么样拦截ESC:

public void keyTraversed(TraverseEvent e) {
    if(e.detail == SWT.TRAVERSE_ESCAPE){
        e.doit = false;
    }
}

根据detai可以判断出来按下的是ESC,然后将doti设定为false就可以了。

拦截ESC的代码已经有了,还剩最后一个问题:监听器只有注册了之后才能生效,那这个监听器我们在哪里注册呢?

还是看源码,在面板类Composite以及Shell中,提供了接口addTraverseListener,通过这个借口,我们就可以注册监听器了。

总结:

1、在创建页面的时候,我们可以在将监听器注册到根面板(root composite)中;

2、如果页面是通过继承Dialog类来实现,可以在createDialogArea方法中注册监听;

3、如果页面作为向导页(继承WizardPage),可以在createControl方法中注册监听。

声明:

文章来自于ITeye,欢迎访问我的博客:xiaoyu1985ban.iteye.com

ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。

Similar Posts:

  • Eclipse插件开发·玄乎(一)?

    最近比较闲,所以突然摆弄上了Eclipse的插件.之所以会摆弄上这个东西,该从上个月说起: 上个月,在向老大申请加薪未果的情况下,心情比较郁闷,冒出了跳槽的念头.于是乎,就在几家招聘网上家登记了自己的简历.按照写简历的"没有的写有,有的尽量夸大"的原则,我把我以前实习的时候做Eclipse的rcp的经历写上去了,当然难免写的内容比实际夸张了点. 出乎我的意料,居然有两家公司主动找上门来,而且看中的竟然是我做过rcp的开发,还都说自己公司都想开发一个基于Eclipse的开发平台,现在需要

  • eclipse插件开发的打包

    eclipse插件开发的打包 DEPLOYABLE PLUG-IN AND FRAGMENTS 2. 输入 DIRECTORY ,则会在此目录下生成D:/plugin/plugins/XX.JAR

  • Eclipse插件开发学习建议

    介绍 本文适用于那些想要学习Eclipse插件开发,但是不知道从何下手的人. 必要的技能 查看原文:http://surenpi.com/2016/05/23/eclipse_plugin_dev_learn_intro/

  • eclipse插件开发之控制台输出乱码问题

    首先建立自己的console控制台网上有很多这种例子,javaEye上的一位朋友写的很详细这里贴出来: http://lengbingteng-163-com.iteye.com/blog/1116984 还有一篇也不错,很实际: Eclipse插件开发之建立Console视图并在其中显示自定义信息 这篇文章连接子:http://www.blogjava.net/hengheng123456789/archive/2006/11/29/84343.html 虽然能够建立一个自定义的console

  • Eclipse插件开发(原书第3版)

    Eclipse插件开发(原书第3版) 基本信息 原书名: Eclipse Plug-ins (3rd Edition) 原出版社: Addison-Wesley Professional 作者: (美)Eric Clayberg Dan Rubel 译者: 陈沛 丛书名: 开发人员专业技术丛书 出版社:机械工业出版社 ISBN:9787111303367 上架时间:2010-6-17 出版日期:2010 年5月 开本:16开 页码:551 更多精彩信息查看:http://www.china-pu

  • Eclipse插件开发(第3版)例子

    关键字:Eclipse插件开发例子

  • Eclipse插件开发中实现刷新和重编译

    下载本文示例代码 本文转自javablog,文中内容不代表本站观点,仅提供参考. 在做eclipse插件开发中,特别是自动生成代码或者uml->代码的插件中,有时需要刷新一下文件夹或者重新编译一下.那如何实现这两个操作呢. 一.实现刷新 1.一个关键的接口是org.eclipse.core.resources.IResource 调用这个接口的refreshLocal方法即可.例如refreshLocal(IResource.DEPTH_INFINITE, null) 2.到底有哪些类实现了这个

  • Eclipse插件开发中对于外部Jar包和类文件引用的处理(彻底解决插件开发中的NoClassDefFoundError问题)

    目的:Eclipse插件开发中,经常要引用第三方包或者是引用其他插件中的类,由于插件开发环境引用类路径的设置和运行平台引用类路径的设置不同,经常导致开发过程OK,一旦运行则出现NoClassDefFoundError的问题.本文的目的是全面分析各种情况下类路径的设置,以避免这个问题的出现. 说明:Jar包和类路径实际上是一个概念,比如类com.bbebfe.Test.class打包为test.jar包,添加类引用就直接添加test.jar包.而如果是添加类文件路径,则添加包目录的上级目录,比如l

  • eclipse插件开发,RCP开发常识

    基于eclipse进行插件或者rcp程序开发,需要了解一些基础知识,例如OSGI,swt,jface,EMF,GMF等概念. OSGI简介 OSGi技术是面向Java的动态模型系统.OSGi服务平台向Java提供服务,这些服务使Java成为软件集成和软件开发的首选环境.Java提供在多个平台支持产品的可移植性.OSGi技术提供允许应用程序使用精炼.可重用和可协作的组件构建的标准化原语.这些组件能够组装进一个应用和部署中. SWT简介 SWT(Standard Widget Toolkit) St

  • (转)Eclipse插件开发之基础篇(1)下

    4.工作区和资源API 在Eclipse中使用工作区作为开发人员的作业区域.工作区是在Eclipse启动时指定的一个物理文件夹.开发人员在Eclipse上生成工程.创建文件等操作都会在工作区指定的文件夹内生成实际的文件. 工作区内的资源在Eclipse内部使用org.eclipse.core.resources包中定义的虚拟对象进行操作,例如工程是IProject.文件夹是IFolder.文件时IFile. 图1-4 工作区内的资源 在插件开发的时候很多情况都会使用到工作区内的文件或者文件夹.这

Tags: