GWT:例外:这个小部件';s的父级不实现HasWidgets,但它实现了
我正在尝试创建一个结构,在这个结构中,我有一个较大的UI,其中包含一些小部分,我可以将它们交换进来和交换出去,然后您可以访问更详细的区域。本质上,我是在制作顶级面板,它可以容纳来自其他复合材料的较小面板。现在我得到了一个例外:GWT:例外:这个小部件';s的父级不实现HasWidgets,但它实现了,gwt,composite,Gwt,Composite,我正在尝试创建一个结构,在这个结构中,我有一个较大的UI,其中包含一些小部分,我可以将它们交换进来和交换出去,然后您可以访问更详细的区域。本质上,我是在制作顶级面板,它可以容纳来自其他复合材料的较小面板。现在我得到了一个例外: 13:50:51.479 [ERROR] [managementconsole] Uncaught exception escaped com.google.gwt.event.shared.UmbrellaException: Exception caught
13:50:51.479 [ERROR] [managementconsole] Uncaught exception escaped
com.google.gwt.event.shared.UmbrellaException: Exception caught: This widget's parent does not implement HasWidgets
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(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:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
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:242)
at sun.reflect.GeneratedMethodAccessor37.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:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: This widget's parent does not implement HasWidgets
at com.google.gwt.user.client.ui.Widget.removeFromParent(Widget.java:204)
at com.google.gwt.user.client.ui.LayoutPanel.insert(LayoutPanel.java:188)
at com.google.gwt.user.client.ui.LayoutPanel.add(LayoutPanel.java:134)
at com.impulse.mc.client.pm.PolicyManager.Init(PolicyManager.java:58)
at com.impulse.mc.client.ManagementConsole$1.onClick(ManagementConsole.java:83)
at com.google.gwt.event.dom.client.ClickEvent.dispatch(ClickEvent.java:56)
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(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:338)
at com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:219)
at com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)
at com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:571)
at com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:279)
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:242)
at sun.reflect.GeneratedMethodAccessor37.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:293)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:547)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364)
at java.lang.Thread.run(Unknown Source)
我的顶级班级:
public class ManagementConsole implements EntryPoint
{
private MCConstants constants = GWT.create(MCConstants.class);
private final DockLayoutPanel dockLayoutPanel = new DockLayoutPanel(Unit.EM);
private final VerticalPanel verticalPanel = new VerticalPanel();
private final HorizontalPanel menuBar1 = new HorizontalPanel();
public final HorizontalPanel menuBar2 = new HorizontalPanel();
public final HorizontalPanel menuBar3 = new HorizontalPanel();
private final Button btnPolicyManager = new Button("#Policy Manager");
public final LayoutPanel mainPanel = new LayoutPanel();
private final AbsolutePanel absolutePanel = new AbsolutePanel();
private final TextArea txtrSplashScreenPut = new TextArea();
private PolicyManager PM = null;
private final ManagementConsole MC = this;
/**
* This is the entry point method.
*/
public void onModuleLoad()
{
ABManager.setFactory( (MyABFactory) GWT.create( MyABFactory.class ) );
ServerUtil.initServer();
RootLayoutPanel root = RootLayoutPanel.get();
root.add(dockLayoutPanel);
root.setWidgetLeftRight(dockLayoutPanel, 0.0, Unit.PX, 0.0, Unit.PX);
root.setWidgetTopHeight(dockLayoutPanel, 0.0, Unit.PX, 512.0, Unit.PX);
verticalPanel.setBorderWidth(1);
dockLayoutPanel.addNorth(verticalPanel, 7.7);
verticalPanel.setWidth("100%");
menuBar1.setStyleName("MenuBarStyle");
menuBar1.setBorderWidth(1);
verticalPanel.add(menuBar1);
menuBar1.setWidth("0px");
menuBar1.setSpacing( 10 );
btnPolicyManager.addClickHandler( new ClickHandler()
{
public void onClick( ClickEvent event )
{
if ( null == PM )
{
PM = new PolicyManager();
}
PM.Init( MC );
}
} );
btnPolicyManager.setText( constants.policyManagerButton() );
menuBar1.add( btnPolicyManager );
verticalPanel.add( menuBar2);
menuBar2.setWidth("0px");
verticalPanel.add(menuBar3);
menuBar3.setWidth("0px");
dockLayoutPanel.add(mainPanel);
mainPanel.add(absolutePanel);
mainPanel.setWidgetLeftWidth(absolutePanel, 276.0, Unit.PX, 383.0, Unit.PX);
mainPanel.setWidgetTopHeight(absolutePanel, 95.0, Unit.PX, 186.0, Unit.PX);
txtrSplashScreenPut.setReadOnly(true);
txtrSplashScreenPut.setTextAlignment(TextBoxBase.ALIGN_CENTER);
txtrSplashScreenPut.setText("Splash Screen\r\nPut a graphic or some other text here");
absolutePanel.add(txtrSplashScreenPut, 113, 57);
}
}
以及引发异常的类,在Init方法中:
public class PolicyManager extends Composite
{
ManagementConsole MC = null;
private final DockLayoutPanel myRootPanel = new DockLayoutPanel(Unit.EM);
private final DockLayoutPanel sidePanel = new DockLayoutPanel(Unit.EM);
private final DockLayoutPanel mainPanel = new DockLayoutPanel(Unit.EM);
private final Label lblWelcomeToThe = new Label("Welcome to the Policy Manager");
// Only put in basic things that do not need the MC in the constructor
public PolicyManager()
{
initWidget(myRootPanel);
setSize("961px", "412px");
myRootPanel.setSize("100%", "412px");
myRootPanel.addWest(sidePanel, 17.3);
myRootPanel.add(mainPanel);
mainPanel.add(lblWelcomeToThe);
}
public void Init( ManagementConsole mc )
{
MC = mc;
mc.menuBar2.clear();
mc.menuBar3.clear();
mc.mainPanel.clear();
// This line causes the exception
mc.mainPanel.add( myRootPanel );
}
}
我不理解这一点,因为clear方法是在HasWidgets中指定的。很难遵循您的代码,因为您在不同的类中使用相同的名称,然后引用另一个类的字段 您可以初始化组合的小部件并插入一个dockLP(myRootPanel),然后在该子项中插入另一个dockLP。然后将myRootPanel插入LayoutPanel中,但它已经通过initWidget添加到复合PolicyManager中 我想,如果你清理一下,你的堆栈跟踪可以更好地指出问题所在。看起来您的PolicyManager不需要是复合的,也不需要初始化小部件。只需操纵现有面板即可。但是,您可能会进一步清理组织 java.lang.IllegalStateException-如果此小部件的父级不支持删除(例如复合) ------------旧的--------- 可能是标准模式的问题 LayoutPanel-“此小部件将仅在标准模式下工作,这要求运行它的HTML页面具有显式声明。” 如果没有,你能提供完整的跟踪吗
好的,我更新了完整的跟踪。是的,它处于标准模式。当您创建一个包含DOCTYPE声明的GWT应用程序时,它使用的是普通的html页面。如果我将“mc.mainPanel.add(myRootPanel);”更改为“mc.mainPanel.add(this);”,我会发现它可以工作,但我不知道为什么。可能是因为“this”是initWidget(myRootPanel)的组合。在你添加myRootPanel之前,我没有添加两次,只有一次?或者你的意思是我把它添加到我的合成图中,所以它被称为“代言人”,然后我试着把它添加到另一个面板中?我不知道InitWidget到底做了什么。@AshtonThomas几乎肯定是对的——将myRootPanel更改为这一点就是提示。此时myRootPanel对象的父对象是“this”(因为您调用了initWidget——将其分配给新的父对象毫无意义(而旧的父对象、复合对象this并没有实现HasWidgets,如错误所示)。