使用Vaadin 7在两棵树之间拖放

使用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

我有两棵树:tree1,tree2,我想从tree1拖放到tree2。 问题是当我想移动一个完整的文件夹时,他的孩子们在树2中的位置不对。它们只是添加到tree2中,但没有得到它们的真正父文件夹(我拖动的文件夹)。事实上,我没有找到如何知道tree2中文件夹的新id。 这是我的密码:

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);
系统输出打印(“添加”);
}