在没有UiBinder的情况下使用GWT-Editors

时间:2015-01-10 10:00:59

标签: java user-interface gwt uibinder

我想通过使用编辑器来绑定POJO来改进我的gwt项目的代码,我曾经手动地来回解析小部件。但是我发现documentation令人困惑,主要是因为它引用了ui binder,这是我还没想到的另一个功能。

使用没有ui binder的编辑器是否有意义?我的ParentDTO包含许多childDTO。下面的代码片段展示了我如何尝试将TextArea扩展的一些ChildEditors嵌套到我的ParentEditor中(试图将其删除到基本要素):

public class MyEditorPage {

    // editors
    class ParentDTOEditor implements Editor<ParentDTO> {
        Integer dataBaseId;
        List<ChildDTOEditor> childs;

        public void attach(RootPanel rootPanel) {
            for (ChildDTOEditor widget : childs) {
                rootPanel.add(widget);
            }
        }
    }
    class ChildDTOEditor implements Editor<ChildDTO> extends TextArea {}

    // driver
    interface Driver extends SimpleBeanEditorDriver<ParentDTO, ParentDTOEditor> {}
    Driver driver = GWT.create(Driver.class);

    // load set widgets to the root panel
    public void loadPage(RootPanel rootPanel) {

        // get pojos from server
        myService.getSuff(...
            ...
            public void onSuccess(ParentDTO result) {
                ParentDTOEditor editor = new ParentDTOEditor();
                driver.initialize(editor);
                driver.edit(result);
                editor.attach(rootPanel);                   
            }
    }

    // save
    public void save() {
        ParentDTO dto = driver.flush();
        ... // call myService.saveStuff(dto,...
    }
}

我是否需要单独的编辑器或只是ListEditor类型的父编辑器直接保存子dtos?

1 个答案:

答案 0 :(得分:1)

  

使用没有ui活页夹的编辑器是否有意义?

是的,这些功能是独立的,每个功能都可以在没有其他功能的情况下使用。

  

我是否需要单独的编辑器或只需ListEditor类型的父编辑器直接保存子dtos?

您可以直接创建ListEditor实施,但如果您通过扩展Editor<ChildDTO>并使用{{1}告诉它如何创建和销毁EditorSource<ChildDTOEditor>,GWT可以为您做到这一点}

这是一个不错的例子here,但我会在这里提出最低限度的实施。

ListEditor.of(new YourChildDTOEditorSourceImpl())

现在您可以创建一个编辑器驱动程序并像使用普通编辑器一样使用它,但是将其传递给列表。

public class FooEditor extends Composite implements Editor<Foo> {

    // Implement one of uibinder+fields, fields, methods, or LeafValueEditor.set/getValue()

    public FooEditor() {
        initWidget(/* root widget or call to uiBinder.createAndBindUi(this) */)
    }

}

public class FooListEditor extends Composite implements IsEditor<ListEditor<Foo, FooEditor>> {

    private class FooEditorSource extends EditorSource<FooEditor> {
        @Override
        public FooEditor create(int index) {
            FooEditor subEditor = new FooEditor();

            // any additional per-item config can go here, e.g wiring up delete handler

            listPanel.insert(subEditor, index);

            return subEditor;
        }

        @Override
        public void dispose(FooEditor subEditor) {
            subEditor.removeFromParent();
        }

        @Override
        public void setIndex(FooEditor subEditor, int index) {
            listPanel.insert(subEditor, index);
        }
    }

    // FlowPanel or anything else you want to use to hold the sub-editors.
    // Instantiated explicitly or through uibinder.
    FlowPanel listPanel = new FlowPanel(); 


    // Let GWT handle the ListEdiotr implementation
    ListEditor<Foo, FooEditor> editor = ListEditor.of(new FooEditorSource());

    public FooListEditor() {
        initWidget(listPanel /* or uiBinder.createAndBindUi(this) */);
    }

    @Override
    public ListEditor<Foo, FooEditor> asEditor() {
        return editor;
    }

}