Atitit。DD dragdrop拖拽功能c#.net java swing的对比与实现总结
Atitit。D&D?drag&drop拖拽功能c#.net?java?swing的對比與實現總結
?
1.?實現一個D&D操作一般包括三個步驟: 1
2.?.net黑頭的拖曳機制.必須有DragEnter事件(單獨寫DragDrop事件是不會具有拖拽功能的) 2
3.?---java黑頭的拖曳..必須有DragEnter事件(單獨寫?Drop事件是不會具有拖拽功能的) 2
4.?代碼 3
5.?參考 5
?
1.?實現一個D&D操作一般包括三個步驟:
?首先實現一個拖拽源,這個拖拽源和相應的組件是關聯起來的
?第二步實現一個拖拽目標,這個目標用來實現拖拽物的接收
?第三步實現一個數據傳輸對象,該對象封裝拖動的數據
??_____________________??????????????????????????????????????_____________________
?|?????????????????????|?????????????????????????????????????|????????????????????|???
?|?DragSource?Component|?????????????????????????????????????|DropTarget?Component|
?|_____________________|?????????????????????????????????????|____________________|
???????????????????|??????????????????????????????????????????????|
???????????????????|____________Transferable?Data_________________|
???????????????????
?Transferable?接口實現出的對象能夠保證??DropTarget?Component讀懂拖拽過來的對象中包含的信息
?如果是在同一個虛擬機中實現拖拽的話,DragSource?Component會傳遞一個引用給DropTarget?Component
?但是如果在不同的JVM中或者是在JVM和本地系統之間傳遞數據的話我們就必須實現一個Transferable對象來傳遞數據
?Transferable中封裝的內容存放到DataFlavors,用戶可以通過訪問DataFlavors來獲取數據
?
作者::?老哇的爪子?Attilax?艾龍,??EMAIL:1466519819@qq.com
轉載請注明來源:?http://blog.csdn.net/attilax
?
?
?
2.?.net黑頭的拖曳機制.必須有DragEnter事件(單獨寫DragDrop事件是不會具有拖拽功能的)
?
思路:?通過DragEnter事件獲得被拖入窗口的“信息”(可以是若干文件,一些文字等等),
在DragDrop事件中對“信息”進行解析。
窗體的AllowDrop屬性必須設置成true;
且必須有DragEnter事件(單獨寫DragDrop事件是不會具有拖拽功能的)
?private?void?Form1_DragEnter(object?sender,?DragEventArgs?e)
?{
??????????????if?(e.Data.GetDataPresent(DataFormats.FileDrop))
??????????????????e.Effect?=?DragDropEffects.Link;?//重要代碼:表明是鏈接類型的數據,比如文件路徑
???????????????else?e.Effect?=?DragDropEffects.None;
????}
?????????private?void?Form1_DragDrop(object?sender,?DragEventArgs?e)
?????????{
???????????????string?path?=?((System.Array)e.Data.GetData(DataFormats.FileDrop)).GetValue(0).ToString();
?????????????MessageBox.Show(path);??
?????????}
?
3.?---java黑頭的拖曳..必須有DragEnter事件(單獨寫?Drop事件是不會具有拖拽功能的)
?
這個功能AWT也提供了Swing話只是利用了這個,因為這和界面沒什么關系。
?
?
在JAVA中使用拖拽功能
sun在java2中引入了一些新的方法來幫助實現拖拽功能,這些新的類在java.awt.dnd包中
?JDK1.4開始對Swing的拖放功能做了簡化,不同組件分別提供了拖放源和拖放目標,這里就講用的最多的文本域,他既能拖入文本,也能將文本拖出,非常方便。
但默認這個功能沒有啟用,要手動調用setDragEnabled方法,使其生效。eg
?
4.?代碼
---form?ini()
?class?SetImgSoftlinkGener?extends?JFrame??implements?Iskin,?DropTargetListener
frame.setDropTarget(?new?DropTarget(frame,??DnDConstants.ACTION_COPY_OR_MOVE,?this,?true)?);
?
@Override
public?void?dragEnter(DropTargetDragEvent?dtde)?{
System.out.println("=====enter?drag?enter?");
?
//?Get?the?type?of?object?being?transferred?and?determine
//?whether?it?is?appropriate.
//?checkTransferType(dtde);
//?Only?accept?a?list?of?files
boolean?acceptableType?=?dtde
.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
?
//?Accept?or?reject?the?drag.
//?acceptOrRejectDrag(dtde);
int?dropAction?=?dtde.getDropAction();
int?sourceActions?=?dtde.getSourceActions();
boolean?acceptedDrag?=?false;
?
//?Reject?if?the?object?being?transferred
//?or?the?operations?available?are?not?acceptable.
if?(!acceptableType
||?(sourceActions?&?DnDConstants.ACTION_COPY_OR_MOVE)?==?0)?{
//?DnDUtils.debugPrintln("Drop?target?rejecting?drag");
dtde.rejectDrag();
}?else?if?((dropAction?&?DnDConstants.ACTION_COPY_OR_MOVE)?==?0)?{
//?Not?offering?copy?or?move?-?suggest?a?copy
//?DnDUtils.debugPrintln("Drop?target?offering?COPY");
dtde.acceptDrag(DnDConstants.ACTION_COPY);
acceptedDrag?=?true;
}?else?{
//?Offering?an?acceptable?operation:?accept
//?DnDUtils.debugPrintln("Drop?target?accepting?drag");
dtde.acceptDrag(dropAction);
acceptedDrag?=?true;
}
?
//?return?acceptedDrag;
?
}
?
?
@Override
public?void?drop(DropTargetDropEvent?dtde)?{
System.out.println("=====enter?drag?drop...?");
//?Check?the?drop?action
if?((dtde.getDropAction()?&?DnDConstants.ACTION_COPY_OR_MOVE)?!=?0)?{
//?Accept?the?drop?and?get?the?transfer?data
dtde.acceptDrop(dtde.getDropAction());
Transferable?transferable?=?dtde.getTransferable();
System.out.println("");
try?{
List<File>?fileList?=?(List)?transferable
.getTransferData(DataFlavor.javaFileListFlavor);
//fileList.getClass().toString();
?
//String?path?=?fileList[0].getPath();
String?path=fileList.get(0).getPath();
MsgBox.setTxt(path);
System.out.println(path);
}?catch?(UnsupportedFlavorException?|?IOException?e)?{
//?TODO?Auto-generated?catch?block
e.printStackTrace();
}
?
//?dtde.dropComplete(result);
?
//?dtde.rejectDrop();
}
?
}
5.?參考
在JAVA中使用拖拽功能?-?gudong2945的專欄?-?博客頻道?-?CSDN.NET.htm
(impt?)swing實現拖拽效果(將本地文件拖拽到程序的文本框中顯示內容)?-?java學習交流?-?博客頻道?-?CSDN.NET.htm
瘋狂JAVA講義---第十二章:Swing編程(三)拖放功能?-?TERRY的技術日志?-?博客頻道?-?CSDN.NET.htm
(?有點用?)java的Drag?and?Drop(拖拽)簡單例子_javase吧_百度貼吧.htm?
(簡單?)?Java?Swing?GUI文件拖拽?-?從明白的那一刻,還不晚,啟航。?-?博客頻道?-?CSDN.NET.htm
?
C#.net拖拽實現獲得文件路徑?-?attilax的專欄?-?博客頻道?-?CSDN.NET.htm
WinForm的鼠標拖拽功能(C#)
C#中的拖放操作?-?fumingkui@126的日志?-?網易博客.htm
winform(C#)拖拽實現獲得文件路徑_.NET教程網——簡單專業的.NET技術網站.htm
總結
以上是生活随笔為你收集整理的Atitit。DD dragdrop拖拽功能c#.net java swing的对比与实现总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL笔记(4)关于erase,remo
- 下一篇: Git 常用命令和教程