创建一颗树,想移动树节点,比如最后一个节点移动到第一位,其他节点全部向后退一位,怎么实现呢,我下面的代码只实现了树节点的复制,而且是复制到最后一位,请高手们帮忙指点下,代码如下: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);
}
}
}
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);
}
}
}
解决方案 »
- swing开发遇到的难题???
- 为什么会出现这个异常,如何解决?
- swing 设置快捷键的问题
- JCreator中为什么点不出J2EE的包?比如:servlet。
- JVM指令系统是怎么回事
- Connection类在帮助文档里有段话不明白
- javax.naming.NoInitialContextException求解
- rs.getString() 可以获取 rs.getFloat()
- 忙毕业设计中,请教高手问题,谢谢帮忙!
- 我想学net包,不知道怎么学好,大家给个建议!!!!
- 请问用什么分隔符才不会重复啊,谢谢大家
- (高分求解) 数组中的length属性是属于Java中的哪一个类的( 两颗星以上的大侠请进)
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);
}
}
假如是treeviewer这句话有问题啊,treeviewer.getTree()返回的tree无法初始化dragSource。请问怎么办,怎么实现treeviewer中的treeitem的拖拽