我想为复合表单使用基类,而不是直接从复合本身继承。当我这样做时,GWT设计师会对子类进行抨击。
这是我的基类:
package com.mycompany.project.client.panels;
import com.google.gwt.user.client.ui.Composite;
import com.mycompany.project.client.PanelNotifyCallback;
public class PanelBase extends Composite
{
protected PanelNotifyCallback NextButtonNotify = null;
protected PanelBase THIS = this;
public void setNextButtonNotify( PanelNotifyCallback nextButtonNotify )
{
NextButtonNotify = nextButtonNotify;
}
}
这是一个子类:
package com.mycompany.project.client.panels.p2;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.user.client.ui.DoubleBox;
import com.mycompany.project.client.panels.PanelBase;
public class Panel2 extends PanelBase
{
public Panel2()
{
AbsolutePanel absolutePanel = new AbsolutePanel();
initWidget(absolutePanel);
absolutePanel.setSize("472px", "227px");
Label lblPanel = new Label("Panel2");
lblPanel.setStyleName("gwt-Label_Panel1");
absolutePanel.add(lblPanel, 193, 88);
lblPanel.setSize( "67px", "23px" );
Button btnNext = new Button( "Next" );
btnNext.addClickHandler( new ClickHandler()
{
public void onClick( ClickEvent event )
{
// NextButtonNotify.Notify( THIS );
}
} );
absolutePanel.add( btnNext, 196, 166 );
Label lblPrice = new Label("Price:");
absolutePanel.add(lblPrice, 35, 37);
DoubleBox doubleBoxPirce = new DoubleBox();
doubleBoxPirce.setName("PriceBox");
absolutePanel.add(doubleBoxPirce, 75, 25);
}
}
以下是我打开panel2.java
的设计视图时会发生的情况Exception during 'super' constructor evaluation
An exception happened during evaluation of constructor PanelBase() using arguments {}.
java.lang.AssertionError: This UIObject's element is not set; you may be missing a call to either Composite.initWidget() or UIObject.setElement()
at com.google.gwt.user.client.ui.UIObject.getElement(UIObject.java:556)
at com.mycompany.project.client.panels.PanelBase$$EnhancerByCGLIB$$9c1b2ca8.CGLIB$getElement$30(<generated>)
at com.mycompany.project.client.panels.PanelBase$$EnhancerByCGLIB$$9c1b2ca8$$FastClassByCGLIB$$1a67578f.invoke(<generated>)
at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:215)
我可以创建自己的基类并让设计师继续工作吗?如果是这样,那有什么不对?这是一个相当简单的设置。从长远来看,我还想创建一些抽象基类。
我可以打开基类PanelBase的设计器视图。
答案 0 :(得分:0)
我找出原因,导致设计师窒息的原因。
受保护的PanelBase THIS = this;
那条线。如果你在基类中复制了“this”指针,那么当你尝试打开子类上的设计选项卡时,设计者就会呕吐。即使你在构造函数中执行此任务,它仍然会呕吐。
我认为没有解决方法。我只是想在子类中的一些匿名类中使用“this”指针。我认为基类对于这个参考是一个很好的持有者。