创建一颗树,想移动树节点,比如最后一个节点移动到第一位,其他节点全部向后退一位,怎么实现呢,我下面的代码只实现了树节点的复制,而且是复制到最后一位,请高手们帮忙指点下,代码如下:import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
public class DragTree { public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
//创建一个树对象
final Tree tree = createFolderTree(shell);
//定义拖放源对象
DragSource dragSource = new DragSource(tree, DND.DROP_MOVE);
//设置传输的数据为文本型String类型
dragSource.setTransfer(new Transfer[] { TextTransfer.getInstance()});
//注册拖放源时的事件处理
dragSource.addDragListener(new DragSourceListener() {
public void dragStart(DragSourceEvent event) {
if (tree.getSelectionCount() == 0)
event.doit = false;
}
public void dragSetData(DragSourceEvent event) {
if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
event.data = tree.getSelection()[0].getText(0);
}
}
public void dragFinished(DragSourceEvent event) {

}
});
//定义拖放目标对象
DropTarget dropTarget = new DropTarget(tree, DND.DROP_MOVE | DND.DROP_DEFAULT);
//设置目标对象可传输的数据类型
dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance()});
//注册目标对象的事件处理
dropTarget.addDropListener(new DropTargetListener() {
public void dragEnter(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT)
event.detail = DND.DROP_MOVE;
}
public void dragOperationChanged(DropTargetEvent event) {
if (event.detail == DND.DROP_DEFAULT)
event.detail = DND.DROP_MOVE;
}
public void dragOver(DropTargetEvent event) {
event.feedback = DND.FEEDBACK_EXPAND | DND.FEEDBACK_SELECT;
}
//当松开鼠标时触发的事件
public void drop(DropTargetEvent event) {
if (event.item == null)
return;
//首先获得目标对象中拖拽的树节点
TreeItem eventItem = (TreeItem) event.item;
if (TextTransfer.getInstance().isSupportedType(event.currentDataType)) {
//获得数据源设置的字符串
String s = (String) event.data;
//在当前位置插入一个节点
TreeItem newItem = null ;
if (eventItem.getParentItem()==null)
newItem = new TreeItem(eventItem.getParent(),SWT.NONE);
else
newItem = new TreeItem(eventItem.getParentItem(),SWT.NONE);
newItem.setText(s);
}
} public void dragLeave(DropTargetEvent event) {
}
public void dropAccept(DropTargetEvent event) {
} });
shell.setSize(300, 150);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
//创建树,利用目录结构来初始化树数据
public static Tree createFolderTree(Composite parent) {
Tree tree = new Tree(parent, SWT.BORDER | SWT.SINGLE);
File root = new File("D:\\test");
File[] files = root.listFiles();
for (int i = 0; i < files.length; i++) {
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setText(files[i].getName());
if (files[i].isDirectory())
setDirectory(files[i], item);
}
return tree; }
//设置子树的子孙数据,递归调用该方法
public static void setDirectory(File file, TreeItem parent) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
TreeItem item = new TreeItem(parent, SWT.NONE);
item.setText(files[i].getName());
if (files[i].isDirectory())
setDirectory(files[i], item);
}
}
}

解决方案 »

  1.   

    主要改了下dragStart(),dragFinished(),dragOver(),drop()方法,具体看我注释。
    public static void main(String[] args) {
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());
    // 创建一个树对象
    final Tree tree = createFolderTree(shell);
    // 定义拖放源对象
    DragSource dragSource = new DragSource(tree, DND.DROP_MOVE);
    // 设置传输的数据为文本型String类型
    dragSource.setTransfer(new Transfer[] { TextTransfer.getInstance() });
    // 注册拖放源时的事件处理 dragSource.addDragListener(new DragSourceListener() {
    //hold selection when moving
    TreeItem[] dragSourceItem = new TreeItem[1];
    public void dragStart(DragSourceEvent event) {
    TreeItem[] selection = tree.getSelection();
    if (selection.length > 0 && selection[0].getItemCount() == 0) {
    event.doit = true;
    //The selection will be deleted when dragFinished
    dragSourceItem[0] = selection[0];
    } else {
    event.doit = false;
    }
    } public void dragSetData(DragSourceEvent event) {
    if (TextTransfer.getInstance().isSupportedType(event.dataType)) {
    event.data = tree.getSelection()[0].getText(0);
    }
    } public void dragFinished(DragSourceEvent event) {
    if (event.detail == DND.DROP_MOVE)
    //delete selection
    dragSourceItem[0].dispose();
    dragSourceItem[0] = null;
    }
    });
    // 定义拖放目标对象
    DropTarget dropTarget = new DropTarget(tree, DND.DROP_MOVE
    | DND.DROP_DEFAULT);
    // 设置目标对象可传输的数据类型
    dropTarget.setTransfer(new Transfer[] { TextTransfer.getInstance() });
    // 注册目标对象的事件处理
    dropTarget.addDropListener(new DropTargetListener() {
    public void dragEnter(DropTargetEvent event) {
    if (event.detail == DND.DROP_DEFAULT)
    event.detail = DND.DROP_MOVE;
    } public void dragOperationChanged(DropTargetEvent event) {
    if (event.detail == DND.DROP_DEFAULT)
    event.detail = DND.DROP_MOVE;
    } public void dragOver(DropTargetEvent event) {
    //decide the place to put
    if (event.item != null) {
    TreeItem item = (TreeItem)event.item;
    Point pt = display.map(null, tree, event.x, event.y);
    Rectangle bounds = item.getBounds();
    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);
    }
    }
    }
    } public void dragLeave(DropTargetEvent event) {
    } public void dropAccept(DropTargetEvent event) {
    } });
    shell.setSize(300, 150);
    shell.open();
    while (!shell.isDisposed()) {
    if (!display.readAndDispatch())
    display.sleep();
    }
    display.dispose();
    } // 创建树,利用目录结构来初始化树数据
    public static Tree createFolderTree(Composite parent) {
    Tree tree = new Tree(parent, SWT.BORDER | SWT.SINGLE);
    File root = new File("c:\\DATA\\temp");
    File[] files = root.listFiles();
    for (int i = 0; i < files.length; i++) {
    TreeItem item = new TreeItem(tree, SWT.NONE);
    item.setText(files[i].getName());
    if (files[i].isDirectory())
    setDirectory(files[i], item);
    }
    return tree; } // 设置子树的子孙数据,递归调用该方法
    public static void setDirectory(File file, TreeItem parent) {
    File[] files = file.listFiles();
    for (int i = 0; i < files.length; i++) {
    TreeItem item = new TreeItem(parent, SWT.NONE);
    item.setText(files[i].getName());
    if (files[i].isDirectory())
    setDirectory(files[i], item);
    }
    }
      

  2.   

     DragSource dragSource = new DragSource(tree, DND.DROP_MOVE);
    假如是treeviewer这句话有问题啊,treeviewer.getTree()返回的tree无法初始化dragSource。请问怎么办,怎么实现treeviewer中的treeitem的拖拽