1

Google Web ツールキット (v2.5) TreeViewModel を使用して、セルごとに 1 つのクリック可能なリンクを持つセルのツリーを作成しようとしています。ツリーは正しく表示されていますが、セルをクリックしたときのイベントの処理方法がわかりません。私のクラス 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 のオーバーライドについて読んだことはすべて、CellTree ではなく、CellTable 内のセルに関係していました。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 に答える