Дерево - перетаскивать узлы - обновлять? - PullRequest
2 голосов
/ 11 февраля 2011

У меня проблема с древовидной структурой 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());
        }
    }

}

1 Ответ

4 голосов
/ 21 февраля 2011

Оберните ваш вывод в 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;
  }
}
...