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。

GEF初学者指南

1 必须具备知识:在学习GEF之前必须了解Eclipse这个平台的架构体系,所以先讲述Eclipse平台的架构体系.1.1 Eclipse架构体系:图表 1 1 eclipse架构体系正如上面所叙述:...
  • chinayuan
  • chinayuan
  • 2006年01月22日 09:25
  • 4962

GEF事件流程

详细的事件流程: 1. 用户点击相关可视化控件,发出鼠标或者键盘的事件. 2. SWT Control 捕获到键盘或者鼠标的事件?参考SWT的Canvas接口(SWT Events). 3. 然后将事...
  • ITsenlin
  • ITsenlin
  • 2009年09月28日 14:44
  • 525

GEF Programmers' Guide 中文版(GEF 交互操作)

GEF中的交互类型这一节我们将讲述GEF框架中包含的各种交互操作和每个交互操作相关联的组件。交互可以是任何影响模型或者UI界面状态的行为。许多交互是可视化的,也有一些不能图形化地显示。交互可能包含一下...
  • salever
  • salever
  • 2010年07月08日 10:48
  • 2201

原生js实现必应自动搜索功能(事件绑定和事件代理和键盘事件),亲测chrome实现

bing search body{background-color: #333;} .bg-div{position:relative;background-image: url(../riv...
  • u014041540
  • u014041540
  • 2016年09月13日 18:12
  • 750

GEF 一篇不错的文章

1.Draw2D技术 轻量级框架:轻量级框架[LightweightSystem类]把SWT和Draw2D 连接起来,它把鼠标事件和画图事件从SWT 转发给Draw2D的图形上。它是Draw2D的核...
  • soszou
  • soszou
  • 2012年10月19日 17:02
  • 2524

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

本文中涉及到的例子可以在以下URL下载。导入eclipse项目即可,我的环境的Eclipse4.3.1  http://download.csdn.net/detail/hoslay1/692568...
  • hoslay1
  • hoslay1
  • 2014年02月16日 01:03
  • 1306

ueditor 中监听键盘事件

contentUE.addListener('ready', function(){ UE.dom.domUtils.on(contentUE.window,'keydown', fun...
  • jqriyv_wl
  • jqriyv_wl
  • 2016年09月22日 14:10
  • 864

vue的键盘事件直接绑定无效?

vue键盘事件
  • Bright2017
  • Bright2017
  • 2017年10月12日 11:42
  • 501

使用angularjs的键盘事件来增强用户体验

绑定键盘事件(尤其注意:不能用a标签,不然会失效) 推荐button 方法一:ng内置指令 "login()" ng-keypress="todoSomething($event)"...
  • u013184759
  • u013184759
  • 2016年08月05日 09:18
  • 3737

SWT 模拟键盘事件

SWT 模拟键盘事件导言    在GUI设计中,我们往往要模拟鼠标和键盘事件,在java 的awt 中的java.awt.Robot; 类就可以进行模拟。但是在SWT中,我尝试了一下,会抛出空指针异...
  • Sino_Crazy_Snail
  • Sino_Crazy_Snail
  • 2017年12月26日 17:22
  • 40
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GEF-通过绑定键盘事件实现快捷键功能
举报原因:
原因补充:

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