2011-02-11 110 views
2

我有一个与smartgwt树结构有关的问题。 我使用来自DB的值创建了一棵树(名为nodesTree),并且每个节点都有一个名称设置。 对于我具有4个节点EX(数字是节点的名称):树 - 拖放节点 - 刷新?

1 
    2 
3 
    4 

for (TreeNode node : nodesTree.getAllNodes()) 
    System.out.print(node.getName()); 

输出:1 2 3 4

如果我拖动节点4下节点1(在相同的水平2)

1 
    2 
    4 
3 

我想有节点的顺序:1 2 4 3但如果我重复以上“的”语句的输出将与上面相同:1 2 3 4

TreeGrid.refreshFields()不起作用。

我正在使用smartgwt 2.4。

谢谢。

后来编辑

树手动填充。我将代码中的节点手动添加到树中,根据我从数据库接收的一些值进行调整。

Tree nodesTree = new Tree(); 
TreeGrid navTreeGrid = new TreeGrid(); 
navTreeGrid.setData(nodesTree); 
navTreeGrid.setCanReorderRecords(true); 
navTreeGrid.setCanReparentNodes(true); 

后来编辑(15 febr 2011): 更多的代码:

private static final String NAVPATH_ROOT = "/"; 

// Tree structure 
Tree nodesTree = new Tree(); 
nodesTree.setRootValue(NAVPATH_ROOT); 
nodesTree.setModelType(TreeModelType.PARENT); 

TreeGrid navTreeGrid = new TreeGrid(); 
navTreeGrid.setCanReorderRecords(true); 
navTreeGrid.setCanReparentNodes(true); 
navTreeGrid.setData(nodesTree); 

// add first node 
TreeNode newNode = new TreeNode(); 
newNode.setName("a"); 
nodesTree.add(newNode, NAVPATH_ROOT); 

// add the second node 
newNode = new TreeNode(); 
newNode.setName("ab"); 
nodesTree.add(newNode, NAVPATH_ROOT); 

// add the third node to the tree 
newNode = new TreeNode(); 
newNode.setName("abc"); 
nodesTree.add(newNode, NAVPATH_ROOT); 

navTreeGrid.addDropHandler(new DropHandler() 
{ 
    @Override 
    public void onDrop(DropEvent event) 
    { 
     resetNodesAttributes(); 

    }); 

// I want in this method to have the order of nodes after drag&drop action was made. 
// for example if I drag& drop node "abc" under "a" I want the method below to post 
// nodes in this order: a abc ab 
public void resetNodesAttributes(){ 
    for (TreeNode node : nodesTree.getAllNodes()) { 
     System.out.println("---:" + node.getName()); 
    } 
} 

后来编辑

我添加了一个DataChangedHandlerTree部件像这样:

nodesTree.addDataChangedHandler(new com.smartgwt.client.widgets.tree.DataChangedHandler() 
{ 
    @Override 
    public void onDataChanged(com.smartgwt.client.widgets.tree.DataChangedEvent dataChangedEvent) 
    { 
     resetNodesAttributes(); 
    } 
}); 

它工作正常,但是当我拖累&下降例如节点“ABC”在节点“a”的输出为:

a ab a abc ab a abc ab 

如此,似乎resetNodesAttributes它被称为3倍的方法 - 我不要这样 - 我只需要被调用一次。此外,节点的名称有时会发生变化,并且我不希望调用此方法。

后来编辑(2月18日)

package de.vogella.gwt.helloworld.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.smartgwt.client.types.TreeModelType; 
import com.smartgwt.client.widgets.events.DropEvent; 
import com.smartgwt.client.widgets.events.DropHandler; 
import com.smartgwt.client.widgets.tree.Tree; 
import com.smartgwt.client.widgets.tree.TreeGrid; 
import com.smartgwt.client.widgets.tree.TreeNode; 

public class HelloGwt implements EntryPoint { 

    private static final String NAVPATH_ROOT = "/"; 
    Tree nodesTree = null; 

    @Override 
    public void onModuleLoad() { 
     // Tree structure 
     nodesTree = new Tree(); 
     nodesTree.setRootValue(NAVPATH_ROOT); 
     nodesTree.setModelType(TreeModelType.PARENT); 

     TreeGrid navTreeGrid = new TreeGrid(); 
     navTreeGrid.setCanReorderRecords(true); 
     navTreeGrid.setCanReparentNodes(true); 
     navTreeGrid.setData(nodesTree); 

     // add first node 
     TreeNode newNode = new TreeNode(); 
     newNode.setName("a"); 
     nodesTree.add(newNode, NAVPATH_ROOT); 

     // add the second node 
     newNode = new TreeNode(); 
     newNode.setName("ab"); 
     nodesTree.add(newNode, NAVPATH_ROOT); 

     // add the third node to the tree 
     newNode = new TreeNode(); 
     newNode.setName("abc"); 
     nodesTree.add(newNode, NAVPATH_ROOT); 

     navTreeGrid.addDropHandler(new DropHandler() { 
      @Override 
      public void onDrop(DropEvent event) { 
       resetNodesAttributes(); 
      } 
     }); 

     RootPanel.get().add(navTreeGrid); 
    } 

    public void resetNodesAttributes() { 
     // here I want to have the new order of nodes after d&d action was made 
     for (TreeNode node : nodesTree.getAllNodes()) { 
      System.out.println(node.getName()); 
     } 
    } 

} 
+1

@Paul culd你可能会展示更多的代码,以便更容易地看到你在做什么。你有没有自定义的d&d行为,或者你只是使用setCanReparentRecords方法?树是使用DataSource填充的,还是手动填充它? – 2011-02-11 09:38:55

+0

@Banand:对不起。我没有自定义d&d行为,我正在使用setCanReparentRecords方法。我编辑了这个问题。 – Paul 2011-02-11 10:53:12

回答

4

包装你的输出在DeferredCommand,你会得到正确的输出。

public class HelloGwt implements EntryPoint 
{ 
    public void onModuleLoad() 
    { 
    Tree tree = new Tree(); 
    tree.setModelType(TreeModelType.PARENT); 

    final TreeGrid grid = new TreeGrid(); 
    grid.setCanReorderRecords(true); 
    grid.setCanReparentNodes(true); 
    grid.setData(tree); 

    tree.add(createNode("a"), tree.getRoot()); 
    tree.add(createNode("b"), tree.getRoot()); 
    tree.add(createNode("c"), tree.getRoot()); 

    grid.addFolderDropHandler(new FolderDropHandler(){ 

    public void onFolderDrop(FolderDropEvent event) 
    { 
     DeferredCommand.addCommand(new Command() 
     { 
     public void execute() 
     { 
      for (ListGridRecord node : grid.getRecords()) 
      System.out.println(Tree.nodeForRecord(node).getName()); 
     }}); 
     }}); 


    RootPanel.get().add(grid); 
    } 

    private TreeNode createNode(String name) 
    { 
    TreeNode node = new TreeNode(); 
    node.setName(name); 
    node.setID(name); 
    return node; 
    } 
}