【问题标题】:How to use UiHandlers of GWT Platform?如何使用 GWT 平台的 UiHandlers?
【发布时间】:2012-11-02 18:37:03
【问题描述】:

我一直在尝试写contacts。使用 gwt-platform 的示例我已经使用手动显示成功获得了联系人视图以获取联系人列表,我正在尝试使用 UiHandlers 添加按钮,但它没有在我的 ContactsPresenter 的 onAddButtonClicked() 中调用该方法。

fallowing是我观点的代码sn-p

public class ContactsView extends ViewWithUiHandlers<ContactsViewUiHandlers> implements  ContactsPresenter.MyView {

private final Widget widget;

@UiField
Button addButton;

@UiHandler("addButton")
public void onAddButtonClick(ClickEvent e){
    System.out.println("add button clicked");
    getUiHandlers().onAddButtonClicked();
}  

}

闲置的是UiHandlers接口

public interface ContactsViewUiHandlers extends UiHandlers{
        void onAddButtonClicked();
}

在我的演示者中,我正在使用 onAddButtonClicked() 中的事件总线触发一个事件。

但是我的演示者没有控制,当我单击添加按钮时出现以下异常。

[ERROR] [contactsgwtp] - Uncaught exception escaped

10:17:10.527 [ERROR] [contactsgwtp] Uncaught exception escaped

com.google.gwt.event.shared.UmbrellaException: One or more exceptions caught, see full set in UmbrellaException#getCauses
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:129)
    at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129)
    at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116)
    at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177)
    at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351)
    at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
    at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
    at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException: null
    at com.saik.in.client.core.ContactsView.onAddButtonClick(ContactsView.java:51)
    at com.saik.in.client.core.ContactsView_BinderImpl$1.onClick(ContactsView_BinderImpl.java:50)
    at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:54)
    at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:1)
    at com.google.gwt.event.shared.GwtEvent.dispatch(GwtEvent.java:1)
    at com.google.web.bindery.event.shared.EventBus.dispatchEvent(EventBus.java:40)
    at com.google.web.bindery.event.shared.SimpleEventBus.doFire(SimpleEventBus.java:193)
    at com.google.web.bindery.event.shared.SimpleEventBus.fireEvent(SimpleEventBus.java:88)
    at com.google.gwt.event.shared.HandlerManager.fireEvent(HandlerManager.java:127)
    at com.google.gwt.user.client.ui.Widget.fireEvent(Widget.java:129)
    at com.google.gwt.event.dom.client.DomEvent.fireNativeEvent(DomEvent.java:116)
    at com.google.gwt.user.client.ui.Widget.onBrowserEvent(Widget.java:177)
    at com.google.gwt.user.client.DOM.dispatchEventImpl(DOM.java:1351)
    at com.google.gwt.user.client.DOM.dispatchEvent(DOM.java:1307)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessagesWhileWaitingForReturn(BrowserChannelServer.java:337)
    at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:218)
    at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)
    at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)
    at com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)
    at com.google.gwt.core.client.impl.Impl.apply(Impl.java)
    at com.google.gwt.core.client.impl.Impl.entry0(Impl.java:213)
    at sun.reflect.GeneratedMethodAccessor28.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.google.gwt.dev.shell.MethodAdaptor.invoke(MethodAdaptor.java:103)
    at com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71)
    at com.google.gwt.dev.shell.OophmSessionHandler.invoke(OophmSessionHandler.java:172)
    at com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:292)
    at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:546)
    at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:363)
    at java.lang.Thread.run(Thread.java:662)

关于我所缺少的任何建议,提前感谢

【问题讨论】:

  • 什么是行号。 51 在联系人视图中?显示演示者的代码。
  • @RAS 行号。 51 是 getUiHandlers().onAddButtonClicked();在演示者中,我有 public void onAddButtonClicked() { fireEvent(new AddContactEvent()); }

标签: gwt gwt-platform gwt-mvp gwtp


【解决方案1】:

显然getUiHandlers()null...但你知道:-)

我预计造成这种情况的原因可能是您在注入关联的演示者(这将是 GWTP 中的正常过程)时忘记设置 UI 处理程序 - 类似于:

public class ContactsPresenter extends Presenter<ContactsPresenter.MyView, ContactsPresenter.MyProxy> 
                               implements ContactsViewUiHandlers 
{
    public interface MyView extends View, HasUiHandlers { /* nothing */ }

    private PlaceManager placeManager;

    @Inject
    ContactsPresenter( final EventBus eventBus , final MyView view , 
                       final MyProxy proxy , final PlaceManager placeManager )
    {
        super( eventBus , view , proxy );
        this.placeManager = placeManager;
        getView().setUiHandlers( this );
    }
    ...

    @Override
    public void onAddButtonClicked()
    {
        placeManager.revealPlace( new PlaceRequest( "somewhereovertheocean" ) );
    }
    ...
}

(操作部分是getView().setUiHandlers( this );implements ContactsViewUiHandlers)。

顺便说一句,在调用任何方法之前始终检查 getUiHandlers() 是否为空是一种好习惯...

希望对您有所帮助。

干杯,

【讨论】:

  • 谢谢这是错误的,请告诉我如何移动到一个新地方,当我单击添加按钮时 EditContactsView 应该显示,请您提供任何有助于使用 gwt 的链接高效的平台框架。
  • 我建议您在 Presenter 中也使用 @Inject 您的 PlaceMaanager 并将其用于导航 - 我已经编辑了我的答案以概述这一点。
  • 在显示 EditContactsView 时出现了一些错误,我尝试使用简单的 html 面板然后我的视图正在打开,但是当我添加了以下代码时
  • 它给出原因:java.lang.UnsupportedOperationException:此面板不支持 com.google.gwt.user.client.ui.Panel.add(Panel. java:66) 我正在使用一个装饰面板,我正在向其中添加一个垂直面板和一个水平面板
【解决方案2】:

查看您提供的例外情况,我认为您错过了以下几点:

  1. ContactsPresenter 应该像这样实现ContactsViewUiHandlersContactsPresenter implemets ContactsViewUiHandlers
  2. ContactsPresenter 的引用设置为contactsView.UIHandlers,如下所示:getView().setUiHandlers(this);

在做完这两件事之后,你不应该得到提到的异常。希望对您有所帮助。

【讨论】:

  • 谢谢,我没有在我的演示者中添加 setUiHandlers()。
  • 很高兴知道这一点。如果这个答案对你有帮助,那你为什么不接受呢?
  • 我认为我不能接受两个答案,但你们都给出了相同的答案,再次感谢您的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2011-11-08
相关资源
最近更新 更多