Gwt 如何将小部件放入CellTable单元格?

Gwt 如何将小部件放入CellTable单元格?,gwt,gwt-celltable,Gwt,Gwt Celltable,我使用CellTable显示我的记录,但现在的问题是,当用户单击单元格时,我想显示一个选择框。还有一件事是,选择框是我自己的小部件,而不是预定义的。您能给我建议一下这样做的方法吗?不久前,我遇到了类似的问题(尝试将自定义小部件插入CellList单元格),但不幸的是,没有找到一个简单的解决方案 通常,您可以实现特定的单元类,扩展或。在这种情况下,必须重写render()方法并实现自己的渲染。这是一个很好的例子。中有一篇关于GWT谷歌集团的帖子讨论了这一问题。基本上,您可以正常创建自定义小部件,并

我使用CellTable显示我的记录,但现在的问题是,当用户单击单元格时,我想显示一个选择框。还有一件事是,选择框是我自己的小部件,而不是预定义的。您能给我建议一下这样做的方法吗?

不久前,我遇到了类似的问题(尝试将自定义小部件插入CellList单元格),但不幸的是,没有找到一个简单的解决方案


通常,您可以实现特定的单元类,扩展或。在这种情况下,必须重写render()方法并实现自己的渲染。这是一个很好的例子。

中有一篇关于GWT谷歌集团的帖子讨论了这一问题。基本上,您可以正常创建自定义小部件,并在呈现函数中使用widget.getElement().getInnterHTML()


这是一种反模式。单元格的全部用途是使您没有小部件:您应该直接在单元格中“呈现”html


GWT谷歌集团上有一篇帖子讨论了答案。基本上,您可以正常创建自定义小部件,并在呈现函数中使用widget.getElement().getInnterHTML()

它可以工作,但有一个限制:

  • 不能将任何处理程序直接附加到小部件上(外部或内部)
例如:

或:


我认为@Kel给出了最接近的答案,我使用了他的答案,我发现
ActionCell
可以使用
IdentityColumn
CellTable
可以使用
IdentityColumn

ActionCell<MyEntity> refreshCell = new ActionCell<>("Refresh", new ActionCell.Delegate<MyEntity>() {

  @Override
  public void execute(MyEntity entity) {
    //bla bla bla
  }
});
IdentityColumn<MyEntity> refreshColumn = new IdentityColumn<>(refreshCell);
cellTable.addColumn(refreshColumn, "Refresh");
ActionCell refreshCell=new ActionCell(“刷新”,new ActionCell.Delegate(){
@凌驾
公共作废执行(MyEntity实体){
//呜呜呜呜
}
});
IdentityColumn refreshColumn=新的IdentityColumn(refreshCell);
addColumn(refreshColumn,“Refresh”);

请发表您的帖子。我也有同样的问题-我需要将一些相当重的小部件(就其逻辑而言)呈现到表中的单元格中。我希望CellTable能够提供一个IsWidget工厂,用于生成用于呈现列中每个单元格的小部件。我看不出一个简单的方法来实现这一点,但我不想从头开始实现表。我使用的不是widget.getElement.getInnerHTML(),而是widget.getElement.getString(),因为它包含外部HTML。是否可以重用同一个小部件来呈现每个单元格的HTML?(我可能应该写一些代码来了解……但我很好奇……)为什么他们要在celltables中添加UIBinder小部件支持?(不完全是引用,但来自线程:)可能是,但有时不可避免我不同意,有时你不想麻烦HTML,只让GWT为你呈现小部件。有没有解决这个限制的方法?我真的很想实现这样一个功能。请看“thomas”的答案。请注意,只要单击列中的任何内容,就会触发单击事件。如果列中有两个按钮,则无法区分单击了哪个按钮。在这种情况下,请参考此答案-。
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) {
    if (value != null) {
         MyWidget widget = new MyWidget(value);
         sb.appendEscaped(widget.getElement.getInnerHTML()); 
    }
}
widget.addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        // Won't work!!!
    }
});
widget.getMyTextBox().addClickHandler(new ClickHandler() {
    @Override
    public void onClick(ClickEvent event) {
        // Won't work!!!
    }
});
ActionCell<MyEntity> refreshCell = new ActionCell<>("Refresh", new ActionCell.Delegate<MyEntity>() {

  @Override
  public void execute(MyEntity entity) {
    //bla bla bla
  }
});
IdentityColumn<MyEntity> refreshColumn = new IdentityColumn<>(refreshCell);
cellTable.addColumn(refreshColumn, "Refresh");