之间已经讲过了 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就会被调用了。
给大家看看我的双击效果
因为弄这个功能很麻烦,网上没有现成的东西所以不敢独享,拿来分享