1

我正在尝试使用 Google web toolkit (v2.5) TreeViewModel 创建一个单元格树,每个单元格有一个可点击的链接。我的树正确显示,但我无法弄清楚单击单元格时如何处理事件。我的类 NeoTreeModel 实现了 TreeViewModel,但是当我在 getNodeInfo 中创建一个 AbstractCell 并尝试覆盖 onBrowserEvent 时,我收到编译错误“方法没有覆盖或实现超类型中的方法”。我不致力于这种方法。我会对任何可以单击按钮或链接树并能够处理事件的解决方案感到满意。我已经尝试了几个小时来完成我认为很容易的事情。

public class NeoTreeModel implements TreeViewModel {
  private List<NeoTreeItem>  _items    = null;
  private Logger             _logger   = Logger.getLogger("NeoTreeModel ");

  public NeoTreeModel(List<NeoTreeItem> items) { 
   _items = items;
  }

  public <T> NodeInfo<?> getNodeInfo(T value) {
    List<NeoTreeItem> list = new ArrayList<NeoTreeItem>();

    if (value == null) {
      for (NeoTreeItem nti: _items) if (nti.getLevel() == 0) list.add(nti);
    } else if (value instanceof NeoTreeItem) {
      list = ((NeoTreeItem)value).getChildren();
    } else {
      _logger.log(Level.SEVERE, "Got request for unknown type: " + value);
    }

    ListDataProvider<NeoTreeItem> provider = 
      new ListDataProvider<NeoTreeItem>(list);

    Cell<NeoTreeItem> cell = new AbstractCell<NeoTreeItem>() {

      public void render(Cell.Context context, NeoTreeItem value, 
                 SafeHtmlBuilder sb) {
        if (value != null) {
          sb.appendHtmlConstant("<a href='javascript:;'>");
          sb.appendEscaped(value.getLongName());
          sb.appendHtmlConstant("</a>");
        }       
      }

      @Override
      public void onBrowserEvent(Cell.Context context, Element parent, 
                     NeoTreeItem value, NativeEvent event, 
                     ValueUpdater<NeoTreeItem> valueUpdater) {

          _logger.log(Level.INFO, "HOWDY2");
        }
      }
    };
    return new DefaultNodeInfo<NeoTreeItem>(provider, cell);
  }
  public boolean isLeaf(Object value) {
    boolean result = false;

    if (value instanceof NeoTreeItem) {
      result = ((NeoTreeItem) value).isLeaf();      
    }

    return result;
  }

}
4

2 回答 2

0

问题出在您的代码上。您使用的 onBrowserEvent 方法的原型与 AbstractCell 中的方法原型不同。原型应该是——

public void onBrowserEvent(Cell.Context context, Element parent, NeoTreeItem value, NativeEvent event, ValueUpdater<NeoTreeItem> valueUpdater )
{
}

区别在于 ValueUpdater<NeoTreeItem>。在您的代码中,它是 ValueUpdater< String >

于 2013-03-19T03:45:11.773 回答
0

好吧,我想我明白了。我读到的关于覆盖 onBrowserEvent 的所有内容都与 CellTable 中的单元格有关,而不是 CellTree。显然,您需要使用选择模型来检测何时选择了 CellTree 单元格。像这样:

SingleSelectionModel<NeoTreeItem> _selectionModel = new SingleSelectionModel<NeoTreeItem>();
_selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
    @Override
    public void onSelectionChange(SelectionChangeEvent event) {
      Object object = _selectionModel.getSelectedObject();
      if (object instanceof NeoTreeItem) {
    Window.alert("HOWDY1: " + object.toString());
      }
    }});

   Cell<NeoTreeItem> cell = new AbstractCell<NeoTreeItem>() {

      public void render(Cell.Context context, NeoTreeItem value, 
             SafeHtmlBuilder sb) {
    if (value != null) {
           // blah
      }
    };

    return new DefaultNodeInfo<NeoTreeItem>(provider, cell,
                        _selectionModel, null);
于 2013-03-19T17:17:47.203 回答