GEF 修改默认的上下左右按键事件[GraphicalViewerKeyHandler]

在GraphicalViewerKeyHandler里面会监听 键盘的上下左右的事件, 效果就是选中下一个界面上的控件. 但, 用户要求改成 给当前选择控件 移动位置. [GEF的对于上下左右的默认处理比较怪, 和一般的编辑器不一样的效果, 用户要求修改是正常的.]

下面贴主要代码:
getGraphicalViewer().setKeyHandler(new GefViewerKeyHandler(getGraphicalViewer()).setParent(this.sharedKeyHandler));


GefViewerKeyHandler 就是继承于GraphicalViewerKeyHandler, 并覆盖了keyPressed方法.
public class GefViewerKeyHandler extends GraphicalViewerKeyHandler {

public GefViewerKeyHandler(GraphicalViewer viewer) {
super(viewer);
}

@Override
public boolean keyPressed(KeyEvent event) {
if ((event.stateMask & SWT.ALT) == 0 && (event.stateMask & SWT.CTRL) == 0 && (event.stateMask & SWT.SHIFT) == 0
&& (event.keyCode == SWT.ARROW_DOWN || event.keyCode == SWT.ARROW_LEFT || event.keyCode == SWT.ARROW_RIGHT || event.keyCode == SWT.ARROW_UP)) {
GraphicalEditPart editPart = getFocusEditPart();

if (editPart instanceof BaseControlEditPart) {
BaseControlModel baseControlModel = ((BaseControlEditPart) editPart).getControlModel();

ChangeBoundsRequest request = new ChangeBoundsRequest(RequestConstants.REQ_MOVE); // 请求事件类型:移动
request.setLocation(new Point(baseControlModel.getX(), baseControlModel.getY())); // 从Model得到移动的初始位置
request.setEditParts(editPart);
Point moveDelta = null;
switch (event.keyCode) { // 下面根据按键 得到对应的移动delta(增量)
case SWT.ARROW_LEFT:
moveDelta = new Point(-5, 0); // 左移5像素
break;

case SWT.ARROW_RIGHT:
moveDelta = new Point(5, 0); // 右移5像素
break;

case SWT.ARROW_UP:
moveDelta = new Point(0, -5); // 上移5像素
break;

case SWT.ARROW_DOWN:
moveDelta = new Point(0, 5); // 下移5像素
break;
}

request.setMoveDelta(moveDelta);
Command command = editPart.getCommand(request);
if (command != null && !(command instanceof UnexecutableCommand)) {
command.execute(); // 触发移动的事件
return true;
}
}
}
return super.keyPressed(event);
}
}



代码很简单,
1. 就是告诉当前选中的EditPart, 说要触发一个RequestConstants.REQ_MOVE的事件,
2. Command command = editPart.getCommand(request);
3. 得到command后, 执行即可command.execute();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值