使用Vaadin 7在两棵树之间拖放
我有两棵树:tree1,tree2,我想从tree1拖放到tree2。 问题是当我想移动一个完整的文件夹时,他的孩子们在树2中的位置不对。它们只是添加到tree2中,但没有得到它们的真正父文件夹(我拖动的文件夹)。事实上,我没有找到如何知道tree2中文件夹的新id。 这是我的密码:使用Vaadin 7在两棵树之间拖放,vaadin,vaadin7,Vaadin,Vaadin7,我有两棵树:tree1,tree2,我想从tree1拖放到tree2。 问题是当我想移动一个完整的文件夹时,他的孩子们在树2中的位置不对。它们只是添加到tree2中,但没有得到它们的真正父文件夹(我拖动的文件夹)。事实上,我没有找到如何知道tree2中文件夹的新id。 这是我的密码: private void Drag() { tree1().setDragMode(TreeDragMode.NODE); // Allow all nodes to h
private void Drag() {
tree1().setDragMode(TreeDragMode.NODE);
// Allow all nodes to have children
for (final Object itemId : tree2().getItemIds()) {
tree2().setChildrenAllowed(itemId, true);
}
tree2().setDragMode(TreeDragMode.NODE);
tree2().setDropHandler(new TreeSortDropHandler(tree2(), tree1()));
}
public class TreeSortDropHandler implements DropHandler {
private final Tree tree2;
private final Tree tree1;
/**
* Tree must use {@link HierarchicalContainer}.
*
* @param tree
*/
public TreeSortDropHandler(final Tree tree2,
final Tree tree1) {
this.tree2 = tree2;
this.tree1 = tree1;
}
@Override
public AcceptCriterion getAcceptCriterion() {
// TODO Auto-generated method stub
return AcceptAll.get();
}
@Override
public void drop(DragAndDropEvent dropEvent) {
// TODO Auto-generated method stub
final Transferable t = dropEvent.getTransferable();
// see the comment in getAcceptCriterion()
if (t.getSourceComponent() != tree1
|| !(t instanceof DataBoundTransferable)) {
return;
}
final TreeTargetDetails dropData = ((TreeTargetDetails) dropEvent
.getTargetDetails());
final Object sourceItemId = ((DataBoundTransferable) t).getItemId();
// FIXME: Why "over", should be "targetItemId" or just
// "getItemId"
final Object targetItemId = dropData.getItemIdOver();
// Location describes on which part of the node the drop took
// place
final VerticalDropLocation location = dropData.getDropLocation();
moveNode(sourceItemId, targetItemId, location);
}
private void moveNode(final Object sourceItemId,
Object targetItemId, final VerticalDropLocation location) {
final HierarchicalContainer container = (HierarchicalContainer) tree1
.getContainerDataSource();
if (location == VerticalDropLocation.MIDDLE) {
if (tree1.hasChildren(sourceItemId))
{
Collection<?> children=tree1.getChildren(sourceItemId);
tree2.addItem(tree1.getItemCaption(sourceItemId));
tree2.setParent(tree1.getItemCaption(sourceItemId),targetItemId);
targetItemId=tree2.getItem(tree1.getItemCaption(sourceItemId));
tree2.addItems(children);
tree2.setParent(children,tree2.getItemCaption(sourceItemId));
System.out.print(tree2.getItem(tree1.getItemCaption(sourceItemId)));
System.out.print("//added");
}else {
tree2.addItem(tree1.getItemCaption(sourceItemId));
tree2.setParent(tree1.getItemCaption(sourceItemId),targetItemId);
System.out.print("added");
}
private void Drag(){
tree1().setDragMode(TreeDragMode.NODE);
//允许所有节点都有子节点
对于(最终对象itemId:tree2().getItemIds()){
tree2().setChildrenAllowed(itemId,true);
}
tree2().setDragMode(TreeDragMode.NODE);
setDropHandler(新的TreeSortDropHandler(tree2(),tree1());
}
公共类TreeSortDropHandler实现DropHandler{
私有最终树2;
私有最终树1;
/**
*树必须使用{@link HierarchicalContainer}。
*
*@param树
*/
public TreeSortDropHandler(最终树tree2,
最终树1){
this.tree2=tree2;
this.tree1=tree1;
}
@凌驾
公共AcceptCriteria GetAcceptCriteria(){
//TODO自动生成的方法存根
返回AcceptAll.get();
}
@凌驾
公共作废删除(DragAndDropEvent dropEvent){
//TODO自动生成的方法存根
final Transferable t=dropEvent.getTransferable();
//请参阅getAcceptCriteria()中的注释
如果(t.getSourceComponent()!=tree1
||!(数据边界的t实例){
返回;
}
最终TreeTargetDetails dropData=((TreeTargetDetails)dropEvent
.getTargetDetails());
最终对象sourceItemId=((DataBoundTransferable)t).getItemId();
//修正:为什么“结束”,应该是“targetItemId”或只是
//“getItemId”
最终对象targetItemId=dropData.getItemIdOver();
//位置描述放置在节点的哪个部分
//放置
最终垂直droplocation位置=dropData.getDropLocation();
moveNode(sourceItemId、targetItemId、位置);
}
私有void moveNode(最终对象sourceItemId,
对象targetItemId,最终垂直放置位置){
最终HierarchicalContainer=(HierarchicalContainer)树1
.getContainerDataSource();
如果(位置==垂直位置.中间){
if(tree1.hasChildren(sourceItemId))
{
Collection children=tree1.getChildren(sourceItemId);
tree2.addItem(tree1.getItemCaption(sourceItemId));
tree2.setParent(tree1.getItemCaption(sourceItemId),targetItemId);
targetItemId=tree2.getItem(tree1.getItemCaption(sourceItemId));
tree2.附加项(儿童);
setParent(子级,tree2.getItemCaption(sourceItemId));
System.out.print(tree2.getItem(tree1.getItemCaption(sourceItemId));
System.out.print(//已添加);
}否则{
tree2.addItem(tree1.getItemCaption(sourceItemId));
tree2.setParent(tree1.getItemCaption(sourceItemId),targetItemId);
系统输出打印(“添加”);
}