如何使用GWT';使用gwt平台的编辑器框架?

如何使用GWT';使用gwt平台的编辑器框架?,gwt,gwt-platform,gwt-editors,Gwt,Gwt Platform,Gwt Editors,我正在使用gwt平台,并尝试实现gwt的编辑器框架。但我无法从演讲者内部获得成功。网络上有一些答案,说我必须以某种方式将EditorDriver注入演示者,但我不知道如何做到这一点 当时我尝试了这一点,但没有成功: public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers { public interface MyVie

我正在使用gwt平台,并尝试实现gwt的编辑器框架。但我无法从演讲者内部获得成功。网络上有一些答案,说我必须以某种方式将EditorDriver注入演示者,但我不知道如何做到这一点

当时我尝试了这一点,但没有成功:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers {
    public interface MyView extends View, HasUiHandlers<MyUiHandlers>, Editor<MyModel> {}

    @ProxyStandard
    @NameToken(NameTokens.myPage)
    @NoGatekeeper
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    interface Driver extends SimpleBeanEditorDriver<MyModel, MyView> {}
    private Driver editorDriver;
    DispatchAsync dispatcher;

    @Inject
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) {
        super(eventBus, view, proxy);
        getView().setUiHandlers(this);
        this.dispatcher = dispatcher;

        MyModel m = new MyModel();
        m.setId(1L);
        m.setUsername("username");
        m.setPassword("password");

        editorDriver = GWT.create(Driver.class);
        editorDriver.initialize(this.getView());
        editorDriver.edit(m);
    }

    ...
}
公共类MyPresenter扩展Presenter实现MyUIHandler{
公共接口MyView扩展视图,HasUiHandlers,编辑器{}
@ProxyStandard
@NameToken(NameTokens.myPage)
@守门员
公共接口MyProxy扩展了ProxyPlace{}
接口驱动程序扩展SimpleBeanEditorDriver{}
私人司机;
调度异步调度器;
@注入
公共MyPresenter(EventBus EventBus、MyView视图、MyProxy代理、DispatchAsync dispatcher){
超级(事件总线、视图、代理);
getView().setUiHandlers(此);
this.dispatcher=dispatcher;
MyModel m=新的MyModel();
m、 setId(1L);
m、 setUsername(“用户名”);
m、 设置密码(“密码”);
editorDriver=GWT.create(Driver.class);
初始化(this.getView());
editorDriver.edit(m);
}
...
}
如果我明确指定ViewImplementation,它就可以工作,但MVP不应该这样工作:

interface Driver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> {}

...

editorDriver.initialize((MyViewImpl) this.getView());
接口驱动程序扩展SimpleBeanEditorDriver{}
...
初始化((MyViewImpl)this.getView());
如果有人能给我举个例子,告诉我如何做对,我会很高兴


感谢

一种类似于早期版本的“为我工作”的方法:

视图应该实现的接口。使用通配符时,演示者不需要知道具体的视图实现:

import com.google.gwt.editor.client.Editor;
import com.gwtplatform.mvp.client.View;

/**
 * Implemented by views that edit beans.
 *
 * @param <B> the type of the bean
 */
public interface BeanEditView<B> extends View, Editor<B> {

  /**
   * @return a new {@link SimpleBeanEditorDriver} initialized to run
   *         this editor
   */
  SimpleBeanEditorDriver<B, ?> createEditorDriver();
}
public class MyViewImpl extends ViewWithUiHandlers<MyUiHandlers> implements
    MyPresenter.MyView {

  public interface Binder extends UiBinder<Widget, MyViewImpl> { }
  private static Binder uiBinder = GWT.create(Binder.class);

  /**
   * The driver to link the proxy bean with the view.
   */
  public interface EditorDriver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> { }

  private final Widget widget;

  public MyViewImpl() {
    widget = uiBinder.createAndBindUi(this);
  }

  @Override
  public SimpleBeanEditorDriver<MyModel, ?> createEditorDriver() {
    EditorDriver driver = GWT.create(EditorDriver.class);
    driver.initialize(this);
    return driver;
  }

  @Override
  public Widget asWidget() {
    return widget;
  }

  ...
}
import com.google.gwt.editor.client.editor;
导入com.gwtplatform.mvp.client.View;
/**
*由编辑bean的视图实现。
*
*@param bean的类型
*/
公共接口BeanEditView扩展视图,编辑器{
/**
*@return初始化为运行的新{@link simplebaneditordriver}
*这位编辑
*/
SimpleBaneEditorDriver createEditorDriver();
}
您的演示者现在应该是这样的:

public class MyPresenter extends Presenter<MyPresenter.MyView, MyPresenter.MyProxy> implements MyUiHandlers {
    public interface MyView extends BeanEditView<MyModel>, HasUiHandlers<MyUiHandlers> {}

    @ProxyStandard
    @NameToken(NameTokens.myPage)
    @NoGatekeeper
    public interface MyProxy extends ProxyPlace<MyPresenter> {} 

    private SimpleBeanEditorDriver<MyModel, ?> editorDriver;
    DispatchAsync dispatcher;

    @Inject
    public MyPresenter(EventBus eventBus, MyView view, MyProxy proxy, DispatchAsync dispatcher) {
        super(eventBus, view, proxy);
        getView().setUiHandlers(this);
        this.dispatcher = dispatcher;

        MyModel m = new MyModel();
        m.setId(1L);
        m.setUsername("username");
        m.setPassword("password");

        editorDriver = getView().createEditorDriver();
    }

    ...
}
公共类MyPresenter扩展Presenter实现MyUIHandler{
公共接口MyView扩展了BeanEditView,HasUiHandlers{}
@ProxyStandard
@NameToken(NameTokens.myPage)
@守门员
公共接口MyProxy扩展了ProxyPlace{}
私人simplebaneditordriver editorDriver;
调度异步调度器;
@注入
公共MyPresenter(EventBus EventBus、MyView视图、MyProxy代理、DispatchAsync dispatcher){
超级(事件总线、视图、代理);
getView().setUiHandlers(此);
this.dispatcher=dispatcher;
MyModel m=新的MyModel();
m、 setId(1L);
m、 setUsername(“用户名”);
m、 设置密码(“密码”);
editorDriver=getView().createEditorDriver();
}
...
}
以及视图实现:

import com.google.gwt.editor.client.Editor;
import com.gwtplatform.mvp.client.View;

/**
 * Implemented by views that edit beans.
 *
 * @param <B> the type of the bean
 */
public interface BeanEditView<B> extends View, Editor<B> {

  /**
   * @return a new {@link SimpleBeanEditorDriver} initialized to run
   *         this editor
   */
  SimpleBeanEditorDriver<B, ?> createEditorDriver();
}
public class MyViewImpl extends ViewWithUiHandlers<MyUiHandlers> implements
    MyPresenter.MyView {

  public interface Binder extends UiBinder<Widget, MyViewImpl> { }
  private static Binder uiBinder = GWT.create(Binder.class);

  /**
   * The driver to link the proxy bean with the view.
   */
  public interface EditorDriver extends SimpleBeanEditorDriver<MyModel, MyViewImpl> { }

  private final Widget widget;

  public MyViewImpl() {
    widget = uiBinder.createAndBindUi(this);
  }

  @Override
  public SimpleBeanEditorDriver<MyModel, ?> createEditorDriver() {
    EditorDriver driver = GWT.create(EditorDriver.class);
    driver.initialize(this);
    return driver;
  }

  @Override
  public Widget asWidget() {
    return widget;
  }

  ...
}
公共类MyViewImpl扩展了ViewWithUiHandlers实现
MyPresenter.MyView{
公共接口绑定器扩展UiBinder{}
私有静态绑定器uiBinder=GWT.create(Binder.class);
/**
*将代理bean与视图链接的驱动程序。
*/
公共接口EditorDriver扩展了SimpleBeaneEditorDriver{}
私有最终小部件;
公共MyViewImpl(){
widget=uiBinder.createAndBindUi(这个);
}
@凌驾
公共SimpleBaneEditorDriver createEditorDriver(){
EditorDriver=GWT.create(EditorDriver.class);
初始化(这个);
返回驱动器;
}
@凌驾
公共小部件asWidget(){
返回控件;
}
...
}
这是我用GWT的编辑器框架所能接近的MVP。我找不到让视图实现不知道模型的方法,但我认为这不是真的必要

如果有人对此有任何改进,我很高兴听到


在GWT编辑器上找到一些附加注释。似乎不可能完全分离模型。正如Thomas Broyer向另一位编辑提出的问题:

“MVP不是一成不变的(它甚至没有定义;它是由Martin Fowler创造的,但他为了支持两种更具体的模式而放弃了这个术语),因此您只违反了您给自己的规则。换句话说,编辑器框架作为一个整体可以被视为违反MVP:每个编辑器都知道模型,不一定知道它正在编辑的确切实例(如ValueAwareEditor或LeafValue),但至少知道它作为编辑器的对象的类型。”


MVP表示您使用演示者将模型与视图完全分离。此外,我要说的是,您的方法将逻辑置于视图中。。。
我希望有另一种解决办法;)

问题是Driver.class传递给了GWT.create

editorDriver = GWT.create(Driver.class);
必须是包含所有子编辑器(即所有UIBind小部件)的具体类

一种解决方案如下:

视图界面扩展了模型对象的编辑器界面

public interface MyView extends View, ..., Editor<MyModel>
公共界面MyView扩展视图,…,编辑器 视图实现MyViewImpl定义了驱动程序类型

interface MyDriverImpl extends SimpleBeanEditorDriver<MyModel,MyViewImpl>
接口MyDriverImpl扩展了SimpleBaneditorDriver
驱动程序在MyViewImpl中由

SimpleBeanEditorDriver<MyModel,MyView> driver = GWT.create(MyDriverImpl.class);
SimpleBaneditorDriver=GWT.create(MyDriverImpl.class);
父类型

SimpleBeanEditorDriver<MyModel,MyView>
SimpleBaneditorDriver

可以用来将驱动程序的引用传递给演示者

谢谢:)也许你是对的,如果视图知道模型也不错,因为否则我必须在ViewInterface中设置很多setter和getter。这意味着视图也知道它的模型(某种程度上)…这是一个很好的解决方案。非常感谢。谢谢经过两天与编辑和GWTP的斗争,我终于成功了。如果您在这方面做了一些改进,请让我确认