GWT:处理复合单元格中的事件

CompositeCell让我们使用Java自定义GWT中表格单元格的内容。 我们可以将几乎任何其他组的小部件放在表格的单元格中,并根据需要进行布局。 问题是如果我们使用html标签来定义CompositeCell的布局作为另一个表(参见下面的CompositeCell匿名类实现),我们将松开对单元组件的事件处理:(。

运行以下代码,当我们单击单元格的按钮时,将实现弹出响应事件处理IF WE COMMENT CompositeCell匿名实现。

我一直在调试CompositeCell.onBrowserEvent(Context,Element,C,NativeEvent,ValueUpdater),因为我认为使用HTML表标签定义单元格布局会破坏GWT小部件层次结构中的事件链,但到目前为止还没有成功。

备注:代码的注释和未注释版本实现相同的GUI布局。 这个例子只是为了表明我们在定制单元格内容时松散了事件处理。

public class ActionCellTest implements EntryPoint { private static final String SERVER_ERROR = "An error occurred while " + "attempting to contact the server. Please check your network " + "connection and try again."; private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class); public void onModuleLoad() { CellTable table = new CellTable(); final List<HasCell> cells = new LinkedList<HasCell>(); cells.add(new HasCellImpl("first name", new ActionCell.Delegate() { @Override public void execute(Person object) { Window.alert(object.getFirstName()); } })); cells.add(new HasCellImpl("last name", new ActionCell.Delegate() { @Override public void execute(Person object) { Window.alert(object.getLastName()); } })); CompositeCell cell = new CompositeCell(cells) { @Override public void render(Context context, Person value, SafeHtmlBuilder sb) { sb.appendHtmlConstant(""); for (HasCell hasCell : cells) { render(context, value, sb, hasCell); } sb.appendHtmlConstant("
"); } @Override protected void render(Context context, Person value, SafeHtmlBuilder sb, HasCell hasCell) { Cell cell = hasCell.getCell(); sb.appendHtmlConstant(""); cell.render(context, hasCell.getValue(value), sb); sb.appendHtmlConstant(""); } @Override protected Element getContainerElement(Element parent) { return parent.getFirstChildElement().getFirstChildElement().getFirstChildElement(); } }; table.addColumn(new TextColumn() { @Override public String getValue(ActionCellTest.Person object) { return object.getFirstName() + " " + object.getLastName(); } }, "name"); table.addColumn(new Column(cell) { @Override public Person getValue(ActionCellTest.Person object) { return object; } }, "composite"); LinkedList data = new LinkedList(); data.add(new Person("Amy", "Reed")); data.add(new Person("Tim", "Gardner")); table.setRowData(data); RootPanel.get().add(table); } private class HasCellImpl implements HasCell { private ActionCell fCell; public HasCellImpl(String text, Delegate delegate) { fCell = new ActionCell(text, delegate); } @Override public Cell getCell() { return fCell; } @Override public FieldUpdater getFieldUpdater() { return null; } @Override public Person getValue(Person object) { return object; } } private class Person { private String fFirstName; private String fLastName; public Person(String first, String last) { fFirstName = first; fLastName = last; } public String getFirstName() { return fFirstName; } public String getLastName() { return fLastName; } } }

这是一个已知问题,将在即将到来的GWT 2.5(几周内)修复: http : //code.google.com/p/google-web-toolkit/issues/detail?id = 5714
(同时,您可以运行主干或尝试向后移动更改)