validar soltar que example ejemplos drop bootstrap arrastrar and drag-and-drop tree smartgwt

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()); } } }