GWT 的单元格与 GWT Widget 不兼容。这意味着您无法将 GWT 小部件放置在单元格内并使其仍然起作用。不过,单元格确实有替代的事件处理机制(如下所述)
原因是 Cell 更接近无状态渲染器。给定一个数据对象,Cell 将输出 HTML。单个 Cell 将被一遍又一遍地重用 - 为页面上的各种元素生成 HTML - 并且从不维护对其创建的任何 DOM 元素的引用。
在上面的示例中,您调用“someWidget.toString()”。这样做只会返回您的小部件的 HTML 表示形式,并且会丢失您的事件处理。
处理单元格中的事件
自定义单元的 GWT 开发指南 http://code.google.com/webtoolkit/doc/latest/DevGuideUiCustomCells.html(有一些额外的细节)
要处理单元格中的事件,您需要重写一个名为的单独方法onBrowserEvent
。您还需要将您的单元配置为通过调用来接收特定事件的通知super('click', 'keydown')
在您的构造函数中包含您有兴趣收听的事件列表。
由于单元格是无状态渲染器,因此 onBrowserEvent 将传递所单击的渲染元素的上下文以及单元格渲染的原始数据对象。然后,您可以根据需要应用更改或操作 DOM。
以下是取自上面链接的开发指南的示例:
@Override
public void onBrowserEvent(
Context context,
Element parent,
String value,
NativeEvent event,
ValueUpdater<String> valueUpdater) {
// Let AbstractCell handle the keydown event.
super.onBrowserEvent(context, parent, value, event, valueUpdater);
// Handle the click event.
if ("click".equals(event.getType())) {
// Ignore clicks that occur outside of the outermost element.
EventTarget eventTarget = event.getEventTarget();
if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
doAction(value, valueUpdater);
}
}
}