【问题标题】:Tree - drag&drop nodes - refresh?树 - 拖放节点 - 刷新?
【发布时间】:2011-06-25 10:24:24
【问题描述】:

我有一个与 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。

谢谢。

稍后编辑

树是手动填充的。我从代码中手动将节点添加到树中,符合我从 DB 接收到的一些值。

Tree nodesTree = new Tree();
TreeGrid navTreeGrid = new TreeGrid();
navTreeGrid.setData(nodesTree);
navTreeGrid.setCanReorderRecords(true); 
navTreeGrid.setCanReparentNodes(true);

后期编辑(2011 年 2 月 15 日): 更多代码:

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

稍后编辑

我添加了一个 DataChangedHandlerTree 小部件,如下所示:

nodesTree.addDataChangedHandler(new com.smartgwt.client.widgets.tree.DataChangedHandler() 
{
   @Override
   public void onDataChanged(com.smartgwt.client.widgets.tree.DataChangedEvent dataChangedEvent) 
   {
        resetNodesAttributes();
   }
});

它工作正常但是当我拖放例如节点“a”下的节点“abc”时,输出是:

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 建议您可能会显示更多代码,以便更容易看到您在做什么。您是否有任何自定义 d&d 行为,或者您只是使用 setCanReparentRecords 方法?树是使用 DataSource 填充的,还是您手动填充的?
  • @Banand:对不起。我没有自定义 d&d 行为,我使用的是 setCanReparentRecords 方法。我已经编辑了问题。
  • @Paul 我建议您在树中添加一个 DataChangeHandler 并将打印输出放在那里。我认为您的输出不稳定的原因是由于一些时间问题,因此通过将输出代码放在更改处理程序的主体中,您将确保时间正常。当我说我想看代码时,我主要的意思是我想看代码的输出时间。现在如何检测到节点已被拖放。很抱歉我不是很清楚。
  • @Banang:抱歉耽搁了;我已经更新了我的问题。明天第一个小时我也会尝试添加一个 DataChangeHandler。
  • @Banang:我添加了一个DataChangedHandler - 但是这个处理程序中的方法被调用了很多次 - 我不希望这种情况发生。(也用这些信息更新了问题)怎么能我使用DropHandleronDrop 内部方法来重新排序节点?谢谢。

标签: drag-and-drop tree smartgwt


【解决方案1】:

将您的输出包装在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;
  }
}

【讨论】:

  • 哇,太好了!我不知道存在DeferredCommand。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多