使用我自己的复合基类时GWT设计器的问题

时间:2013-01-17 21:09:43

标签: gwt

我想为复合表单使用基类,而不是直接从复合本身继承。当我这样做时,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的设计器视图。

1 个答案:

答案 0 :(得分:0)

我找出原因,导致设计师窒息的原因。

受保护的PanelBase THIS = this;

那条线。如果你在基类中复制了“this”指针,那么当你尝试打开子类上的设计选项卡时,设计者就会呕吐。即使你在构造函数中执行此任务,它仍然会呕吐。

我认为没有解决方法。我只是想在子类中的一些匿名类中使用“this”指针。我认为基类对于这个参考是一个很好的持有者。