2011-02-11 151 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; 
    } 
}