20120509 GEF 中双击事件的捕获及使用

之间已经讲过了 policy和command之间的关系20120212 关于gef的part,policy浅析http://blog.csdn.net/superbsoftware/article/details/7252226

在那里面主要介绍的是GEF自带的一些policy。但是如果是我们自己需要的事件怎么办呢。

下面我以双击事件为例给大家介绍一下。

首先,更具之前的介绍我们需要先写一个能够接受我们需要的事件的policy:

public class ChangePropertyPolicy extends AbstractEditPolicy {

@Override
public Command getCommand(Request request) {
if (RequestConstants.REQ_OPEN.equals(request.getType()))
return getChangeProperCommand(request);
return null;
}


public Command getChangeProperCommand(Request request) {
......
}
}

这个很简单只要继承AbstractEditPolicy并重写一下他的getCommand方法就可以了。当然了还要写对这个消息的处理就是双击后要做的事情。

写完之后我们需要把这个policy安装到我们的part中

@Override
protected void createEditPolicies() {

...
installEditPolicy("myPolicy", new ChangePropertyPolicy());
super.createEditPolicies();
}

按照常规弄好后运行。当然了还有command,但是command不是重点,我主要是想介绍捕捉消息。

但是运行的时候并不想我想象的一样,我的command并没有执行。后来经过调试我发现我的policy都没有被调用,不但policy没有被调用而且我们之前说的

AbstractEditPart 中的getCommand方法也没有被调用。之后我明白了,原来监听机制并不是直接把事件发放到getCommand方法中,而是把一些符合的事件

发过来。所以我们就走进了死胡同,不知道应该干什么呢。

但是作为优秀的java程序员我知道在AbstractEditPart可定会有一个监听机制,没办法只能慢慢的在AbstractEditPart中找。幸好eclipse有提示功能我在提示框中看到了

非常熟悉的performRequest方法,这个是干什么的我就不用说了吧,如果理想的话所有的事件请求都应该通过这个方法传进来。

那么我们就调试呗

@Override
public void performRequest(Request req) {
 if (req.getType().equals(RequestConstants.REQ_OPEN)) {
System.out.println("ok");
}
}

我在eclipse的Request里找了找RequestConstants.REQ_OPEN应该是双击事件。运行程序之后果然可以运行。

然后我们自然是需要调用我们的getCommand:

@Override
public void performRequest(Request req) {
 if (req.getType().equals(RequestConstants.REQ_OPEN)) {
getCommand(req);
}
}

运行后我们的command方法还是没有被执行,我就不和大家卖关子了,getCommand方法只是负责找到command,并检测command是否可以运行(调用command中的canExecute方法),而真正执行需要别的方法,通过调试跟源码我找到了,所以最终的代码是这样:


@Override
public void performRequest(Request req) {
 if (req.getType().equals(RequestConstants.REQ_OPEN)) {
getViewer().getEditDomain().getCommandStack()
.execute
(getCommand(req));
}
}

这样之后我们的command就会被调用了。

给大家看看我的双击效果

因为弄这个功能很麻烦,网上没有现成的东西所以不敢独享,拿来分享

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值