使用SmartGWT窗口和PresenterWidget时发生GWTP错误

使用SmartGWT窗口和PresenterWidget时发生GWTP错误,gwt,window,smartgwt,popuppanel,Gwt,Window,Smartgwt,Popuppanel,我正在使用SmartGWT 3.0和GWTP 0.7 我正在尝试做一个简单的PresenterWidget,显示SmartGWT窗口。以下是小部件演示器的代码: import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.PopupView; import com.google.inject.Inject; import com.google.web.bindery.event.shar

我正在使用SmartGWT 3.0和GWTP 0.7

我正在尝试做一个简单的PresenterWidget,显示SmartGWT窗口。以下是小部件演示器的代码:

import com.gwtplatform.mvp.client.PresenterWidget;
import com.gwtplatform.mvp.client.PopupView;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;

public class DemoWidgetPresenter extends
    PresenterWidget<DemoWidgetPresenter.MyView> {

public interface MyView extends PopupView {
}

@Inject
public DemoWidgetPresenter(final EventBus eventBus, final MyView view) {
    super(eventBus, view);
}

@Override
protected void onBind() {
    super.onBind();
}

@Override
protected void onReveal() {
    super.onReveal();
    System.out.println(">>>> onReveal()");
}
}
在节目的另一部分中,我向这位演讲者展示了:
addToPopupSlot(dp,true)

其中,
dp
DemoWidgetPresenter
的注入实例

显示
DemoWidgetPresenter
时,会引发以下异常:

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.smartgwt.client.widgets.BaseWidget.fireEvent(BaseWidget.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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.GeneratedMethodAccessor45.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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(Unknown Source)
Caused by: java.lang.ClassCastException: com.smartgwt.client.widgets.Window cannot be cast to com.google.gwt.user.client.ui.PopupPanel
at com.gwtplatform.mvp.client.PopupViewImpl.asPopupPanel(PopupViewImpl.java:130)
at com.gwtplatform.mvp.client.PopupViewImpl.setCloseHandler(PopupViewImpl.java:104)
at com.gwtplatform.mvp.client.PresenterWidget.monitorCloseEvent(PresenterWidget.java:574)
at com.gwtplatform.mvp.client.PresenterWidget.addToPopupSlot(PresenterWidget.java:205)
at com.demo.client.core.mvp.DiffPresenter$9.onClick(DiffPresenter.java:397)
at com.smartgwt.client.widgets.events.ClickEvent.dispatch(ClickEvent.java:96)
at com.smartgwt.client.widgets.events.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.smartgwt.client.widgets.BaseWidget.fireEvent(BaseWidget.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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.GeneratedMethodAccessor45.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
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(Unknown Source)
我知道问题是由于两个角色之间的转换
com.smartgwt.client.widgets.Window
com.google.gwt.user.client.ui.popupanel
但我不知道如何解决它

尽管存在异常,但仍会显示该窗口,但从未调用函数
onReveal()
,因此演示者的直播周期被中断

有什么想法/解决方法:-)吗


提前谢谢你

我找到了一个解决方案,它使用适配器类:

import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.PopupPanel;
import com.gwtplatform.mvp.client.PopupView;
import com.gwtplatform.mvp.client.PopupViewImpl;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;

/**
 * Adapter class for {@link Window}. This class it is necessary when a
 * {@link PopupView} uses as widget a {@link Window}. GWTP library does an
 * explicit cast to {@link PopupPanel} in {@link PopupViewImpl} and a cast
 * exception is raised. This class adapts only these functions which are call in
 * {@link PopupViewImpl}.
 * 
 * 
 */
public class PopupPanelAdapter extends PopupPanel {

private Window delegate;

public PopupPanelAdapter(Window delegate) {
    this.delegate = delegate;
    // adapting window close event
    delegate.addCloseClickHandler(new CloseClickHandler() {
        @Override
        public void onCloseClick(CloseClickEvent event) {
            CloseEvent.fire(PopupPanelAdapter.this, null);
        }
    });
}

public void hide() {
    delegate.hide();
}

public void show() {
    delegate.show();
}

@Override
public HandlerRegistration addCloseHandler(CloseHandler<PopupPanel> handler) {
    return super.addCloseHandler(handler);
}

@Override
public boolean isShowing() {
    return isVisible();
}

@Override
public void center() {
    delegate.centerInPage();
}

@Override
public void setPopupPosition(int left, int top) {
    if (delegate == null)// call in constructor, delegate is null
        return;
    delegate.setLeft(left);
    delegate.setTop(top);
}
}
import com.google.gwt.event.logical.shared.CloseEvent;
导入com.google.gwt.event.logical.shared.CloseHandler;
导入com.google.gwt.event.shared.HandlerRegistration;
导入com.google.gwt.user.client.ui.popupanel;
导入com.gwtplatform.mvp.client.PopupView;
导入com.gwtplatform.mvp.client.PopupViewImpl;
导入com.smartgwt.client.widgets.Window;
导入com.smartgwt.client.widgets.events.CloseClickEvent;
导入com.smartgwt.client.widgets.events.CloseClickHandler;
/**
*{@link Window}的适配器类。这个类在
*{@link PopupView}将{@link Window}用作小部件。GWTP库执行以下操作:
*在{@link-PopupViewImpl}中显式强制转换到{@link-popupanel}和强制转换
*提出了例外情况。此类仅适配这些被调用的函数
*{@link PopupViewImpl}。
* 
* 
*/
公共类PopupPanelAdapter扩展了PopupPanel{
私人窗口代表;
公共PopupPanelAdapter(窗口代理){
this.delegate=委托;
//自适应窗口关闭事件
delegate.addCloseClickHandler(新的CloseClickHandler(){
@凌驾
关闭单击时公共作废(关闭单击事件){
CloseEvent.fire(PopupPanelAdapter.this,null);
}
});
}
公共空间隐藏(){
delegate.hide();
}
公开展览({
delegate.show();
}
@凌驾
公共句柄注册addCloseHandler(CloseHandler处理程序){
返回super.addCloseHandler(handler);
}
@凌驾
公共布尔isShowing(){
返回isVisible();
}
@凌驾
公共空间中心(){
delegate.centerInPage();
}
@凌驾
公共void setPopupPosition(左整数,上整数){
如果(delegate==null)//在构造函数中调用,则delegate为null
返回;
delegate.setLeft(左);
代表。setTop(顶部);
}
}

很好用

我找到了一个解决方案,它使用适配器类:

import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.PopupPanel;
import com.gwtplatform.mvp.client.PopupView;
import com.gwtplatform.mvp.client.PopupViewImpl;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.CloseClickEvent;
import com.smartgwt.client.widgets.events.CloseClickHandler;

/**
 * Adapter class for {@link Window}. This class it is necessary when a
 * {@link PopupView} uses as widget a {@link Window}. GWTP library does an
 * explicit cast to {@link PopupPanel} in {@link PopupViewImpl} and a cast
 * exception is raised. This class adapts only these functions which are call in
 * {@link PopupViewImpl}.
 * 
 * 
 */
public class PopupPanelAdapter extends PopupPanel {

private Window delegate;

public PopupPanelAdapter(Window delegate) {
    this.delegate = delegate;
    // adapting window close event
    delegate.addCloseClickHandler(new CloseClickHandler() {
        @Override
        public void onCloseClick(CloseClickEvent event) {
            CloseEvent.fire(PopupPanelAdapter.this, null);
        }
    });
}

public void hide() {
    delegate.hide();
}

public void show() {
    delegate.show();
}

@Override
public HandlerRegistration addCloseHandler(CloseHandler<PopupPanel> handler) {
    return super.addCloseHandler(handler);
}

@Override
public boolean isShowing() {
    return isVisible();
}

@Override
public void center() {
    delegate.centerInPage();
}

@Override
public void setPopupPosition(int left, int top) {
    if (delegate == null)// call in constructor, delegate is null
        return;
    delegate.setLeft(left);
    delegate.setTop(top);
}
}
import com.google.gwt.event.logical.shared.CloseEvent;
导入com.google.gwt.event.logical.shared.CloseHandler;
导入com.google.gwt.event.shared.HandlerRegistration;
导入com.google.gwt.user.client.ui.popupanel;
导入com.gwtplatform.mvp.client.PopupView;
导入com.gwtplatform.mvp.client.PopupViewImpl;
导入com.smartgwt.client.widgets.Window;
导入com.smartgwt.client.widgets.events.CloseClickEvent;
导入com.smartgwt.client.widgets.events.CloseClickHandler;
/**
*{@link Window}的适配器类。这个类在
*{@link PopupView}将{@link Window}用作小部件。GWTP库执行以下操作:
*在{@link-PopupViewImpl}中显式强制转换到{@link-popupanel}和强制转换
*提出了例外情况。此类仅适配这些被调用的函数
*{@link PopupViewImpl}。
* 
* 
*/
公共类PopupPanelAdapter扩展了PopupPanel{
私人窗口代表;
公共PopupPanelAdapter(窗口代理){
this.delegate=委托;
//自适应窗口关闭事件
delegate.addCloseClickHandler(新的CloseClickHandler(){
@凌驾
关闭单击时公共作废(关闭单击事件){
CloseEvent.fire(PopupPanelAdapter.this,null);
}
});
}
公共空间隐藏(){
delegate.hide();
}
公开展览({
delegate.show();
}
@凌驾
公共句柄注册addCloseHandler(CloseHandler处理程序){
返回super.addCloseHandler(handler);
}
@凌驾
公共布尔isShowing(){
返回isVisible();
}
@凌驾
公共空间中心(){
delegate.centerInPage();
}
@凌驾
公共void setPopupPosition(左整数,上整数){
如果(delegate==null)//在构造函数中调用,则delegate为null
返回;
delegate.setLeft(左);
代表。setTop(顶部);
}
}

很好用

在我的例子中,我们使用UIBinder XML来定义布局,我对GWTBootstrap3的模态元素有一个问题

我已经使用上述解决方案推出了一个定制的ModalPopupAdapter,但需要在不同部分添加以下内容:

视图中的Java代码

@UiField(provided = true)
Modal modal = new Modal();

@UiField(provided = true)
ModalPopupAdapter modalPopupAdapter = new ModalPopupAdapter(modal);
UIBinder XML

<afr:ModalPopupAdapter ui:field="modalPopupAdapter">
    <bs:Modal ui:field="modal" other-attributes...>

在我的例子中,我们使用UIBinder XML来定义布局,我对GWTBootstrap3的模式组件有一个问题

我已经使用上述解决方案推出了一个定制的ModalPopupAdapter,但需要在不同部分添加以下内容:

视图中的Java代码

@UiField(provided = true)
Modal modal = new Modal();

@UiField(provided = true)
ModalPopupAdapter modalPopupAdapter = new ModalPopupAdapter(modal);
UIBinder XML

<afr:ModalPopupAdapter ui:field="modalPopupAdapter">
    <bs:Modal ui:field="modal" other-attributes...>

请看这里:它可能有助于您理解为什么会发生这种情况请看这里:它可能有助于您理解为什么会发生这种情况