树 - 拖放节点 - 刷新? [英] Tree - drag&drop nodes - refresh?

查看:150
本文介绍了树 - 拖放节点 - 刷新?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个与smartgwt Tree结构相关的问题。
我创建一个树(称为 nodesTree ),其值来自一个DB,每个节点都有一个名称设置。
如果我有4个节点(数字是节点的名称):

  1 




(TreeNode node:nodesTree.getAllNodes())
System.out.print(node.getName());

输出: 1 2 3 4 p>

如果我在节点1下拖动节点4(与2级相同)

  1 
2
4
3

我想要具有节点的顺序: 1 2 4 3 ,但如果我重复上述for语句,输出将与上述相同: 1 2 3 4



TreeGrid.refreshFields()不工作。



我正在使用smartgwt 2.4。



谢谢。



稍后编辑



树被手动填充。我从代码手动添加节点到树中,这取决于我从DB接收的一些值。

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

稍后编辑(15 febr。2011):
一些更多的代码:

  private static final String NAVPATH_ROOT =/; 

//树结构
树nodesTree = new Tree();
nodesTree.setRootValue(NAVPATH_ROOT);
nodesTree.setModelType(TreeModelType.PARENT);

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

//添加第一个节点
TreeNode newNode = new TreeNode();
newNode.setName(a);
nodesTree.add(newNode,NAVPATH_ROOT);

//添加第二个节点
newNode = new TreeNode();
newNode.setName(ab);
nodesTree.add(newNode,NAVPATH_ROOT);

//将第三个节点添加到树
newNode = new TreeNode();
newNode.setName(abc);
nodesTree.add(newNode,NAVPATH_ROOT);

navTreeGrid.addDropHandler(new DropHandler()
{
@Override
public void onDrop(DropEvent event)
{
resetNodesAttributes() ;

});

//我希望在这个方法中,在拖放& drop操作之后,有顺序的节点。
//例如,如果我拖&下面的节点abc在a下我想要下面的方法以这个顺序发布
//节点: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();
}
}) ;

它工作正常,但是当我拖动输出为:

  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(){
//树结构
nodesTree = new Tree();
nodesTree.setRootValue(NAVPATH_ROOT);
nodesTree.setModelType(TreeModelType.PARENT);

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

//添加第一个节点
TreeNode newNode = new TreeNode();
newNode.setName(a);
nodesTree.add(newNode,NAVPATH_ROOT);

//添加第二个节点
newNode = new TreeNode();
newNode.setName(ab);
nodesTree.add(newNode,NAVPATH_ROOT);

//将第三个节点添加到树
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(){
//这里我想要在d& d动作之后得到节点的新顺序
(TreeNode node :nodesTree.getAllNodes()){
System.out.println(node.getName());
}
}

}


解决方案

将输出包含在 DeferredCommand 中,您将得到正确的输出。

  public class HelloGwt implements EntryPoint 
{
public void onModuleLoad()
{
树树= 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()
{
(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);
返回节点;
}
}


I have a problem related to a smartgwt Tree structure. I'm creating a Tree (called nodesTree) with values from a DB, and each node has a name set up. For ex I'm having 4 nodes (the numbers are the names of the nodes):

1
  2
3
  4

for (TreeNode node : nodesTree.getAllNodes())
   System.out.print(node.getName());

Output: 1 2 3 4

If I drag node 4 under node 1(at the same level as 2)

1
  2
  4
3

I want to have the order of nodes: 1 2 4 3 but if I repeat the above "for" statement the output will be the same as above: 1 2 3 4.

TreeGrid.refreshFields() does not work.

I'm using smartgwt 2.4.

Thank you.

Later edit:

The tree is manually populated. I'm adding the nodes to the tree manually from code, accoding to some values that I'm receiving from DB.

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

Later edit (15 febr. 2011): Some more code:

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

Later edit:

I've added a DataChangedHandler to Tree widget like this:

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

It is working fine but when I drag& drop for example node "abc" under node "a" the output is:

a  ab  a  abc  ab  a  abc  ab

so, seems that the method resetNodesAttributes it is called 3 times - and I do not want this - I need to be called just one time. Also the name of nodes are changing sometimes and than I do not want this method to be called.

Later edit (18 february):

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

}

解决方案

Wrap your output in a DeferredCommand, and you'll get the correct output.

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

这篇关于树 - 拖放节点 - 刷新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆