Eclipse 插件开发——远离讨厌的ESC
?
?问题描述:
?
?????? 在Eclipse插件开发过程中,都会涉及到“弹出对话框”的问题,今天偶然发现了一个现象:弹出的对话框打开后,再按ESC键,对话框自动就关闭了。后来发现在Eclipse中也是一样的。比如创建一个类的时候,弹出对话框以后按ESC,对话框就直接关闭了。这样设计主要是为了方便用户,可是当我们不需要这样的效果的时候,应该怎么做呢?
?
问题分析:
?????? 在Eclipse中,在键盘上按下的每一个键,都会触发相应的事件,Eclipse拦截到事件后,再进行后续的处理。再回到我们上面提到的问题:?既然对话框是在按ESC键后关闭的,那我们很自然的想到:如果能够屏蔽按下ESC键触发的事件,对话框应该就不会关闭了。?????
?
解决方案:
?????经过上面的分析,问题已经清楚了:为了解决这个问题,我们需要搞定下面的两件事儿:
???? 1、找到按ESC时触发的事件;
???? 2、拦截这个事件,不让事件生效(相当于用户没按ESC)。
???? 感谢万能的Google大神,我们找到了这个接口:TraverseListener。上源码:
????
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方法中注册监听。
???