【问题标题】:How can I put a widget in a CellTable Cell?如何将小部件放入 CellTable 单元格中?
【发布时间】:2011-06-17 15:48:18
【问题描述】:

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

【问题讨论】:

  • 请在您的帖子中don't use signatures or taglines
  • 我有同样的问题 - 我需要将一些相当重量级的小部件(就它们的逻辑而言)渲染到表格中的单元格中。我希望 CellTable 能够提供一个 IsWidget 工厂,用于生成用于呈现列中每个单元格的小部件。我看不到一个简单的方法来做到这一点,但我宁愿不从头开始实现表。

标签: gwt gwt-celltable


【解决方案1】:

GWT google 小组中有一篇帖子讨论了the answer。基本上,您可以正常创建自定义小部件,并在渲染函数中使用 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.getElement.getInnerHTML(),而是使用了widget.getElement.getString(),因为它包含了外部HTML。
  • 是否可以重用相同的小部件来呈现每个单元格的 HTML? (我可能应该写一些代码来找出答案..但只是很感兴趣..)
【解决方案2】:

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

【讨论】:

【解决方案3】:

GWT google group 上有一篇帖子讨论了答案。基本上,您可以正常创建自定义小部件,并在渲染函数中使用 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!!!
    }
});

【讨论】:

【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    我认为@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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多