我有一個與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());
}
}
後來編輯:
我添加了一個DataChangedHandler
到Tree
部件像這樣:
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());
}
}
}
@Paul culd你可能會展示更多的代碼,以便更容易地看到你在做什麼。你有沒有自定義的d&d行爲,或者你只是使用setCanReparentRecords方法?樹是使用DataSource填充的,還是手動填充它? – 2011-02-11 09:38:55
@Banand:對不起。我沒有自定義d&d行爲,我正在使用setCanReparentRecords方法。我編輯了這個問題。 – Paul 2011-02-11 10:53:12