У меня проблема с древовидной структурой smartgwt.Я создаю дерево (называемое nodesTree
) со значениями из БД, и каждому узлу присвоено имя.Например, у меня есть 4 узла (числа - это имена узлов):
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
, но если я повторю вышеупомянутое выражение "for", вывод будет таким же, как и выше: 1 2 3 4
.
TreeGrid.refreshFields()
не работает.
Я использую smartgwt 2.4.
Спасибо.
Позжеedit :
Дерево заполняется вручную.Я добавляю узлы в дерево вручную из кода в соответствии с некоторыми значениями, которые я получаю из БД.
Tree nodesTree = new Tree();
TreeGrid navTreeGrid = new TreeGrid();
navTreeGrid.setData(nodesTree);
navTreeGrid.setCanReorderRecords(true);
navTreeGrid.setCanReparentNodes(true);
Позднее редактирование (15 февраля 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 раза -и я не хочу этого - мне нужно позвонить только один раз.Также иногда меняются имена узлов, и я не хочу, чтобы этот метод вызывался.
Позднее редактирование (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());
}
}
}