3

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<Person> table = new CellTable<ActionCellTest.Person>();

        final List<HasCell<Person, ?>> cells = new LinkedList<HasCell<Person, ?>>();
        cells.add(new HasCellImpl("first name", new ActionCell.Delegate<Person>() {

            @Override
            public void execute(Person object) {
                Window.alert(object.getFirstName());
            }
        }));
        cells.add(new HasCellImpl("last name", new ActionCell.Delegate<ActionCellTest.Person>() {

            @Override
            public void execute(Person object) {
                Window.alert(object.getLastName());
            }
        }));

        CompositeCell<Person> cell = new CompositeCell<Person>(cells) {

            @Override
            public void render(Context context, Person value, SafeHtmlBuilder sb) {
                sb.appendHtmlConstant("<table><tbody><tr>");
                for (HasCell<Person, ?> hasCell : cells) {
                    render(context, value, sb, hasCell);
                }
                sb.appendHtmlConstant("</tr></tbody></table>");
            }

            @Override
            protected <X> void render(Context context, Person value, SafeHtmlBuilder sb, HasCell<Person, X> hasCell) {
                Cell<X> cell = hasCell.getCell();
                sb.appendHtmlConstant("<td>");
                cell.render(context, hasCell.getValue(value), sb);
                sb.appendHtmlConstant("</td>");
            }

            @Override
            protected Element getContainerElement(Element parent) {
                return parent.getFirstChildElement().getFirstChildElement().getFirstChildElement();
            }

        };
        table.addColumn(new TextColumn<ActionCellTest.Person>() {

            @Override
            public String getValue(ActionCellTest.Person object) {
                return object.getFirstName() + " " + object.getLastName();
            }
        }, "name");

        table.addColumn(new Column<Person, Person>(cell) {

            @Override
            public Person getValue(ActionCellTest.Person object) {
                return object;
            }
        }, "composite");

        LinkedList<Person> data = new LinkedList<ActionCellTest.Person>();
        data.add(new Person("Amy", "Reed"));
        data.add(new Person("Tim", "Gardner"));
        table.setRowData(data);

        RootPanel.get().add(table);
    }

    private class HasCellImpl implements HasCell<Person, Person> {
        private ActionCell<Person> fCell;

        public HasCellImpl(String text, Delegate<Person> delegate) {
            fCell = new ActionCell<Person>(text, delegate);
        }

        @Override
        public Cell<Person> getCell() {
            return fCell;
        }

        @Override
        public FieldUpdater<Person, Person> 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;
        }
    }
}
4

1 回答 1

2

这是一个已知问题,将在即将到来的 GWT 2.5(几周内)中修复:http
://code.google.com/p/google-web-toolkit/issues/detail?id=5714 (平均时间,您可以使用中继线或尝试向后移植更改)

于 2012-05-01T10:20:05.327 回答