drag-and-drop - soltar - drag and drop que es
Árbol-arrastrar y soltar nodos-¿actualizar? (1)
Envuelva su salida en un DeferredCommand
, y obtendrá la salida correcta.
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;
}
}
Tengo un problema relacionado con una estructura de árbol de smartgwt. Estoy creando un árbol (llamado nodesTree
) con valores de un DB, y cada nodo tiene un nombre configurado. Por ejemplo, tengo 4 nodos (los números son los nombres de los nodos):
1
2
3
4
for (TreeNode node : nodesTree.getAllNodes())
System.out.print(node.getName());
Salida: 1 2 3 4
Si arrastro el nodo 4 debajo del nodo 1 (al mismo nivel que 2)
1
2
4
3
Quiero tener el orden de los nodos: 1 2 4 3
pero si repito la declaración anterior "para", la salida será la misma que la anterior: 1 2 3 4
.
TreeGrid.refreshFields()
no funciona.
Estoy usando smartgwt 2.4.
Gracias.
Edición posterior :
El árbol se llena manualmente. Estoy agregando los nodos al árbol manualmente desde el código, debido a algunos valores que recibo de DB.
Tree nodesTree = new Tree();
TreeGrid navTreeGrid = new TreeGrid();
navTreeGrid.setData(nodesTree);
navTreeGrid.setCanReorderRecords(true);
navTreeGrid.setCanReparentNodes(true);
Edición posterior (15 de febrero de 2011): Algunos más códigos:
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());
}
}
Edición posterior :
He agregado un widget DataChangedHandler
to Tree
como este:
nodesTree.addDataChangedHandler(new com.smartgwt.client.widgets.tree.DataChangedHandler()
{
@Override
public void onDataChanged(com.smartgwt.client.widgets.tree.DataChangedEvent dataChangedEvent)
{
resetNodesAttributes();
}
});
Está funcionando bien, pero cuando arrastro y coloco, por ejemplo, el nodo "abc" debajo del nodo "a", la salida es:
a ab a abc ab a abc ab
entonces, parece que el método resetNodesAttributes
se llama 3 veces, y no quiero esto, necesito que me llamen solo una vez. También el nombre de los nodos está cambiando a veces y no quiero que se llame este método.
Edición posterior (18 de febrero) :
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());
}
}
}