GWT:关于向celltable添加自定义小部件丢失自定义小部件的事件

GWT:关于向celltable添加自定义小部件丢失自定义小部件的事件,gwt,Gwt,我们的要求是使用单元格中包含自定义小部件的CellTable创建一个可编辑的网格。自定义小部件具有与文本框关联的文本框和搜索按钮。要将自定义小部件添加为单元格,请创建AbstractEditableCell类(由GWT提供)的子类,并具有重写render()和onBrowserEvent()方法 自定义小部件单元格的render(上下文上下文、字符串值、安全html构建器sb)方法为小部件创建一个安全html,并将此安全html呈现到单元格中。但我面临的问题是,自定义小部件被正确呈现,但它丢失了

我们的要求是使用单元格中包含自定义小部件的
CellTable
创建一个可编辑的网格。自定义小部件具有与文本框关联的文本框和搜索按钮。要将自定义小部件添加为单元格,请创建
AbstractEditableCell
类(由GWT提供)的子类,并具有重写
render()
onBrowserEvent()
方法

自定义小部件单元格的
render(上下文上下文、字符串值、安全html构建器sb)
方法为小部件创建一个安全html,并将此安全html呈现到单元格中。但我面临的问题是,自定义小部件被正确呈现,但它丢失了其关联的事件。下面给出了中的渲染方法:

if (viewData.isEditing()) {
    textBoxSelector.setText(text);
    OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml safeHtmlObj = new OnlyToBeUsedInGeneratedCodeStringBlessedAsSafeHtml(textBoxSelector.toString());
    sb.append(safeHtmlObj);
} else {
  // The user pressed enter, but view data still exists.
  sb.append(html);
}
如果我尝试使用以下代码在
render()
方法中添加小部件,它不会添加小部件

    int left = parent.getAbsoluteLeft();
    int top = parent.getAbsoluteTop();
    String elementId = "ID" + left + top;
    try {
        parent.setId(elementId);
        // parent.removeFromParent();
        RootPanel.get(elementId).add(textBoxSelector);
    } catch (AssertionError error) {
        RootPanel.get(elementId).add(textBoxSelector);
    }

如果有人能指导我在
CellTable
中添加小部件而不丢失相关事件,我将不胜感激

GWT的单元格与GWT小部件不兼容。这意味着您不能将GWT小部件放在单元格中,而让它仍能正常工作。不过,单元确实有一种替代的事件处理机制(如下所述)

这是因为单元格更接近无状态渲染器。给定一个数据对象,单元格将吐出HTML。一个单元格将被反复使用——为页面上的各种元素输出HTML——并且从不维护对它创建的任何DOM元素的引用

在上面的示例中,调用“someWidget.toString()”。这样做只会返回小部件的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);
    }
  }
}
@覆盖
公开无效onBrowserEvent(
语境,
元素父元素,
字符串值,
NativeEvent事件,
ValueUpdater(ValueUpdater){
//让AbstractCell处理keydown事件。
onBrowserEvent(上下文、父级、值、事件、值更新程序);
//处理单击事件。
如果(“单击“.equals(event.getType())){
//忽略在最外层元素之外发生的单击。
EventTarget EventTarget=event.getEventTarget();
if(parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))){
doAction(值、值更新程序);
}
}
}