DND入門學(xué)習(xí)
Drag and Drop是Eclipse為用戶在一個或多個SWT應(yīng)用之間重置部件或數(shù)據(jù)傳輸上提供的簡單快捷的機(jī)制。可以使用在普通SWT應(yīng)用中,也是學(xué)習(xí)GEF的基礎(chǔ)部分。下面我從以下幾個Drag and Drop所必需的部分來簡單講述:
DragSource And DropTarget
要實現(xiàn)Drag and Drop,就必須要有DragSource And DropTarget。DragSource是數(shù)據(jù)傳輸過程中的數(shù)據(jù)提供者,而DropTarget是數(shù)據(jù)接收者。他們分別綁定SWT的widget,需要注意的是同一widget只能幫定在一個DragSource或DropTarget上。在鼠標(biāo)拖動的過程中,我們可以通過鼠標(biāo)圖形的變化來得知當(dāng)前經(jīng)過的是否是一個有效的DropTarget,這個過程叫做“drag over effect”。鼠標(biāo)圖形同時也可以告訴我們在數(shù)據(jù)被Drop之后,什么樣的操作會被執(zhí)行,是拷貝還是移動還是別的什么。在windows中有以下幾種鼠標(biāo)圖形:
[attachment=453]?
如果我們drag over一個帶有item的部件,比方說tree或者table,那么item會變成高亮表明我們會將數(shù)據(jù)Drop在這個item上,這個過程我們叫“drag under effect”。
Transfer
有了DragSource 和 DropTarget之后,我們就需要一個載體來承載不同類型的數(shù)據(jù),讓這個載體在DragSource 和 DropTarget之間傳遞數(shù)據(jù)。Transfer實際上是一個提供數(shù)據(jù)在Java representation與platform specific representation之間交互的抽象類.在Java對象與特定的平臺之間進(jìn)行format,下面是幾個format:
TextTransfer String "hello world"?
RTFTransfer String "{\\rtf1\\b\\i hello world}"
FileTransfer String[] new String[] {file1.getAbsolutePath(), file2.getAbsolutePath()}
Transfer是傳輸?shù)妮d體,TransferData真正的利用JNI將數(shù)據(jù)和本地操作系統(tǒng)發(fā)生關(guān)系。TransferData包含了很多特定于平臺的公用的屬性,應(yīng)用不應(yīng)該直接去訪問這些屬性。如果真的有必要去訪問這些屬性,那么我們可以通過擴(kuò)展Transfer類來完成對特定平臺的額外操作。
另外,Transfer不只是可以用在DND中,也可以單獨(dú)拿出來使用,例如實現(xiàn)Clipboard,可以在copy時將數(shù)據(jù)暫存于Clipboard中,past時再取出。這個和DND的在Drag時將數(shù)據(jù)暫存于Clipboard中,Drop時再取出類似。
理解了拖拽的這些概念之后,下面我們就著一個簡單的例子來運(yùn)用一下。如圖所示,這個例子中,左面的tree是DragSource,右面的table是DropTarget,我們從左面的tree中選擇一條,拖進(jìn)右邊的table中:

我們先從DragSource開始:
//獲得一個TextTransfer的實例,TextTransfer是Transfer的一個子類,
//他提供將普通文本以Java String的表示轉(zhuǎn)換為特定于平臺的表示的機(jī)制。
TextTransfer textTransfer=TextTransfer.getInstance();
//構(gòu)造一個普通的tree
dragTree=new Tree(parent,SWT.FULL_SELECTION|SWT.SINGLE);
//將dragTree與DragSource綁定(一個widget只能綁定在一個DragSource),
//并允許數(shù)據(jù)可以從DragSource被MOVE或COPY
DragSource source=new DragSource(dragTree,DND.DROP_MOVE|DND.DROP_COPY);
//指定允許的textTransfer類型,可以是多個。
source.setTransfer(new Transfer[] { textTransfer });
//注冊DragSourceListener。處理拖操作的一些事件
source.addDragListener(new MyDragSourceListener());
在MyDragSourceListener中有以下3個方法:
// 指定拖動開始的執(zhí)行策略。
public void dragStart(DragSourceEvent event){
//在這里可以設(shè)置一些條件,如果不符合條件,比方說選中的treeitem是根,
? ? //則不可拖動
? ? if(treeitem是根){
? event.doit=false;
? ? }
}
//dragSetData方法在dragStart通過之后才被調(diào)用。這個方法可能會因為同一種傳輸
//類型多次set或不同的多種傳輸類型的set而被多次調(diào)用,象windows等有些平臺
//中,dropTarget可以在鼠標(biāo)移動的過程中請求數(shù)據(jù),但是在Motif等平臺中,只可以
//在drop操作完成之后才可以請求數(shù)據(jù),所以在這個方法中不要假設(shè)drag and drop操
//作已經(jīng)完成.在這個方法中是無法知道data將被drop到哪里.
//set的Data也要符合指定的Transfer的format類型。
? ? public void dragSetData(DragSourceEvent event){
? ? //在這里可以為DragSourceEvent添加數(shù)據(jù),這個方法在拖動過程中
//會被不停的調(diào)用
? ? ? ? TreeItem selection = DragAndDrop.this.dragTree.getSelection()[0];
? ? ? ? event.data=selection.getText();
? ? }
? ? // 根據(jù)事先指定好的操作類型來處理操作結(jié)果
? ? public void dragFinished(DragSourceEvent event){
? ? ? ? if(event.detail==DND.DROP_MOVE){
? ? ? ? ? ? //remove selection TreeItem
? ? ? ? }
? ? }
其次是DropTarget
// 將dropTable指定為Drop Target,
? ? DropTarget target=new DropTarget(dropTable,DND.DROP_MOVE|DND.DROP_COPY|DND.DROP_DEFAULT);
? ? target.setTransfer(new Transfer[] {textTransfer });
? ? target.addDropListener(new MyDropTargetListener());
對于MyDropTargetListener
class MyDropTargetListener implements DropTargetListener{
? ? //dragEnter事件在drag and drop動作開始,并且鼠標(biāo)進(jìn)入了target widget的范圍內(nèi)時被調(diào)用。
? ? public void dragEnter(DropTargetEvent event){
? ? ? ? //在dragEnter中應(yīng)用可以定義default operation.如果一個drop target在創(chuàng)建的時候被指定為
? ? ? ? //帶有DND.DROP_DEFAULT,那么在拖動的過程中如果沒有輔助按鍵被按下,則drop target就是DND.DROP_DEFAULT的。
? ? ? ? //應(yīng)用可以通過改變event.detail來指定default operation。如果應(yīng)用沒有具體指定DND.DROP_DEFAULT的操作,
? ? ? ? //平臺會默認(rèn)將DND.DROP_DEFAULT設(shè)置為DND.DROP_MOVE。
? ? ? ? //另外DND.DROP_DEFAULT的值也可以在dragOperationChanged中設(shè)置。
? ? ? ?
? ? ? ? if(event.detail==DND.DROP_DEFAULT){
? ? ? ? ? //給event.detail賦的值必須是event.operations中的一個,event.operations中
? ? ? ? ? //的操作都是DragSource所支持的.
? ? ? ? ? if((event.operations&DND.DROP_COPY)!=0){
? ? ? ? ? ? event.detail=DND.DROP_COPY;
? ? ? ? ? }else{
? ? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? ? }
? ? ? ? }
? ? ? ?
? ? ? ? //drop target可以選擇性的按照傳輸類型來處理.dragEnter event有兩個屬性
? ? ? ? //event.currentType 是應(yīng)用設(shè)置的默認(rèn)類型,以TransferData對象形式表現(xiàn),
? ? ? ? //event.dataTypes 是drag source支持的所有類型的列表,以TransferData數(shù)組形式表現(xiàn),
? ? ? ? //我們可以將event.currentType設(shè)置成event.dataTypes中的任意一個。
? ? ? ? //這些屬性也可以在dragOver, dragOperationChanged以及dropAccept事件中設(shè)置。
? ? ? ? for(int i=0;i<event.dataTypes.length;i++){
? ? ? ? ? if(textTransfer.isSupportedType(event.dataTypes )){
? ? ? ? ? ? event.currentDataType=event.dataTypes ;
? ? ? ? ? ? //只允許COPY
? ? ? ? ? ? if(event.detail!=DND.DROP_COPY){
? ? ? ? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? ? }
? ? ? ? }
? ? }
? ? //dragOver event在光標(biāo)進(jìn)入drop target widget時會被重復(fù)不停的調(diào)用.
? ? //如果光標(biāo)是靜止的,dragOver event依然會有規(guī)則的按一定時間間隔被調(diào)用.
? ? //這個方法一般在drop target是table或tree時用得比較多,可以根據(jù)不同的item而改變操作.
? ? public void dragOver(DropTargetEvent event){
? ? ? ? //event.feedback設(shè)置當(dāng)widget處于光標(biāo)下時應(yīng)該給用戶一個什么樣的feedback.
? ? ? ? //dragOver event.feedback 值描述
? ? ? ? //DND.FEEDBACK_SELECT 使光標(biāo)下的item被選中,限于table and trees.
? ? ? ? //DND.FEEDBACK_SCROLL 使widget可以滾動以便于用戶可以drop在當(dāng)前看不見的item上,限于table and trees.
? ? ? ? //DND.FEEDBACK_EXPAND 使當(dāng)前光標(biāo)下的item展開以便于用戶在sub item上drop,限于trees.
? ? ? ? //DND.FEEDBACK_INSERT_BEFORE 在item處于光標(biāo)下之前顯示一個插入標(biāo)記,限于tables and trees.
? ? ? ? //DND.FEEDBACK_INSERT_AFTER ? 在item處于光標(biāo)下之后顯示一個插入標(biāo)記,限于tables and trees.
? ? ? ? //DND.FEEDBACK_NONE ? 沒有任何效果.
? ? ? ? event.feedback=DND.FEEDBACK_SELECT|DND.FEEDBACK_SCROLL;
? ? ? ? if(textTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? String t=(String)(textTransfer.nativeToJava(event.currentDataType));
? ? ? ? ? if(t!=null){
? ? ? ? ? ? System.out.println(t);
? ? ? ? ? }
? ? ? ? }
? ? }
? ? //當(dāng)用戶按下或放開輔助按鍵時,例如Ctrl, Shift, Command, Option。則dragOperationChanged事件發(fā)生。
? ? //輔助按鍵可以改變即將進(jìn)行的操作。例如:
? ? //Ctrl key is down, a copy is requested,
? ? //Ctrl and Shift keys are both down, a link is requested
? ? //Shift key is down, a move is requested
? ? //When no modifier keys are pressed, the default operation is requested.
? ? public void dragOperationChanged(DropTargetEvent event){
? ? ? ? if(event.detail==DND.DROP_DEFAULT){
? ? ? ? ? event.detail=DND.DROP_COPY;
? ? ? ? }else{
? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? }
? ? ? ? // allow text to be moved but files should only be copied
? ? ? ? if(fileTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? if(event.detail!=DND.DROP_COPY){
? ? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? ? }
? ? ? ? }
? ? }
? ? //當(dāng)光標(biāo)離開drop target widget時,dragLeave事件發(fā)生. 如果你在dragEnter中分配了一些資源,
? ? //就應(yīng)該在dragLeave中釋放.dragLeave事件在用戶通過Escape鍵取消Drag and Drop操作時也會發(fā)生
? ? //剛好在drop操作被執(zhí)行之前.
? ? public void dragLeave(DropTargetEvent event){
? ? }
? ? //dropAccept事件為應(yīng)用提供了最后一次定義數(shù)據(jù)類型的機(jī)會,定義的數(shù)據(jù)類型將被返回到drop事件.
? ? //這些是通過向event.currentDataType賦event.dataTypes中的值來實現(xiàn)的.
? ? public void dropAccept(DropTargetEvent event){
? ? }
? ? //如果在之前的事件中得到了有效的操作和currentDataType,那么當(dāng)用戶在drop target上松開鼠標(biāo)時,drop事件會發(fā)生。
? ? //event.data屬性包含了請求到的數(shù)據(jù),event.type包含了Transfer的類型.
? ? //data是event.currentDataType中定義的類型.
? ? public void drop(DropTargetEvent event){
? ? ? ? if(textTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? String text=(String)event.data;
? ? ? ? ? TableItem item=new TableItem(dropTable,SWT.NONE);
? ? ? ? ? item.setText(text);
? ? ? ? }
? ? ? ? if(fileTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? String[] files=(String[])event.data;
? ? ? ? ? for(int i=0;i<files.length;i++){
? ? ? ? ? ? TableItem item=new TableItem(dropTable,SWT.NONE);
? ? ? ? ? ? item.setText(files );
? ? ? ? ? }
? ? ? ? }
? ? }
? }
from: http://www.eclipseworld.org/bbs/read.php?tid=893&page=e&fpage=1
DragSource And DropTarget
要實現(xiàn)Drag and Drop,就必須要有DragSource And DropTarget。DragSource是數(shù)據(jù)傳輸過程中的數(shù)據(jù)提供者,而DropTarget是數(shù)據(jù)接收者。他們分別綁定SWT的widget,需要注意的是同一widget只能幫定在一個DragSource或DropTarget上。在鼠標(biāo)拖動的過程中,我們可以通過鼠標(biāo)圖形的變化來得知當(dāng)前經(jīng)過的是否是一個有效的DropTarget,這個過程叫做“drag over effect”。鼠標(biāo)圖形同時也可以告訴我們在數(shù)據(jù)被Drop之后,什么樣的操作會被執(zhí)行,是拷貝還是移動還是別的什么。在windows中有以下幾種鼠標(biāo)圖形:
[attachment=453]?
如果我們drag over一個帶有item的部件,比方說tree或者table,那么item會變成高亮表明我們會將數(shù)據(jù)Drop在這個item上,這個過程我們叫“drag under effect”。
Transfer
有了DragSource 和 DropTarget之后,我們就需要一個載體來承載不同類型的數(shù)據(jù),讓這個載體在DragSource 和 DropTarget之間傳遞數(shù)據(jù)。Transfer實際上是一個提供數(shù)據(jù)在Java representation與platform specific representation之間交互的抽象類.在Java對象與特定的平臺之間進(jìn)行format,下面是幾個format:
TextTransfer String "hello world"?
RTFTransfer String "{\\rtf1\\b\\i hello world}"
FileTransfer String[] new String[] {file1.getAbsolutePath(), file2.getAbsolutePath()}
Transfer是傳輸?shù)妮d體,TransferData真正的利用JNI將數(shù)據(jù)和本地操作系統(tǒng)發(fā)生關(guān)系。TransferData包含了很多特定于平臺的公用的屬性,應(yīng)用不應(yīng)該直接去訪問這些屬性。如果真的有必要去訪問這些屬性,那么我們可以通過擴(kuò)展Transfer類來完成對特定平臺的額外操作。
另外,Transfer不只是可以用在DND中,也可以單獨(dú)拿出來使用,例如實現(xiàn)Clipboard,可以在copy時將數(shù)據(jù)暫存于Clipboard中,past時再取出。這個和DND的在Drag時將數(shù)據(jù)暫存于Clipboard中,Drop時再取出類似。
理解了拖拽的這些概念之后,下面我們就著一個簡單的例子來運(yùn)用一下。如圖所示,這個例子中,左面的tree是DragSource,右面的table是DropTarget,我們從左面的tree中選擇一條,拖進(jìn)右邊的table中:

我們先從DragSource開始:
//獲得一個TextTransfer的實例,TextTransfer是Transfer的一個子類,
//他提供將普通文本以Java String的表示轉(zhuǎn)換為特定于平臺的表示的機(jī)制。
TextTransfer textTransfer=TextTransfer.getInstance();
//構(gòu)造一個普通的tree
dragTree=new Tree(parent,SWT.FULL_SELECTION|SWT.SINGLE);
//將dragTree與DragSource綁定(一個widget只能綁定在一個DragSource),
//并允許數(shù)據(jù)可以從DragSource被MOVE或COPY
DragSource source=new DragSource(dragTree,DND.DROP_MOVE|DND.DROP_COPY);
//指定允許的textTransfer類型,可以是多個。
source.setTransfer(new Transfer[] { textTransfer });
//注冊DragSourceListener。處理拖操作的一些事件
source.addDragListener(new MyDragSourceListener());
在MyDragSourceListener中有以下3個方法:
// 指定拖動開始的執(zhí)行策略。
public void dragStart(DragSourceEvent event){
//在這里可以設(shè)置一些條件,如果不符合條件,比方說選中的treeitem是根,
? ? //則不可拖動
? ? if(treeitem是根){
? event.doit=false;
? ? }
}
//dragSetData方法在dragStart通過之后才被調(diào)用。這個方法可能會因為同一種傳輸
//類型多次set或不同的多種傳輸類型的set而被多次調(diào)用,象windows等有些平臺
//中,dropTarget可以在鼠標(biāo)移動的過程中請求數(shù)據(jù),但是在Motif等平臺中,只可以
//在drop操作完成之后才可以請求數(shù)據(jù),所以在這個方法中不要假設(shè)drag and drop操
//作已經(jīng)完成.在這個方法中是無法知道data將被drop到哪里.
//set的Data也要符合指定的Transfer的format類型。
? ? public void dragSetData(DragSourceEvent event){
? ? //在這里可以為DragSourceEvent添加數(shù)據(jù),這個方法在拖動過程中
//會被不停的調(diào)用
? ? ? ? TreeItem selection = DragAndDrop.this.dragTree.getSelection()[0];
? ? ? ? event.data=selection.getText();
? ? }
? ? // 根據(jù)事先指定好的操作類型來處理操作結(jié)果
? ? public void dragFinished(DragSourceEvent event){
? ? ? ? if(event.detail==DND.DROP_MOVE){
? ? ? ? ? ? //remove selection TreeItem
? ? ? ? }
? ? }
其次是DropTarget
// 將dropTable指定為Drop Target,
? ? DropTarget target=new DropTarget(dropTable,DND.DROP_MOVE|DND.DROP_COPY|DND.DROP_DEFAULT);
? ? target.setTransfer(new Transfer[] {textTransfer });
? ? target.addDropListener(new MyDropTargetListener());
對于MyDropTargetListener
class MyDropTargetListener implements DropTargetListener{
? ? //dragEnter事件在drag and drop動作開始,并且鼠標(biāo)進(jìn)入了target widget的范圍內(nèi)時被調(diào)用。
? ? public void dragEnter(DropTargetEvent event){
? ? ? ? //在dragEnter中應(yīng)用可以定義default operation.如果一個drop target在創(chuàng)建的時候被指定為
? ? ? ? //帶有DND.DROP_DEFAULT,那么在拖動的過程中如果沒有輔助按鍵被按下,則drop target就是DND.DROP_DEFAULT的。
? ? ? ? //應(yīng)用可以通過改變event.detail來指定default operation。如果應(yīng)用沒有具體指定DND.DROP_DEFAULT的操作,
? ? ? ? //平臺會默認(rèn)將DND.DROP_DEFAULT設(shè)置為DND.DROP_MOVE。
? ? ? ? //另外DND.DROP_DEFAULT的值也可以在dragOperationChanged中設(shè)置。
? ? ? ?
? ? ? ? if(event.detail==DND.DROP_DEFAULT){
? ? ? ? ? //給event.detail賦的值必須是event.operations中的一個,event.operations中
? ? ? ? ? //的操作都是DragSource所支持的.
? ? ? ? ? if((event.operations&DND.DROP_COPY)!=0){
? ? ? ? ? ? event.detail=DND.DROP_COPY;
? ? ? ? ? }else{
? ? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? ? }
? ? ? ? }
? ? ? ?
? ? ? ? //drop target可以選擇性的按照傳輸類型來處理.dragEnter event有兩個屬性
? ? ? ? //event.currentType 是應(yīng)用設(shè)置的默認(rèn)類型,以TransferData對象形式表現(xiàn),
? ? ? ? //event.dataTypes 是drag source支持的所有類型的列表,以TransferData數(shù)組形式表現(xiàn),
? ? ? ? //我們可以將event.currentType設(shè)置成event.dataTypes中的任意一個。
? ? ? ? //這些屬性也可以在dragOver, dragOperationChanged以及dropAccept事件中設(shè)置。
? ? ? ? for(int i=0;i<event.dataTypes.length;i++){
? ? ? ? ? if(textTransfer.isSupportedType(event.dataTypes )){
? ? ? ? ? ? event.currentDataType=event.dataTypes ;
? ? ? ? ? ? //只允許COPY
? ? ? ? ? ? if(event.detail!=DND.DROP_COPY){
? ? ? ? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? ? ? }
? ? ? ? ? ? break;
? ? ? ? ? }
? ? ? ? }
? ? }
? ? //dragOver event在光標(biāo)進(jìn)入drop target widget時會被重復(fù)不停的調(diào)用.
? ? //如果光標(biāo)是靜止的,dragOver event依然會有規(guī)則的按一定時間間隔被調(diào)用.
? ? //這個方法一般在drop target是table或tree時用得比較多,可以根據(jù)不同的item而改變操作.
? ? public void dragOver(DropTargetEvent event){
? ? ? ? //event.feedback設(shè)置當(dāng)widget處于光標(biāo)下時應(yīng)該給用戶一個什么樣的feedback.
? ? ? ? //dragOver event.feedback 值描述
? ? ? ? //DND.FEEDBACK_SELECT 使光標(biāo)下的item被選中,限于table and trees.
? ? ? ? //DND.FEEDBACK_SCROLL 使widget可以滾動以便于用戶可以drop在當(dāng)前看不見的item上,限于table and trees.
? ? ? ? //DND.FEEDBACK_EXPAND 使當(dāng)前光標(biāo)下的item展開以便于用戶在sub item上drop,限于trees.
? ? ? ? //DND.FEEDBACK_INSERT_BEFORE 在item處于光標(biāo)下之前顯示一個插入標(biāo)記,限于tables and trees.
? ? ? ? //DND.FEEDBACK_INSERT_AFTER ? 在item處于光標(biāo)下之后顯示一個插入標(biāo)記,限于tables and trees.
? ? ? ? //DND.FEEDBACK_NONE ? 沒有任何效果.
? ? ? ? event.feedback=DND.FEEDBACK_SELECT|DND.FEEDBACK_SCROLL;
? ? ? ? if(textTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? String t=(String)(textTransfer.nativeToJava(event.currentDataType));
? ? ? ? ? if(t!=null){
? ? ? ? ? ? System.out.println(t);
? ? ? ? ? }
? ? ? ? }
? ? }
? ? //當(dāng)用戶按下或放開輔助按鍵時,例如Ctrl, Shift, Command, Option。則dragOperationChanged事件發(fā)生。
? ? //輔助按鍵可以改變即將進(jìn)行的操作。例如:
? ? //Ctrl key is down, a copy is requested,
? ? //Ctrl and Shift keys are both down, a link is requested
? ? //Shift key is down, a move is requested
? ? //When no modifier keys are pressed, the default operation is requested.
? ? public void dragOperationChanged(DropTargetEvent event){
? ? ? ? if(event.detail==DND.DROP_DEFAULT){
? ? ? ? ? event.detail=DND.DROP_COPY;
? ? ? ? }else{
? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? }
? ? ? ? // allow text to be moved but files should only be copied
? ? ? ? if(fileTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? if(event.detail!=DND.DROP_COPY){
? ? ? ? ? ? event.detail=DND.DROP_NONE;
? ? ? ? ? }
? ? ? ? }
? ? }
? ? //當(dāng)光標(biāo)離開drop target widget時,dragLeave事件發(fā)生. 如果你在dragEnter中分配了一些資源,
? ? //就應(yīng)該在dragLeave中釋放.dragLeave事件在用戶通過Escape鍵取消Drag and Drop操作時也會發(fā)生
? ? //剛好在drop操作被執(zhí)行之前.
? ? public void dragLeave(DropTargetEvent event){
? ? }
? ? //dropAccept事件為應(yīng)用提供了最后一次定義數(shù)據(jù)類型的機(jī)會,定義的數(shù)據(jù)類型將被返回到drop事件.
? ? //這些是通過向event.currentDataType賦event.dataTypes中的值來實現(xiàn)的.
? ? public void dropAccept(DropTargetEvent event){
? ? }
? ? //如果在之前的事件中得到了有效的操作和currentDataType,那么當(dāng)用戶在drop target上松開鼠標(biāo)時,drop事件會發(fā)生。
? ? //event.data屬性包含了請求到的數(shù)據(jù),event.type包含了Transfer的類型.
? ? //data是event.currentDataType中定義的類型.
? ? public void drop(DropTargetEvent event){
? ? ? ? if(textTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? String text=(String)event.data;
? ? ? ? ? TableItem item=new TableItem(dropTable,SWT.NONE);
? ? ? ? ? item.setText(text);
? ? ? ? }
? ? ? ? if(fileTransfer.isSupportedType(event.currentDataType)){
? ? ? ? ? String[] files=(String[])event.data;
? ? ? ? ? for(int i=0;i<files.length;i++){
? ? ? ? ? ? TableItem item=new TableItem(dropTable,SWT.NONE);
? ? ? ? ? ? item.setText(files );
? ? ? ? ? }
? ? ? ? }
? ? }
? }
package
?net.advanced.eclipse.sample.views;
import ?org.eclipse.swt.SWT;
import ?org.eclipse.swt.dnd.DND;
import ?org.eclipse.swt.dnd.DragSource;
import ?org.eclipse.swt.dnd.DragSourceEvent;
import ?org.eclipse.swt.dnd.DragSourceListener;
import ?org.eclipse.swt.dnd.DropTarget;
import ?org.eclipse.swt.dnd.DropTargetEvent;
import ?org.eclipse.swt.dnd.DropTargetListener;
import ?org.eclipse.swt.dnd.FileTransfer;
import ?org.eclipse.swt.dnd.TextTransfer;
import ?org.eclipse.swt.dnd.Transfer;
import ?org.eclipse.swt.widgets.Composite;
import ?org.eclipse.swt.widgets.Table;
import ?org.eclipse.swt.widgets.TableColumn;
import ?org.eclipse.swt.widgets.TableItem;
import ?org.eclipse.swt.widgets.Tree;
import ?org.eclipse.swt.widgets.TreeItem;
import ?org.eclipse.ui.part.ViewPart;
/**
?*?@Title:?DragAndDrop.java
?*?@Copyright:
?*?@Company:
?*?@Created?on?2005-12-02?14:34:40
?*? @author ?孫其弘
?*? @version ?$Revision:?1.11?$
?*? @since ?1.0
? */
public ? class ?DragAndDrop? extends ?ViewPart{
???? private ?Tree?dragTree;
???? private ?Table?dropTable;
???? private ?TextTransfer?textTransfer;
???? private ?FileTransfer?fileTransfer;
???? public ? void ?createPartControl(Composite?parent){
???????? /* ?Transfer是一個可以提供數(shù)據(jù)在Java?representation與platform?specific?representation
?????????*?之間交互的抽象類.下面是幾個format:
?????????*?TextTransfer?String?"hello?world"?
?????????*?RTFTransfer?String?"{\\rtf1\\b\\i?hello?world}"?
?????????*?FileTransfer?String[]?new?String[]?{file1.getAbsolutePath(),?file2.getAbsolutePath()}?
?????????*?
?????????*?TransferData包含了很多特定于平臺的公用的屬性,應(yīng)用不應(yīng)該直接去訪問這些屬性。
?????????*?如果真的有必要去訪問這些屬性,那么我們可以通過擴(kuò)展Transfer類來完成對特定平臺的額外操作。
????????? */
????????textTransfer = TextTransfer.getInstance();
????????fileTransfer = FileTransfer.getInstance();
????????dragTree = new ?Tree(parent,SWT.FULL_SELECTION | SWT.SINGLE);
???????? for ( int ?i = 0 ;i < 10 ;i ++ ){
????????????TreeItem?item = new ?TreeItem(dragTree,SWT.NONE);
????????????item.setText( " treeitem " + i);
???????????? for ( int ?i2 = 0 ;i2 < 5 ;i2 ++ ){
????????????????TreeItem?subitem = new ?TreeItem(item,SWT.NONE);
????????????????subitem.setText( " subtreeitem " + i2);
????????????}
????????}
???????? // 將dragLabel指定為DragSource(一個widget只能幫定在一個DragSource),
???????? // 并允許數(shù)據(jù)可以從DragSource被MOVE或COPY
????????DragSource?source = new ?DragSource(dragTree,DND.DROP_MOVE | DND.DROP_COPY);
????????source.setTransfer( new ?Transfer[]?{?textTransfer?}); // ?指定允許的傳輸類型
????????source.addDragListener( new ?MyDragSourceListener());
????????dropTable = new ?Table(parent,SWT.BORDER | SWT.FULL_SELECTION | SWT.SINGLE);
????????fillTable();
???????? // ?將dropTable指定為Drop?Target,
????????DropTarget?target = new ?DropTarget(dropTable,DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT);
????????target.setTransfer( new ?Transfer[]?{textTransfer?});
????????target.addDropListener( new ?MyDropTargetListener());
????}
???? class ?MyDragSourceListener? implements ?DragSourceListener{
???????? // ?指定拖動開始的執(zhí)行策略。
???????? public ? void ?dragStart(DragSourceEvent?event){
???????????? if (((DragSource)event.widget).getControl()? instanceof ?Tree){
????????????????TreeItem?selection? = ?DragAndDrop. this .dragTree.getSelection()[ 0 ];
???????????????? if (selection.getText().length() == 0 ){
????????????????????event.doit = false ;
????????????????}?
????????????}
????????}
???????? // dragSetData方法在dragStart通過之后才被調(diào)用。這個方法可能會因為同一種傳輸類型多次set或
???????? // 不同的多種傳輸類型的set而被多次調(diào)用,象windows等有些平臺中,dropTarget可以在鼠標(biāo)移動的
???????? // 過程中請求數(shù)據(jù),但是在Motif等平臺中,只可以在drop操作完成之后才可以請求數(shù)據(jù),所以在這個方
???????? // 法中不要假設(shè)drag?and?drop操作已經(jīng)完成.在這個方法中是無法知道data將被drop到哪里.
???????? // set的Data也要符合指定的Transfer的format類型。
???????? public ? void ?dragSetData(DragSourceEvent?event){
???????????? if (TextTransfer.getInstance().isSupportedType(event.dataType)){
???????????????? if (((DragSource)event.widget).getControl()? instanceof ?Tree){
????????????????????TreeItem?selection? = ?DragAndDrop. this .dragTree.getSelection()[ 0 ];
????????????????????event.data = selection.getText();
????????????????}
????????????}
????????}
???????? // ?根據(jù)事先指定好的操作類型來處理操作結(jié)果
???????? public ? void ?dragFinished(DragSourceEvent?event){
???????????? if (event.detail == DND.DROP_MOVE){
???????????????? if (((DragSource)event.widget).getControl()? instanceof ?Tree){
????????????????????TreeItem?selection? = ?DragAndDrop. this .dragTree.getSelection()[ 0 ];
????????????????????selection.removeAll();
????????????????}
????????????}
????????}
????}
???? class ?MyDropTargetListener? implements ?DropTargetListener{
???????? // dragEnter事件在drag?and?drop動作開始,并且鼠標(biāo)進(jìn)入了target?widget的范圍內(nèi)時被調(diào)用。
???????? public ? void ?dragEnter(DropTargetEvent?event){
???????????? // 在dragEnter中應(yīng)用可以定義default?operation.如果一個drop?target在創(chuàng)建的時候被指定為
???????????? // 帶有DND.DROP_DEFAULT,那么在拖動的過程中如果沒有輔助按鍵被按下,則drop?target就是DND.DROP_DEFAULT的。
???????????? // 應(yīng)用可以通過改變event.detail來指定default?operation。如果應(yīng)用沒有具體指定DND.DROP_DEFAULT的操作,
???????????? // 平臺會默認(rèn)將DND.DROP_DEFAULT設(shè)置為DND.DROP_MOVE。
???????????? // 另外DND.DROP_DEFAULT的值也可以在dragOperationChanged中設(shè)置。
????????????
???????????? if (event.detail == DND.DROP_DEFAULT){
???????????????? // 給event.detail賦的值必須是event.operations中的一個,event.operations中
???????????????? // 的操作都是DragSource所支持的.?
???????????????? if ((event.operations & DND.DROP_COPY) != 0 ){
????????????????????event.detail = DND.DROP_COPY;
????????????????} else {
????????????????????event.detail = DND.DROP_NONE;
????????????????}
????????????}
????????????
???????????? // drop?target可以選擇性的按照傳輸類型來處理.dragEnter?event有兩個屬性
???????????? // event.currentType?是應(yīng)用設(shè)置的默認(rèn)類型,以TransferData對象形式表現(xiàn),
???????????? // event.dataTypes?是drag?source支持的所有類型的列表,以TransferData數(shù)組形式表現(xiàn),?
???????????? // 我們可以將event.currentType設(shè)置成event.dataTypes中的任意一個。
???????????? // 這些屬性也可以在dragOver,?dragOperationChanged以及dropAccept事件中設(shè)置。
???????????? for ( int ?i = 0 ;i < event.dataTypes.length;i ++ ){
???????????????? if (textTransfer.isSupportedType(event.dataTypes[i])){
????????????????????event.currentDataType = event.dataTypes[i];
???????????????????? // 只允許COPY
???????????????????? if (event.detail != DND.DROP_COPY){
????????????????????????event.detail = DND.DROP_NONE;
????????????????????}
???????????????????? break ;
????????????????}
????????????}
????????}
???????? // dragOver?event在光標(biāo)進(jìn)入drop?target?widget時會被重復(fù)不停的調(diào)用.?
???????? // 如果光標(biāo)是靜止的,dragOver?event依然會有規(guī)則的按一定時間間隔被調(diào)用.?
???????? // 這個方法一般在drop?target是table或tree時用得比較多,可以根據(jù)不同的item而改變操作.
???????? public ? void ?dragOver(DropTargetEvent?event){
???????????? // event.feedback設(shè)置當(dāng)widget處于光標(biāo)下時應(yīng)該給用戶一個什么樣的feedback.?
???????????? // dragOver?event.feedback?值描述?
???????????? // DND.FEEDBACK_SELECT??使光標(biāo)下的item被選中,限于table?and?trees.?
???????????? // DND.FEEDBACK_SCROLL??使widget可以滾動以便于用戶可以drop在當(dāng)前看不見的item上,限于table?and?trees.??
???????????? // DND.FEEDBACK_EXPAND??使當(dāng)前光標(biāo)下的item展開以便于用戶在sub?item上drop,限于trees.?
???????????? // DND.FEEDBACK_INSERT_BEFORE??在item處于光標(biāo)下之前顯示一個插入標(biāo)記,限于tables?and?trees.?
???????????? // DND.FEEDBACK_INSERT_AFTER???在item處于光標(biāo)下之后顯示一個插入標(biāo)記,限于tables?and?trees.??
???????????? // DND.FEEDBACK_NONE????沒有任何效果.?
????????????event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
???????????? if (textTransfer.isSupportedType(event.currentDataType)){
????????????????String?t = (String)(textTransfer.nativeToJava(event.currentDataType));
???????????????? if (t != null ){
????????????????????System.out.println(t);
????????????????}
????????????}
????????}
???????? // 當(dāng)用戶按下或放開輔助按鍵時,例如Ctrl,?Shift,?Command,?Option。則dragOperationChanged事件發(fā)生。
???????? // 輔助按鍵可以改變即將進(jìn)行的操作。例如:
???????? // Ctrl?key?is?down,?a?copy?is?requested,
???????? // Ctrl?and?Shift?keys?are?both?down,?a?link?is?requested
???????? // Shift?key?is?down,?a?move?is?requested
???????? // When?no?modifier?keys?are?pressed,?the?default?operation?is?requested.?
???????? public ? void ?dragOperationChanged(DropTargetEvent?event){
???????????? if (event.detail == DND.DROP_DEFAULT){
????????????????event.detail = DND.DROP_COPY;
????????????} else {
????????????????event.detail = DND.DROP_NONE;
????????????}
???????????? // ?allow?text?to?be?moved?but?files?should?only?be?copied
???????????? if (fileTransfer.isSupportedType(event.currentDataType)){
???????????????? if (event.detail != DND.DROP_COPY){
????????????????????event.detail = DND.DROP_NONE;
????????????????}
????????????}
????????}
???????? // 當(dāng)光標(biāo)離開drop?target?widget時,dragLeave事件發(fā)生.?如果你在dragEnter中分配了一些資源,
???????? // 就應(yīng)該在dragLeave中釋放.dragLeave事件在用戶通過Escape鍵取消Drag?and?Drop操作時也會發(fā)生
???????? // 剛好在drop操作被執(zhí)行之前.
???????? public ? void ?dragLeave(DropTargetEvent?event){
????????}
???????? // dropAccept事件為應(yīng)用提供了最后一次定義數(shù)據(jù)類型的機(jī)會,定義的數(shù)據(jù)類型將被返回到drop事件.?
???????? // 這些是通過向event.currentDataType賦event.dataTypes中的值來實現(xiàn)的.
???????? public ? void ?dropAccept(DropTargetEvent?event){
????????}
???????? // 如果在之前的事件中得到了有效的操作和currentDataType,那么當(dāng)用戶在drop?target上松開鼠標(biāo)時,drop事件會發(fā)生。
???????? // event.data屬性包含了請求到的數(shù)據(jù),event.type包含了Transfer的類型.?
???????? // data是event.currentDataType中定義的類型.
???????? public ? void ?drop(DropTargetEvent?event){
???????????? if (textTransfer.isSupportedType(event.currentDataType)){
????????????????String?text = (String)event.data;
????????????????TableItem?item = new ?TableItem(dropTable,SWT.NONE);
????????????????item.setText(text);
????????????}
???????????? if (fileTransfer.isSupportedType(event.currentDataType)){
????????????????String[]?files = (String[])event.data;
???????????????? for ( int ?i = 0 ;i < files.length;i ++ ){
????????????????????TableItem?item = new ?TableItem(dropTable,SWT.NONE);
????????????????????item.setText(files[i]);
????????????????}
????????????}
????????}
????}
????
???? public ? void ?fillTable(){
????????dropTable.setHeaderVisible( true );
????????dropTable.setLinesVisible( true );
????????
????????TableColumn?partName? = new ?TableColumn(dropTable,SWT.LEFT);
????????partName.setResizable( true );
????????partName.setText( " NAME " );
????????partName.setWidth( 250 );
????????
????????TableColumn?employeeName = new ?TableColumn(dropTable,SWT.LEFT);
????????employeeName.setResizable( true );
????????employeeName.setText( " SIZE " );
????????employeeName.setWidth( 120 );
????????
???????? for ( int ?i = 0 ;i < 10 ;i ++ ){
????????????TableItem?item = new ?TableItem(dropTable,SWT.NONE);
????????????item.setText( new ?String[]{ " tableitem " + i, 100 + i + "" });
????????}
????}
????
???? public ? void ?setFocus(){
????}
}
import ?org.eclipse.swt.SWT;
import ?org.eclipse.swt.dnd.DND;
import ?org.eclipse.swt.dnd.DragSource;
import ?org.eclipse.swt.dnd.DragSourceEvent;
import ?org.eclipse.swt.dnd.DragSourceListener;
import ?org.eclipse.swt.dnd.DropTarget;
import ?org.eclipse.swt.dnd.DropTargetEvent;
import ?org.eclipse.swt.dnd.DropTargetListener;
import ?org.eclipse.swt.dnd.FileTransfer;
import ?org.eclipse.swt.dnd.TextTransfer;
import ?org.eclipse.swt.dnd.Transfer;
import ?org.eclipse.swt.widgets.Composite;
import ?org.eclipse.swt.widgets.Table;
import ?org.eclipse.swt.widgets.TableColumn;
import ?org.eclipse.swt.widgets.TableItem;
import ?org.eclipse.swt.widgets.Tree;
import ?org.eclipse.swt.widgets.TreeItem;
import ?org.eclipse.ui.part.ViewPart;
/**
?*?@Title:?DragAndDrop.java
?*?@Copyright:
?*?@Company:
?*?@Created?on?2005-12-02?14:34:40
?*? @author ?孫其弘
?*? @version ?$Revision:?1.11?$
?*? @since ?1.0
? */
public ? class ?DragAndDrop? extends ?ViewPart{
???? private ?Tree?dragTree;
???? private ?Table?dropTable;
???? private ?TextTransfer?textTransfer;
???? private ?FileTransfer?fileTransfer;
???? public ? void ?createPartControl(Composite?parent){
???????? /* ?Transfer是一個可以提供數(shù)據(jù)在Java?representation與platform?specific?representation
?????????*?之間交互的抽象類.下面是幾個format:
?????????*?TextTransfer?String?"hello?world"?
?????????*?RTFTransfer?String?"{\\rtf1\\b\\i?hello?world}"?
?????????*?FileTransfer?String[]?new?String[]?{file1.getAbsolutePath(),?file2.getAbsolutePath()}?
?????????*?
?????????*?TransferData包含了很多特定于平臺的公用的屬性,應(yīng)用不應(yīng)該直接去訪問這些屬性。
?????????*?如果真的有必要去訪問這些屬性,那么我們可以通過擴(kuò)展Transfer類來完成對特定平臺的額外操作。
????????? */
????????textTransfer = TextTransfer.getInstance();
????????fileTransfer = FileTransfer.getInstance();
????????dragTree = new ?Tree(parent,SWT.FULL_SELECTION | SWT.SINGLE);
???????? for ( int ?i = 0 ;i < 10 ;i ++ ){
????????????TreeItem?item = new ?TreeItem(dragTree,SWT.NONE);
????????????item.setText( " treeitem " + i);
???????????? for ( int ?i2 = 0 ;i2 < 5 ;i2 ++ ){
????????????????TreeItem?subitem = new ?TreeItem(item,SWT.NONE);
????????????????subitem.setText( " subtreeitem " + i2);
????????????}
????????}
???????? // 將dragLabel指定為DragSource(一個widget只能幫定在一個DragSource),
???????? // 并允許數(shù)據(jù)可以從DragSource被MOVE或COPY
????????DragSource?source = new ?DragSource(dragTree,DND.DROP_MOVE | DND.DROP_COPY);
????????source.setTransfer( new ?Transfer[]?{?textTransfer?}); // ?指定允許的傳輸類型
????????source.addDragListener( new ?MyDragSourceListener());
????????dropTable = new ?Table(parent,SWT.BORDER | SWT.FULL_SELECTION | SWT.SINGLE);
????????fillTable();
???????? // ?將dropTable指定為Drop?Target,
????????DropTarget?target = new ?DropTarget(dropTable,DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_DEFAULT);
????????target.setTransfer( new ?Transfer[]?{textTransfer?});
????????target.addDropListener( new ?MyDropTargetListener());
????}
???? class ?MyDragSourceListener? implements ?DragSourceListener{
???????? // ?指定拖動開始的執(zhí)行策略。
???????? public ? void ?dragStart(DragSourceEvent?event){
???????????? if (((DragSource)event.widget).getControl()? instanceof ?Tree){
????????????????TreeItem?selection? = ?DragAndDrop. this .dragTree.getSelection()[ 0 ];
???????????????? if (selection.getText().length() == 0 ){
????????????????????event.doit = false ;
????????????????}?
????????????}
????????}
???????? // dragSetData方法在dragStart通過之后才被調(diào)用。這個方法可能會因為同一種傳輸類型多次set或
???????? // 不同的多種傳輸類型的set而被多次調(diào)用,象windows等有些平臺中,dropTarget可以在鼠標(biāo)移動的
???????? // 過程中請求數(shù)據(jù),但是在Motif等平臺中,只可以在drop操作完成之后才可以請求數(shù)據(jù),所以在這個方
???????? // 法中不要假設(shè)drag?and?drop操作已經(jīng)完成.在這個方法中是無法知道data將被drop到哪里.
???????? // set的Data也要符合指定的Transfer的format類型。
???????? public ? void ?dragSetData(DragSourceEvent?event){
???????????? if (TextTransfer.getInstance().isSupportedType(event.dataType)){
???????????????? if (((DragSource)event.widget).getControl()? instanceof ?Tree){
????????????????????TreeItem?selection? = ?DragAndDrop. this .dragTree.getSelection()[ 0 ];
????????????????????event.data = selection.getText();
????????????????}
????????????}
????????}
???????? // ?根據(jù)事先指定好的操作類型來處理操作結(jié)果
???????? public ? void ?dragFinished(DragSourceEvent?event){
???????????? if (event.detail == DND.DROP_MOVE){
???????????????? if (((DragSource)event.widget).getControl()? instanceof ?Tree){
????????????????????TreeItem?selection? = ?DragAndDrop. this .dragTree.getSelection()[ 0 ];
????????????????????selection.removeAll();
????????????????}
????????????}
????????}
????}
???? class ?MyDropTargetListener? implements ?DropTargetListener{
???????? // dragEnter事件在drag?and?drop動作開始,并且鼠標(biāo)進(jìn)入了target?widget的范圍內(nèi)時被調(diào)用。
???????? public ? void ?dragEnter(DropTargetEvent?event){
???????????? // 在dragEnter中應(yīng)用可以定義default?operation.如果一個drop?target在創(chuàng)建的時候被指定為
???????????? // 帶有DND.DROP_DEFAULT,那么在拖動的過程中如果沒有輔助按鍵被按下,則drop?target就是DND.DROP_DEFAULT的。
???????????? // 應(yīng)用可以通過改變event.detail來指定default?operation。如果應(yīng)用沒有具體指定DND.DROP_DEFAULT的操作,
???????????? // 平臺會默認(rèn)將DND.DROP_DEFAULT設(shè)置為DND.DROP_MOVE。
???????????? // 另外DND.DROP_DEFAULT的值也可以在dragOperationChanged中設(shè)置。
????????????
???????????? if (event.detail == DND.DROP_DEFAULT){
???????????????? // 給event.detail賦的值必須是event.operations中的一個,event.operations中
???????????????? // 的操作都是DragSource所支持的.?
???????????????? if ((event.operations & DND.DROP_COPY) != 0 ){
????????????????????event.detail = DND.DROP_COPY;
????????????????} else {
????????????????????event.detail = DND.DROP_NONE;
????????????????}
????????????}
????????????
???????????? // drop?target可以選擇性的按照傳輸類型來處理.dragEnter?event有兩個屬性
???????????? // event.currentType?是應(yīng)用設(shè)置的默認(rèn)類型,以TransferData對象形式表現(xiàn),
???????????? // event.dataTypes?是drag?source支持的所有類型的列表,以TransferData數(shù)組形式表現(xiàn),?
???????????? // 我們可以將event.currentType設(shè)置成event.dataTypes中的任意一個。
???????????? // 這些屬性也可以在dragOver,?dragOperationChanged以及dropAccept事件中設(shè)置。
???????????? for ( int ?i = 0 ;i < event.dataTypes.length;i ++ ){
???????????????? if (textTransfer.isSupportedType(event.dataTypes[i])){
????????????????????event.currentDataType = event.dataTypes[i];
???????????????????? // 只允許COPY
???????????????????? if (event.detail != DND.DROP_COPY){
????????????????????????event.detail = DND.DROP_NONE;
????????????????????}
???????????????????? break ;
????????????????}
????????????}
????????}
???????? // dragOver?event在光標(biāo)進(jìn)入drop?target?widget時會被重復(fù)不停的調(diào)用.?
???????? // 如果光標(biāo)是靜止的,dragOver?event依然會有規(guī)則的按一定時間間隔被調(diào)用.?
???????? // 這個方法一般在drop?target是table或tree時用得比較多,可以根據(jù)不同的item而改變操作.
???????? public ? void ?dragOver(DropTargetEvent?event){
???????????? // event.feedback設(shè)置當(dāng)widget處于光標(biāo)下時應(yīng)該給用戶一個什么樣的feedback.?
???????????? // dragOver?event.feedback?值描述?
???????????? // DND.FEEDBACK_SELECT??使光標(biāo)下的item被選中,限于table?and?trees.?
???????????? // DND.FEEDBACK_SCROLL??使widget可以滾動以便于用戶可以drop在當(dāng)前看不見的item上,限于table?and?trees.??
???????????? // DND.FEEDBACK_EXPAND??使當(dāng)前光標(biāo)下的item展開以便于用戶在sub?item上drop,限于trees.?
???????????? // DND.FEEDBACK_INSERT_BEFORE??在item處于光標(biāo)下之前顯示一個插入標(biāo)記,限于tables?and?trees.?
???????????? // DND.FEEDBACK_INSERT_AFTER???在item處于光標(biāo)下之后顯示一個插入標(biāo)記,限于tables?and?trees.??
???????????? // DND.FEEDBACK_NONE????沒有任何效果.?
????????????event.feedback = DND.FEEDBACK_SELECT | DND.FEEDBACK_SCROLL;
???????????? if (textTransfer.isSupportedType(event.currentDataType)){
????????????????String?t = (String)(textTransfer.nativeToJava(event.currentDataType));
???????????????? if (t != null ){
????????????????????System.out.println(t);
????????????????}
????????????}
????????}
???????? // 當(dāng)用戶按下或放開輔助按鍵時,例如Ctrl,?Shift,?Command,?Option。則dragOperationChanged事件發(fā)生。
???????? // 輔助按鍵可以改變即將進(jìn)行的操作。例如:
???????? // Ctrl?key?is?down,?a?copy?is?requested,
???????? // Ctrl?and?Shift?keys?are?both?down,?a?link?is?requested
???????? // Shift?key?is?down,?a?move?is?requested
???????? // When?no?modifier?keys?are?pressed,?the?default?operation?is?requested.?
???????? public ? void ?dragOperationChanged(DropTargetEvent?event){
???????????? if (event.detail == DND.DROP_DEFAULT){
????????????????event.detail = DND.DROP_COPY;
????????????} else {
????????????????event.detail = DND.DROP_NONE;
????????????}
???????????? // ?allow?text?to?be?moved?but?files?should?only?be?copied
???????????? if (fileTransfer.isSupportedType(event.currentDataType)){
???????????????? if (event.detail != DND.DROP_COPY){
????????????????????event.detail = DND.DROP_NONE;
????????????????}
????????????}
????????}
???????? // 當(dāng)光標(biāo)離開drop?target?widget時,dragLeave事件發(fā)生.?如果你在dragEnter中分配了一些資源,
???????? // 就應(yīng)該在dragLeave中釋放.dragLeave事件在用戶通過Escape鍵取消Drag?and?Drop操作時也會發(fā)生
???????? // 剛好在drop操作被執(zhí)行之前.
???????? public ? void ?dragLeave(DropTargetEvent?event){
????????}
???????? // dropAccept事件為應(yīng)用提供了最后一次定義數(shù)據(jù)類型的機(jī)會,定義的數(shù)據(jù)類型將被返回到drop事件.?
???????? // 這些是通過向event.currentDataType賦event.dataTypes中的值來實現(xiàn)的.
???????? public ? void ?dropAccept(DropTargetEvent?event){
????????}
???????? // 如果在之前的事件中得到了有效的操作和currentDataType,那么當(dāng)用戶在drop?target上松開鼠標(biāo)時,drop事件會發(fā)生。
???????? // event.data屬性包含了請求到的數(shù)據(jù),event.type包含了Transfer的類型.?
???????? // data是event.currentDataType中定義的類型.
???????? public ? void ?drop(DropTargetEvent?event){
???????????? if (textTransfer.isSupportedType(event.currentDataType)){
????????????????String?text = (String)event.data;
????????????????TableItem?item = new ?TableItem(dropTable,SWT.NONE);
????????????????item.setText(text);
????????????}
???????????? if (fileTransfer.isSupportedType(event.currentDataType)){
????????????????String[]?files = (String[])event.data;
???????????????? for ( int ?i = 0 ;i < files.length;i ++ ){
????????????????????TableItem?item = new ?TableItem(dropTable,SWT.NONE);
????????????????????item.setText(files[i]);
????????????????}
????????????}
????????}
????}
????
???? public ? void ?fillTable(){
????????dropTable.setHeaderVisible( true );
????????dropTable.setLinesVisible( true );
????????
????????TableColumn?partName? = new ?TableColumn(dropTable,SWT.LEFT);
????????partName.setResizable( true );
????????partName.setText( " NAME " );
????????partName.setWidth( 250 );
????????
????????TableColumn?employeeName = new ?TableColumn(dropTable,SWT.LEFT);
????????employeeName.setResizable( true );
????????employeeName.setText( " SIZE " );
????????employeeName.setWidth( 120 );
????????
???????? for ( int ?i = 0 ;i < 10 ;i ++ ){
????????????TableItem?item = new ?TableItem(dropTable,SWT.NONE);
????????????item.setText( new ?String[]{ " tableitem " + i, 100 + i + "" });
????????}
????}
????
???? public ? void ?setFocus(){
????}
}
from: http://www.eclipseworld.org/bbs/read.php?tid=893&page=e&fpage=1
posted on 2006-09-05 01:03 weidagang2046 閱讀(2567) 評論(1) 編輯 收藏 所屬分類: Java