1、拖拽Label的文字。
?public static void main (String [] args) {
??
??Display display = new Display ();
??final Shell shell = new Shell (display);
??shell.setLayout(new FillLayout());
??final Label label1 = new Label (shell, SWT.BORDER);
??label1.setText ("TEXT");
??final Label label2 = new Label (shell, SWT.BORDER);
??setDragDrop (label1);
??setDragDrop (label2);
??shell.setSize (200, 200);
??shell.open ();
??while (!shell.isDisposed ()) {
???if (!display.readAndDispatch ()) display.sleep ();
??}
??display.dispose ();
?}
?
?public static void setDragDrop (final Label label) {
??
??Transfer[] types = new Transfer[] {TextTransfer.getInstance()};
??int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
??
??final DragSource source = new DragSource (label, operations);
??source.setTransfer(types);
??source.addDragListener (new DragSourceListener () {
???public void dragStart(DragSourceEvent event) {
????event.doit = (label.getText ().length () != 0);
???}
???public void dragSetData (DragSourceEvent event) {
????event.data = label.getText ();
???}
???public void dragFinished(DragSourceEvent event) {
????if (event.detail == DND.DROP_MOVE)
?????label.setText ("");
???}
??});
??DropTarget target = new DropTarget(label, operations);
??target.setTransfer(types);
??target.addDropListener (new DropTargetAdapter() {
???public void drop(DropTargetEvent event) {
????if (event.data == null) {
?????event.detail = DND.DROP_NONE;
?????return;
????}
????label.setText ((String) event.data);
???}
??});
?}
2、隨意拖拽Tree子節點。
?public static void main (String [] args) {
??
??final Display display = new Display ();
??final Shell shell = new Shell (display);
??shell.setLayout(new FillLayout());
??//建立用于拖拽的樹
??final Tree tree = new Tree(shell, SWT.BORDER);
??for (int i = 0; i < 3; i++) {
???TreeItem item = new TreeItem(tree, SWT.NONE);
???item.setText("item "+i);
???for (int j = 0; j < 3; j++) {
????TreeItem subItem = new TreeItem(item, SWT.NONE);
????subItem.setText("item "+i+" "+j);
????for (int k = 0; k < 3; k++) {
?????TreeItem subsubItem = new TreeItem(subItem, SWT.NONE);
?????subsubItem.setText("item "+i+" "+j+" "+k);
????}
???}
??}
??
??Transfer[] types = new Transfer[] {TextTransfer.getInstance()};
??int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
??
??//建立拖拽 源————樹tree對象
??final DragSource source = new DragSource (tree, operations);
??source.setTransfer(types);
??final TreeItem[] dragSourceItem = new TreeItem[1];
??source.addDragListener (new DragSourceListener () {
???public void dragStart(DragSourceEvent event) {
????TreeItem[] selection = tree.getSelection();?// 獲取所選tree的節點
????if (selection.length > 0 && selection[0].getItemCount() == 0) //判斷所選節點是否存在并且為末端節點
????{
?????event.doit = true;?//啟動拖拽功能
?????dragSourceItem[0] = selection[0]; //保存拖拽節點信息
????} else {
?????event.doit = false;
????}
???};
???public void dragSetData (DragSourceEvent event) {
????event.data = dragSourceItem[0].getText(); //保存拖拽節點信息到事件數據中
???}
???public void dragFinished(DragSourceEvent event) {
????if (event.detail == DND.DROP_MOVE)
?????dragSourceItem[0].dispose();
?????dragSourceItem[0] = null;
???}
??});
??
??//建立拖拽 目的————樹tree對象
??DropTarget target = new DropTarget(tree, operations);
??target.setTransfer(types);
??target.addDropListener (new DropTargetAdapter() {
???//處理拖拽到目的上空時的方法
???public void dragOver(DropTargetEvent event) {
????event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL; //響應拖拽動作,FEEDBACK_EXPAND表示拖拽到可以展開的節點時展開相應節點。
????if (event.item != null) {
?????TreeItem item = (TreeItem)event.item;
?????//處理拖拽動作響應,根據拖拽的位置不同產生不同的響應
?????Point pt = display.map(null, tree, event.x, event.y); //獲取拖拽當前位置點
?????Rectangle bounds = item.getBounds(); //獲取目的節點的邊框
?????
?????//根據拖拽當前位置點與目的節點的邊框位置設置響應,如顯示為FEEDBACK_INSERT_BEFORE、FEEDBACK_INSERT_AFTER
?????if (pt.y < bounds.y + bounds.height/3) {
??????event.feedback |= DND.FEEDBACK_INSERT_BEFORE;
?????} else if (pt.y > bounds.y + 2*bounds.height/3) {
??????event.feedback |= DND.FEEDBACK_INSERT_AFTER;
?????} else {
??????event.feedback |= DND.FEEDBACK_SELECT;
?????}
????}
???}
???//處理放下時的方法
???public void drop(DropTargetEvent event) {
????if (event.data == null) {
?????event.detail = DND.DROP_NONE;
?????return;
????}
????String text = (String)event.data;
????//如果放下的位置沒有節點,則新建立一個節點,以根節點為父節點
????if (event.item == null)
????{
?????TreeItem item = new TreeItem(tree, SWT.NONE);
?????item.setText(text);
????}
????//如果放下的位置有節點
????else
????{
?????TreeItem item = (TreeItem)event.item;
?????Point pt = display.map(null, tree, event.x, event.y);
?????Rectangle bounds = item.getBounds();
?????TreeItem parent = item.getParentItem();
?????if (parent != null) {
??????TreeItem[] items = parent.getItems();
??????int index = 0;
??????for (int i = 0; i < items.length; i++) {
???????if (items[i] == item) {
????????index = i;
????????break;
???????}
??????}
??????if (pt.y < bounds.y + bounds.height/3) {
???????//以當前節點的父節點為父建立一個子節點,并且插入到當前節點前
???????TreeItem newItem = new TreeItem(parent, SWT.NONE, index);
???????newItem.setText(text);
??????} else if (pt.y > bounds.y + 2*bounds.height/3) {
???????//以當前節點的父節點為父建立一個子節點,并且插入到當前節點前
???????TreeItem newItem = new TreeItem(parent, SWT.NONE, index+1);
???????newItem.setText(text);
??????} else {
???????//以當前為父節點建立一個子節點
???????TreeItem newItem = new TreeItem(item, SWT.NONE);
???????newItem.setText(text);
??????}
??????
?????} else {
??????TreeItem[] items = tree.getItems();
??????int index = 0;
??????for (int i = 0; i < items.length; i++) {
???????if (items[i] == item) {
????????index = i;
????????break;
???????}
??????}
??????if (pt.y < bounds.y + bounds.height/3) {
???????TreeItem newItem = new TreeItem(tree, SWT.NONE, index);
???????newItem.setText(text);
??????} else if (pt.y > bounds.y + 2*bounds.height/3) {
???????TreeItem newItem = new TreeItem(tree, SWT.NONE, index+1);
???????newItem.setText(text);
??????} else {
???????TreeItem newItem = new TreeItem(item, SWT.NONE);
???????newItem.setText(text);
??????}
?????}
?????
?????
????}
???}
??});
??shell.setSize (400, 400);
??shell.open ();
??while (!shell.isDisposed ()) {
???if (!display.readAndDispatch ()) display.sleep ();
??}
??display.dispose ();
?}