如何将小部件放在CellTable单元格中?

时间:2011-01-29 06:38:59

标签: gwt gwt-celltable

我正在使用CellTable来显示我的记录,但现在我想在用户点击一个单元格时显示一个选择框。还有一件事是选择框是我自己的小部件,而不是预定义的。你能告诉我任何这样做的方法吗?

5 个答案:

答案 0 :(得分:24)

GWT google小组上有一篇文章讨论the answer。基本上你正常创建自定义小部件,在render函数中你使用widget.getElement()。getInnterHTML()。

@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()); 
        }
}

答案 1 :(得分:10)

这是一种反模式。单元格的整个目的是让你没有小部件:你应该直接在单元格中“渲染”html。

答案 2 :(得分:7)

  

GWT google小组上有一篇文章讨论了答案。基本上你正常创建自定义小部件,在render函数中你使用widget.getElement()。getInnterHTML()。

@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!!!
    }
});

答案 3 :(得分:2)

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

通常,您可以实施特定的细胞类,扩展AbstractCellActionCell。在这种情况下,您将不得不重写render()方法并实现自己的渲染。 AbstractCell class javadoc中给出了很好的例子。

答案 4 :(得分:0)

我认为@Kel提供了最接近的答案,我使用他的答案,发现ActionCell可以使用IdentityColumnCellTable可以使用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");