首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

给GEF拖放效能

2012-07-03 
给GEF拖放功能本文来自刘刚的博客?我们知道SWT支持Native的拖放。GEF使用SWT的拖放来实现自己的拖放功能。不

给GEF拖放功能

本文来自刘刚的博客

?

我们知道SWT支持Native的拖放。GEF使用SWT的拖放来实现自己的拖放功能。不过不需要像SWT中需要定义DragSource和DropTarget。在GEF中,我们只需要继承AbstractTransferDragSourceListener来实现拖放源;继承AbstractTransferDropTargetListener来实现放置地

?

?

public class FileDropTargetListener extends AbstractTransferDropTargetListener {        public FileDropTargetListener(EditPartViewer viewer, Transfer xfer) {          super(viewer, xfer);      }        public FileDropTargetListener(EditPartViewer viewer) {          super(viewer, FileTransfer.getInstance());      }        @Override      protected void updateTargetRequest() {        }  }  

?

?

上面我们已经说过:GEF中的拖放是借助SWT中的拖放来实现的,而在SWT中,我们需要给出拖放所支持的Transfer的类型。所以需要注意的是,我们在构造函数中也要给出Transfer类型。

?

OK,接下来,我们首先要做的就是创建一个request。我们知道GEF中都是通过处理一个个request来完成model的修改的。我们的目的是每拖进一个文件,就在放置的位置点上创建一个Homuncule模型。

?

在FileDropTargetListener中,重写以下方法:

?

?

@Override  protected Request createTargetRequest() {      CreateRequest request = new CreateRequest();      request.setFactory(factory);      return request;  } 
?

这里之所以需要一个CreateRequest,是因为在getCreateCommand(CreateRequest)中需要一个CreateRequest参数。

?

request中有五个set方法,不过这里我只需要setFactory(Factory)方法。这里的factory需要继承自:CreationFactory。

?

所以接下来实现我们的CreationFactory,如下:

?

?

public class HomunculeCreateFactory implements CreationFactory {        String text;      public Object getNewObject() {          Homuncule homuncule = new Homuncule(ColorConstants.red,text);          return homuncule;      }        public Object getObjectType() {          return Homuncule.class;      }        public void setText(String text){          this.text = text;      }  }  
?

这里getNewObject()就返回一个新建的对象,我们知道通过在getCreateCommand()方法中,会调到request.getNewObject(),那个返回的对象就是这个factory中返回的对象。(不过在我的例子中其实可以不用的,因为我的对象是在command实现中自己构建的)

?

在FileDropTargetListener的createTargetRequest()方法中,用到了一个变量factory,现在我们就可以给出这个factory了,如下:

?

?

private HomunculeCreateFactory factory = new HomunculeCreateFactory();  
?

最后在我们的Editor的configureGraphicalViewer()中加上一条:

?

?

getGraphicalViewer().addDropTargetListener(                  new FileDropTargetListener(getGraphicalViewer())); 

?

OK,我们已经完成了一个GEF拖放的实现。

?

你可以通过重写DragTarget里提供的那几个drop方法来修改你的拖放方式、拖放后的实现等等!

?

?

?

?

热点排行