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子節(jié)點(diǎn)。
?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的節(jié)點(diǎn)
????if (selection.length > 0 && selection[0].getItemCount() == 0) //判斷所選節(jié)點(diǎn)是否存在并且為末端節(jié)點(diǎn)
????{
?????event.doit = true;?//啟動(dòng)拖拽功能
?????dragSourceItem[0] = selection[0]; //保存拖拽節(jié)點(diǎn)信息
????} else {
?????event.doit = false;
????}
???};
???public void dragSetData (DragSourceEvent event) {
????event.data = dragSourceItem[0].getText(); //保存拖拽節(jié)點(diǎn)信息到事件數(shù)據(jù)中
???}
???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() {
???//處理拖拽到目的上空時(shí)的方法
???public void dragOver(DropTargetEvent event) {
????event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL; //響應(yīng)拖拽動(dòng)作,F(xiàn)EEDBACK_EXPAND表示拖拽到可以展開的節(jié)點(diǎn)時(shí)展開相應(yīng)節(jié)點(diǎn)。
????if (event.item != null) {
?????TreeItem item = (TreeItem)event.item;
?????//處理拖拽動(dòng)作響應(yīng),根據(jù)拖拽的位置不同產(chǎn)生不同的響應(yīng)
?????Point pt = display.map(null, tree, event.x, event.y); //獲取拖拽當(dāng)前位置點(diǎn)
?????Rectangle bounds = item.getBounds(); //獲取目的節(jié)點(diǎn)的邊框
?????
?????//根據(jù)拖拽當(dāng)前位置點(diǎn)與目的節(jié)點(diǎn)的邊框位置設(shè)置響應(yīng),如顯示為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;
?????}
????}
???}
???//處理放下時(shí)的方法
???public void drop(DropTargetEvent event) {
????if (event.data == null) {
?????event.detail = DND.DROP_NONE;
?????return;
????}
????String text = (String)event.data;
????//如果放下的位置沒有節(jié)點(diǎn),則新建立一個(gè)節(jié)點(diǎn),以根節(jié)點(diǎn)為父節(jié)點(diǎn)
????if (event.item == null)
????{
?????TreeItem item = new TreeItem(tree, SWT.NONE);
?????item.setText(text);
????}
????//如果放下的位置有節(jié)點(diǎn)
????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) {
???????//以當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)為父建立一個(gè)子節(jié)點(diǎn),并且插入到當(dāng)前節(jié)點(diǎn)前
???????TreeItem newItem = new TreeItem(parent, SWT.NONE, index);
???????newItem.setText(text);
??????} else if (pt.y > bounds.y + 2*bounds.height/3) {
???????//以當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)為父建立一個(gè)子節(jié)點(diǎn),并且插入到當(dāng)前節(jié)點(diǎn)前
???????TreeItem newItem = new TreeItem(parent, SWT.NONE, index+1);
???????newItem.setText(text);
??????} else {
???????//以當(dāng)前為父節(jié)點(diǎn)建立一個(gè)子節(jié)點(diǎn)
???????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 ();
?}