GEF-通过绑定键盘事件实现快捷键功能

原创 2014年02月16日 01:03:26

本文中涉及到的例子可以在以下URL下载。导入eclipse项目即可,我的环境的Eclipse4.3.1

http://download.csdn.net/detail/hoslay1/6925761

如果有问题请联系我QQ:195307039说明来意即可。

以下Editor代表外部的编辑器,EditPart代表GEF的EditPart



GEF中如果希望在画板上通过快捷键来操作EditPart如:delete或者Ctrl+Z等等

可以通过KeyHandler来实现,以下是实现方式:

在Editor的configureGraphicalViewer方法中,创建一个KeyHandler对象,并设置其与Action的绑定,最后将KeyHandler对象设置到viewer上。

@Override
	protected void configureGraphicalViewer() {
		super.configureGraphicalViewer();
		
		viewer = getGraphicalViewer();
		
		//设置partFactory
		viewer.setEditPartFactory(new PartFactory());
		//创建键盘处理的句柄
		KeyHandler keyHandler = new KeyHandler();
		//按delete时删除action,发起DELETE类型的事件,然后捕获
		keyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), getActionRegistry().getAction(GEFActionConstants.DELETE));
		//按F2时编辑
		keyHandler.put(KeyStroke.getPressed(SWT.F2, 0), getActionRegistry().getAction(GEFActionConstants.DIRECT_EDIT));
		//按Ctrl+Z撤销
		keyHandler.put(KeyStroke.getReleased('',122,SWT.CTRL), getActionRegistry().getAction(GEFActionConstants.UNDO));
		//按Ctrl+Y反撤销
		keyHandler.put(KeyStroke.getReleased('',121,SWT.CTRL), getActionRegistry().getAction(GEFActionConstants.REDO));
		//按Ctrl+A全选
		keyHandler.put(KeyStroke.getReleased('',97,SWT.CTRL), getActionRegistry().getAction(GEFActionConstants.SELECT_ALL));
		//按F3弹出一个dialog,快捷键也可以基于此类的实现或者是GraphicalViewerHandler
		//keyHandler.put(KeyStroke.getPressed(SWT.F3, 0), getActionRegistry().getAction("TestDialog"));
		
//		GraphicalViewerKeyHandler可实现自定义快捷键以及键盘移动等功能
		
		viewer.setKeyHandler(keyHandler);
	}

keyHandler的put方法就是将键盘行为与action进行绑定
KeyStroke.getPressed取得的是某个单键按下的行为
KeyStroke.getReleased取得的是组合按键按下的行为
getActionRegistry().getAction可以取得在这个Editor上生效的Action
最后viewer.setKeyHandler(keyHandler);将这组绑定设置到viewer上

DIRECT_EDITAction定义在当前Editor中,而其它的Action定义在父类GraphicalEditor中

Action必须要先创建并且注册才能在这里被取出来

这里贴上父类的代码:

protected void createActions() {
		ActionRegistry registry = getActionRegistry();
		IAction action;

		action = new UndoAction(this);
		registry.registerAction(action);
		getStackActions().add(action.getId());

		action = new RedoAction(this);
		registry.registerAction(action);
		getStackActions().add(action.getId());

		action = new SelectAllAction(this);
		registry.registerAction(action);

		action = new DeleteAction((IWorkbenchPart) this);
		registry.registerAction(action);
		getSelectionActions().add(action.getId());

		action = new SaveAction(this);
		registry.registerAction(action);
		getPropertyActions().add(action.getId());

		registry.registerAction(new PrintAction(this));
	}

GEFActionConstants.DELETE等就是这些Action的ID属性,通过这个ID属性就能找到这个Action,自定义的Action的获取就能通过那个ID。

相关文章推荐

ExtJS监听键盘事件:回车键实现登录功能

ExtJS为我们封装了完整的键盘监听事件,我们只要调用相应的接口就能完美的实现键盘监听。在所有的键盘事件中,按回车键提交表单,实现登录的功能是我们最常用到的键盘监听事件,下面李坏给出一个实现回车键提交...

绑定focus事件的函数里绑定键盘事件造成的冲突?错误?

折腾了一天,作为前端开发初学者,来写篇心得和笔记咯。 有些时候,简单的代码蕴涵了深奥的语法规则,或者浏览器引擎的原理,当然,具体什么原理,到现在也还没搞清楚,知道的人可以q我247069512,谢谢...

在linux下C语言实现对键盘事件的监听

我们知道,在windows下有个键盘测试函数,int kbhit(void)。使用该函数需要包含头文件conio.h。执行时,kbhit测试是否有键盘按键按下,若有则返回非零值,否则返回零。 在...

Python实现鼠标、键盘事件的记录

前几天看PHP的框架的时候,发现了一个强大的叫Hook(钩子)的东西,可以挂在系统的挂钩点上由系统自动运行钩子函数。搞懂PHP的钩子怎么用后,马上google了一下Python是不是也有类似Hook的...

点击textField,监听键盘事件实现页面上移

实现效果如题:点击textField,监听键盘事件实现页面上移方案一:通用型1、监听键盘事件 [[NSNotificationCenter defaultCenter]addObserver:s...
  • zcl_666
  • zcl_666
  • 2017年05月10日 11:35
  • 142

Android键盘事件处理例子

  • 2015年02月19日 23:31
  • 3.36MB
  • 下载

GTK进阶学习:键盘事件 源代码

  • 2015年01月27日 14:51
  • 4KB
  • 下载

java编写程序实现键盘钢琴,运用键盘事件、鼠标事件

java编写程序实现键盘钢琴,运用键盘事件、鼠标事件

android键盘事件实例

  • 2013年08月15日 15:34
  • 67KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GEF-通过绑定键盘事件实现快捷键功能
举报原因:
原因补充:

(最多只允许输入30个字)