单击GWT CellTree的节点时尝试填充详细信息部分

时间:2014-04-02 20:52:36

标签: java gwt

过去2年一直是stackoverflow的用户,但这是我的第一篇文章。我已经构建了一个从db(RPC调用)填充的CellTree,其中树的每个级别都是不同的对象(类)。主持人 - >组 - >对象 - >元件。我想要做的是填写一个"详细信息"我的表单上的部分允许用户编辑单击的节点的详细信息,最终显示该类的属性。在我的TreeViewModel的getNodeInfo部分中,我为每个类/对象创建了一个AbstractCell。然后,我为每个单元格添加了一个单击处理程序,以捕获用户单击的值/对象。我能够看到正确的值,我有" System.out.println"代码行。我被困的地方是能够将该对象传递回表单。

这是我的代码,如果您需要更多信息,请告诉我...我阻止了3个级别的代码,因为它基本相同,除了不同的类。

public <T> NodeInfo<?> getNodeInfo(final T value) {
  // build root host nodes
  if (value == null) {
    final ListDataProvider<Host> dataProvider = new ListDataProvider<Host>();
    AsyncCallback<ArrayList<Host>> callback = new AsyncCallback<ArrayList<Host>>() {
    public void onFailure(Throwable caught) {
      String details = caught.getMessage();
      System.out.println ("Error:  " + details);
    }
    @Override
    public void onSuccess(ArrayList<Host> result) {
      // Add the data to the data provider, which automatically pushes it to the widget.
      final List<Host> hostList = dataProvider.getList();
      for (int i = 0; i < result.size(); i++) {
        Host host = new Host();
        host.setHost_id(result.get(i).getHost_id());
        host.setHost(result.get(i).getHost());
        hostList.add(host);
      }  
    }
  };  
  termSvc.getHosts(callback);
  Cell<Host> cell = new AbstractCell<Host>() {
    public void render(Context context, Host value, SafeHtmlBuilder sb) {
      if (value != null) {
        sb.appendEscaped(value.getHost());
      }
    }
  };
  selectionModelHost.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
    public void onSelectionChange(SelectionChangeEvent event) {
      // TODO Auto-generated method stub
      Host selected = ((SingleSelectionModel<Host>) selectionModelHost).getSelectedObject();
      System.out.println ("Value: " + selected.getHost());
    }
  });
  return new DefaultNodeInfo<Host>(dataProvider, cell, selectionModelHost, null);
  }
  // if its a host then go get the objects
  else if (value instanceof Host) {
    // ....................
  }
  // if its a Group then go get the objects
  else if (value instanceof Group) {
    // ....................
  }
  // if its an object, go get the elements
  else if (value instanceof DGObject) {
    // ....................
  }
  return null;
}

我看到了这个帮助:GWT CellTree with an optional pop-up menu triggered on click of a TreeNode并且我在GWT示例上建立了很多代码。我已经搜索了一个答案,所以希望我朝着正确的方向前进,而不是问一些已经回答的问题。谢谢

-------------在Andrea回答之后补充道:

这是调用celltree的表单。目前我只在表单上有一个标签和celltree,因为我试图在表单上确定用户点击的节点。我成功地填充了树(并且会考虑清理它)但是很难知道在树中选择的对象(节点)是填充标签。

public class TabAssetPanel extends Composite {

  interface MyUiBinder extends UiBinder<Widget, TabAssetPanel> {
    Widget createAndBindUi(TabAssetPanel tabAssetPanel);
  }

  private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

  @UiField
  CellTree assetCellTree;
  @UiField
  Label assetSelected;

  public TabAssetPanel () {
    initWidget(uiBinder.createAndBindUi(this));

    final SingleSelectionModel<String> selectionModel = new SingleSelectionModel<String>();
    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
      public void onSelectionChange(SelectionChangeEvent event) {
        String selected = selectionModel.getSelectedObject();
        assetSelected.setText(selected);
      }
    }); 

    AssetTreeViewModel model = new AssetTreeViewModel(selectionModel);
    CellTree assetCellTree = new CellTree(model, "root");
    assetCellTree.setVisible(true);
  }

  @UiFactory
  CellTree makeCellTree() { 

    final SingleSelectionModel<String> selectionModel = new SingleSelectionModel<String>();
    selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
      public void onSelectionChange(SelectionChangeEvent event) {
        String selected = selectionModel.getSelectedObject();
        assetSelected.setText(selected);
      }
    }); 

    AssetTreeViewModel model = new AssetTreeViewModel(selectionModel);
    return new CellTree(model, null);
  }
}

1 个答案:

答案 0 :(得分:0)

对我来说没问题。也许getNodeInfo()方法中的代码太多,所以请尝试重构一下,抽出AsyncCallbackDataProvider

但是无论如何,当你掌握了你选择的对象时,要填充你的表格(我假设是在其他地方),我会创建一个回调来在你的SelectionModel内打电话或找到一个方法在您可以访问表单元素的位置注册选择处理程序,或使用应用程序范围的事件总线,在该事件总线上发布事件的其他部分(例如,保存表单的视图)正在监听。

这完全取决于您的应用程序的结构,没有正确的解决方案。如果您使用活动&amp;地方框架,事件总线是,恕我直言,一个没有脑子的解决方案。

此外,您甚至可以将您的逻辑转换为您的树只包含已支持对象的标识符,然后您可以使用此类ID发布地点更改(通过PlacesHistory)通过查询服务器以获取正确的对象,应用程序的其他部分将对此类更改做出反应(简单地说:树包含节点的可视化表示,但是对于真实对象的调用是在其他地方完成的,在那里你实际上需要它。)

再次,只是猜测。

希望有所帮助。