【问题标题】:Programmatically refresh a Gwt CellTree以编程方式刷新 Gwt CellTree
【发布时间】:2011-08-30 07:29:55
【问题描述】:

我想在当前工作的 CellTree 上触发“打开根节点”事件,它现在具有以下行为:

@Override
    public <T> NodeInfo<?> getNodeInfo(final T value) {
        return new DefaultNodeInfo<Categoria>(
                (value instanceof Categoria) ? 
                        createBranchDataProvider((Categoria)value) :
                        rootDataProvider, 
                new CategoriaCell()
        );
    }

private AsyncDataProvider<Categoria> createRootDataProvider() {
        AsyncDataProvider<Categoria> dataProvider = new AsyncDataProvider<Categoria>() {
            @Override
            protected void onRangeChanged(HasData<Categoria> display) {
                AsyncCallback<Categoria[]> cb = new AsyncCallback<Categoria[]>() {
                    @Override
                    public void onSuccess(Categoria[] result) {
                        updateRowCount(result.length, true);
                        updateRowData(0, Arrays.asList(result));
                    }
                    @Override
                    public void onFailure(Throwable caught) {
                        Window.alert(caught.toString());
                    }
                };  
                rpcService.getCategorie(cb);
            }
        };
        return dataProvider;
    }

如何触发“onRangeChanged”事件以刷新我的 1 级节点?

我的便捷方法缺少什么?

private void updateTree() {     
        TreeNode rootTreeNode = cellTree.getRootTreeNode();
        for (int i = 0; i < rootTreeNode.getChildCount(); i++) {
            rootTreeNode.setChildOpen(i, false);
        }
        // HOW TO REFRESH LEVEL-1 NODES?
    }

【问题讨论】:

    标签: gwt tree refresh cell gwt-rpc


    【解决方案1】:

    工作示例。添加对 DataProvider(和父节点)的引用(MyMenuItem 和 MyCell 在我的代码中带有 DataProvider)。添加元素刷新父级后。

    public class MyMenuItem {
        private String name;
        private String action; //some data
        private int level; //if needed
        private ArrayList<MyMenuItem> list; //nodes childrens
        private MyMenuItem parent; //track internal parent
        private MyCell cell; //for refresh - reference to visual component
    
        public void setCell(MyCell cell) {
            this.cell = cell;
        }
        public void refresh() {
          if(parent!=null) {
              parent.refresh();
          }
          if (cell!=null) {
              cell.refresh(); //refresh tree
          }
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAction() {
            return action;
        }
        public void setAction(String action) {
            this.action = action;
        }
        public MyMenuItem(String name, String action) {
            super();
            parent = null;
            level = 0;
            this.name = name;
            this.action = action;
            list = new ArrayList<MyMenuItem>();
        }
        public MyMenuItem(String name) {
            this(name, "");
        }
        public void addSubMenu(MyMenuItem m) {
            m.level = this.level+1;
            m.parent = this;
            list.add(m);
        }
    
        public boolean hasChildrens() {
            return list.size()>0;
        }
        public int getLevel() {
            return level;
        }
        public void setLevel(int level) {
            this.level = level;
        }
        public ArrayList<MyMenuItem> getList() {
            return list;
        }
        public MyMenuItem getParent() {
            return parent;
        }
    }
    
    public class MyTreeModel implements TreeViewModel {
        private MyMenuItem officialRoot; //default not dynamic
        private MyMenuItem studentRoot; //default not dynamic
        private MyMenuItem testRoot; //default not dynamic
        private MyMenuItem root;
    
        public MyMenuItem getRoot() { // to set CellTree root
            return root;
        }
    
        public MyTreeModel() {
            root = new MyMenuItem("root");
            // Default items
            officialRoot = new MyMenuItem("Official"); //some basic static data
            studentRoot = new MyMenuItem("Student");
            testRoot = new MyMenuItem("Test");
            root.addSubMenu(officialRoot);
            root.addSubMenu(studentRoot);
            root.addSubMenu(testRoot);
        }
    
        //example of add add logic
        private void addNew(MyMenuItem myparent, String name, String uid) {
            myparent.addSubMenu(new MyMenuItem(name, uid)); 
            myparent.refresh(); //HERE refresh tree
        }   
    
        @Override
        public <T> NodeInfo<?> getNodeInfo(T value) {
            ListDataProvider<MyMenuItem> dataProvider;
            MyMenuItem myValue = null;
            if (value == null) { // root is not set
                dataProvider = new ListDataProvider<MyMenuItem>(root.getList());
            } else {
                myValue = (MyMenuItem) value;
                dataProvider = new ListDataProvider<MyMenuItem>(myValue.getList());
            }
            MyCell cell = new MyCell(dataProvider); //HERE Add reference
            if (myValue != null)
                myValue.setCell(cell);
            return new DefaultNodeInfo<MyMenuItem>(dataProvider, cell);
        }
    
        @Override
        public boolean isLeaf(Object value) {
            if (value instanceof MyMenuItem) {
                MyMenuItem t = (MyMenuItem) value;
                if (!t.hasChildrens())
                    return true;
                return false;
            }
            return false; 
        }
    
    }
    
    public class MyCell extends AbstractCell<MyMenuItem> {
            ListDataProvider<MyMenuItem> dataProvider; //for refresh
            public MyCell(ListDataProvider<MyMenuItem> dataProvider) {
              super("keydown","dblclick");
              this.dataProvider = dataProvider;
            }
            public void refresh() {
                dataProvider.refresh(); 
            }
            @Override
            public void onBrowserEvent(Context context, Element parent, MyMenuItem value,
                NativeEvent event, ValueUpdater<MyMenuItem> valueUpdater) {
              if (value == null) {
                return;
              }
              super.onBrowserEvent(context, parent, value, event, valueUpdater);
              if ("click".equals(event.getType())) {
                this.onEnterKeyDown(context, parent, value, event, valueUpdater);
              }
              if ("dblclick".equals(event.getType())) {
                  this.onEnterKeyDown(context, parent, value, event, valueUpdater);
                }
            }
    
            @Override
            public void render(Context context, MyMenuItem value, SafeHtmlBuilder sb) {
              if (value == null) {
                return;
              }
              sb.appendEscaped(value.getName());
              //add HERE for better formating
            }
    
    
            @Override
            protected void onEnterKeyDown(Context context, Element parent,
                    MyMenuItem value, NativeEvent event, ValueUpdater<MyMenuItem> valueUpdater) {
              Window.alert("You clicked "+event.getType()+" " + value.getName());
            }
    
    
    }
    

    在模块中添加

     treeModel = new MyTreeModel();
     tree = new CellTree(treeModel,treeModel.getRoot());
    

    【讨论】:

      【解决方案2】:

      Level-1 节点(我想你是根节点下面的平均值)不能按照你的方式刷新。

      您必须将您的 dataProvider 实例存储在某处以用于 1 级节点。 稍后,当您刷新列表时,您必须为您的 1 级节点更新存储的 dataProvider。
      1 级以下的节点可以按照您的方式进行刷新。因为一旦您关闭 1 级节点(这就是您在 updateTree 方法中所做的事情)并且下次打开它时将调用 getNodeInfo 并且更新的子类别将被检索并显示在 CellTree 中。

      更新

      为了刷新附加到 AsyncDataProvider 的 CellWidgets,您可能必须扩展 AsyncDataProvider 并将 RPC 调用提取到在 onRangeChanged() 方法中调用的 getData() 方法或创建 interface with a refresh method 并实现它在调用受保护的 onRangeChanged() 方法的自定义 AsyncDataProvider 中。

      【讨论】:

      • > 好! ^___^ 但是......如何?!? -.-' 我的意思是,提供程序上唯一可用的方法是 updateRowData(),我是否必须复制 onRangeChanged() 中存在的 rpc 代码,或者我可以简单地以某种方式触发“范围更改”事件?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多