我有一个有一个自定义列的CellTable,我手动渲染它,并把一个带有一堆HTMLPanel/Anchor/FlowPanel小部件的FlowPanel,其中包括DecoratorPanel。
DecoratorPanel呈现为一个表,当然。
渲染过程如下:
public class MyExpandableCell extends AbstractCell<String> {
...
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) {
if (value != null) {
FlowPanel fp = createDetailsFlowPanel(value);
sb.appendHtmlConstant(fp.getElement().getString());
}
}
现在,我已经为我的主CellTable添加了一个点击事件处理程序。在我的处理程序中,我遍历树来找到属于我的CellTable的第一个TR,通过检查它是否包含"偶数行"或"奇数行"CSS类。
然而,当点击发生在DecoratorPanel内部(这是在我的单元格表的TD),我的处理程序也被触发,因为点击属于单元格表区域。
我可以检测到这一点,我看到父TR没有CellTable CSS类。
问题:我如何返回处理这样的点击事件到DecoratorPanel -它真正属于哪里?就像现在一样,我的DecoratorPanel没有展开,我认为是因为我的点击处理程序拦截并抑制了CellTable级别的所有点击。
table = setupMyCellTable(PAGE_SIZE, CLIENT_BUNDLE, myCellTableResources);
mydataprovider.addDataDisplay(table);
table.sinkEvents(Event.ONCLICK);
table.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent e) {
boolean isClick = "click".equals(e.getNativeEvent().getType());
if (isClick) {
Element originalElement = e.getNativeEvent().getEventTarget().cast();
Element element = originalElement;
String ctTrClassEven = CLIENT_BUNDLE.mainCss().cellTableEvenRow();
String ctTrClassEven = CLIENT_BUNDLE.mainCss().cellTableOddRow();
// Looking for closest parent TR which has one
// of the two row class names (for this cellTable):
while (element != null
&& !"tr".equalsIgnoreCase(element.getTagName())
&& !(element.getClassName().contains(ctTrClassEven) ||
element.getClassName().contains(ctTrClassEven))) {
element = element.getParentElement();
}
if (element != null) {
if (element.getClassName().contains(ctTrClassEven)
|| element.getClassName().contains(ctTrClassEven)) {
// Found cell table's TR. Set new TR height.
} else {
// Found TR from DecoratorPanel inside of the celltable's cell.
// Do nothing. But how do I make sure
// that decorator panel processes this click and expands?
return;
// Did not work: NS_ERROR_ILLEGAL_VALUE javascript exception.
// if (originalElement != null) {
// originalElement.dispatchEvent(e.getNativeEvent());
// }
}
} else {
debugStr.setText("(did not find tr)");
}
}
}
}, ClickEvent.getType());
看起来像GWT中的一个bug,因为decorator panel使用table来呈现自己而触发:http://code.google.com/p/google-web-toolkit/issues/detail?id=5714(另一个例子http://code.google.com/p/google-web-toolkit/issues/detail?id=6750)
预计将随GWT 2.5一起发布