邋遢居

          我的Java天堂

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

          SWT控件中托拽對(duì)象到GEF編輯器中

          一般情況下GEF程序都是采用如下的界面:


          gef.jpg

          新建對(duì)象的操作時(shí)通過拖拽Palette中元素到編輯而獲得。但是有時(shí)候可能需要從SWT,操作系統(tǒng)拖一些元素到GEF編輯器中來。

          下面我就把創(chuàng)建這樣的拖拽過程大概的描述一下:

          1、定義拖拽源(DragSource)。

          2、定義拖拽目標(biāo)的監(jiān)聽(DropTarget)。

          到這里對(duì)于一般的拖拽其實(shí)是可以完工了。

          這個(gè)部分可以參考weidagang2046的專欄的《DND入門學(xué)習(xí)

          但是要能讓GraphicalViewer這個(gè)對(duì)象扮演起DropTarget我們還需要做點(diǎn)其他的工作。GraphicalViewer這個(gè)類本身提供了一個(gè)addDropTargetListener方法??吹竭@個(gè)方法是不是一陣狂喜啊。如果有也是應(yīng)該的,因?yàn)檫@個(gè)方法就是我們解決前面提出問題的關(guān)鍵。

          好了看看他的聲明吧!

          				
          						
          								public void addDropTargetListener(TransferDropTargetListener?listener)
          						
          				
          		

          他這個(gè)參數(shù)居然不是 DropTargetListener 。這個(gè) TransferDropTargetListener 是一個(gè)什么玩意?。?/font>

          help 中查到:

          public interface TransferDropTargetListener
          extends TransferDropTargetListener

          A DropTragetListener that handles one type of SWT Transfer. The purpose of a TransferDropTargetListener is to:

          • Determine enablement for a Drop operation. Enablement is often a function drop location, and/or criteria.

          • When enabled, optionally showing feedback on the DropTarget.

          • Performing the actualy Drop

          DelegatingDropAdapter allows these functions to be implemented separately for unrelated types of Drags. DelegatingDropAdapter then combines the function of each TransferDropTargetListener, while allowing them to be implemented as if they were the only DragSourceListener.

          偷下懶,就不翻譯了。

          創(chuàng)建如下類來實(shí)現(xiàn)這個(gè)接口:

          public class TreeNodeTransferDropTargetListener extends

          AbstractTransferDropTargetListener {


          public TreeNodeTransferDropTargetListener(EditPartViewer editPartViewer) {

          // 改類默認(rèn)是處理 TextTransfer 類型的拖拽事件

          super (editPartViewer,TextTransfer.getInstance());

          // TODO Auto-generated constructor stub

          }


          @Override

          protected void updateTargetRequest() {

          }


          }

          我們這個(gè)拖拽想是讓他執(zhí)行一個(gè) create 命令。所以下面就是要重載他的 createTargetRequest() 用來處理 create 對(duì)象的請(qǐng)求( CreateRequestion )。 CreateRequetion 需要使用到一個(gè)類,幫助我們創(chuàng)建對(duì)象的工廠類。 GEF 給了我們這樣的一個(gè)接口 CreationFactory 。下面我們?nèi)?shí)現(xiàn)他就好了。


          package org.eclipse.gef.examples.shapes.rcp.views;


          import org.eclipse.gef.examples.shapes.model.EllipticalShape;

          import org.eclipse.gef.requests.CreationFactory;


          public class TypeCreationFactory implements CreationFactory {


          public Object getNewObject() {

          // TODO Auto-generated method stub

          EllipticalShape label = new EllipticalShape();

          return label;

          }


          public Object getObjectType() {

          return EllipticalShape. class ;

          }


          }


          注意:這里的 getNewObject 是返回要?jiǎng)?chuàng)建類的一個(gè)對(duì)象實(shí)例。 GetObjectType 需要返回需要?jiǎng)?chuàng)建對(duì)象的類。這個(gè)可不要搞反了。

          這樣我們就可以把我們的 TreeNodeTransferDropTargetListener 類中的 createTargetRequest 方法加上了。


          private TypeCreationFactory factory = new TypeCreationFactory();

          protected Request createTargetRequest() {

          CreateRequest request = new CreateRequest();

          request.setFactory( factory );

          return request;

          }


          好了這個(gè)時(shí)候不要客氣了,加上

          protected void handleDragOver() {

          getCurrentEvent(). detail = DND. DROP_MOVE |DND. DROP_COPY ;

          super .handleDragOver();

          }


          @Override

          protected void handleDrop() {

          //String s = (String)getCurrentEvent().data;

          //factory.setText(s);

          super .handleDrop();

          }

          這樣的方法吧。

          這樣這個(gè)功能就完成了。


          參考文獻(xiàn):

          http://www.aygfsteel.com/weidagang2046/archive/2006/09/05/67707.html

          http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html


          posted on 2006-09-12 17:16 Jet Geng 閱讀(3513) 評(píng)論(7)  編輯  收藏 所屬分類: Eclipse 、GEF

          Feedback

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中 2006-12-29 15:27 過客[匿名]
          如何將視圖中TreeViewer的節(jié)點(diǎn)(每個(gè)節(jié)點(diǎn)都有相應(yīng)的模型對(duì)應(yīng))拖入到編輯器中呢?  回復(fù)  更多評(píng)論
            

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中 2006-12-29 16:31 過客[匿名]
          org.eclipse.gef.examples.shapes.model.EllipticalShape,這個(gè)包在哪個(gè)jar下面,我一直沒有找到,而且在plugin.xml中的"依賴項(xiàng)"中導(dǎo)入了 org.eclipse.gef.examples.shapes,但是,確沒有EllipticalShape這個(gè)類.  回復(fù)  更多評(píng)論
            

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中 2007-01-02 21:39 Jet Geng
          org.eclipse.gef.examples.shapes.model.EllipticalShape 這個(gè)是org.eclipse.gef.examples.shapes中的模型。你在這里http://dev.eclipse.org/viewcvs/indextools.cgi/org.eclipse.gef.examples.shapes/src/org/eclipse/gef/examples/shapes/model/
          可以看到這個(gè)類  回復(fù)  更多評(píng)論
            

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中 2007-01-02 21:44 Jet Geng
          @過客[匿名]
          你可以看看
          http://www.eclipse.org/articles/Article-GEF-dnd/GEF-dnd.html 中的代碼  回復(fù)  更多評(píng)論
            

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中 2007-01-04 17:28 過客[匿名]
          多謝,examples例子我從CVS下載過來了

          對(duì)了,你寫的那兩個(gè)類主要實(shí)現(xiàn)從SWT,操作系統(tǒng)拖一些元素到GEF編輯器中來吧;我按你的例子copy了一份,把handleDragOver和handleDrop方法,加在TreeNodeTransferDropTargetListener類中

          在 ShapesEditor 的configureGraphicalViewer()方法中加入,
          viewer.addDropTargetListener(new TreeNodeTransferDropTargetListener(viewer));

          可是還是不能實(shí)現(xiàn)元素能拖入到編輯器中啊  回復(fù)  更多評(píng)論
            

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中 2007-01-22 15:46 過客[匿名]
          TextTransfer類型,可以用別的類型么?如支持圖片拖放  回復(fù)  更多評(píng)論
            

          # re: 從SWT控件中托拽對(duì)象到GEF編輯器中[未登錄] 2007-08-14 09:51 fly
          在哪里下載例子源碼呀  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 呈贡县| 张家港市| 阿克| 浏阳市| 东莞市| 且末县| 宜城市| 和政县| 安庆市| 田林县| 富蕴县| 乌兰察布市| 富裕县| 海丰县| 巴里| 韶山市| 双柏县| 托里县| 沁源县| 昌平区| 微博| 正宁县| 壤塘县| 吉安县| 嘉义县| 那坡县| 红安县| 宣城市| 大港区| 清镇市| 涞源县| 阿坝县| 浮山县| 察隅县| 集安市| 大姚县| 阿瓦提县| 云龙县| 黄大仙区| 奉新县| 麻城市|