GWT Compsite的initWidget不适用于DivElement

时间:2013-12-06 14:37:30

标签: java gwt mvp uibinder

我正在使用recommended API from their docs在我的第一个GWT应用中实现MVP,并且无可否认,我正在做一些cargo cult programming,同时争先恐后地学习/理解API:

public class DefaultSignInView extends Composite implements SignInView {
    private static DefaultSignInViewUiBinder uiBinder = GWT
        .create(DefaultSignInViewUiBinder.class);

    public DefaultSignInView() {
        // ERROR: The method initWidget(Widget) in the type Composite is not applicable
        // for the arguments (DivElement)
        initWidget(uiBinder.createAndBindUi(this));
    }

    // Extends the UiBinder interface for this particular view.
    interface DefaultSignInViewUiBinder extends UiBinder<DivElement, DefaultSignInView> {
        // No-op.
    }
}

在上面的代码段中,对initWidget的调用是语法/编译器错误:

  

Composite类型的方法initWidget(Widget)不适用于参数(DivElement)。

现在,在文档(上面链接)中,它们表明您应该在没有泛型参数的情况下扩展UiBinder。但是我也看过使用泛型的例子,再次,货物结果,我借用了另一个使用DivElement作为第一个参数的例子。所以,有几个问题:

  1. 为什么我会收到此语法错误?
  2. 我可以将DivElement改为(或者我还需要改变什么)来纠正它,除了删除泛型参数?如果泛型参数被弃用或真正不再使用,有人可以解释原因吗?在这种情况下,我只会@SuppressWarnings
  3. 有人能为这里的代码提供明确的外行解释吗?我讨厌货物打断我的代码。
  4. 提前致谢!

1 个答案:

答案 0 :(得分:0)

我真诚地认为你在找错了地方。试试这个here。其中大部分都是在文档中解释的,我仍然会尝试强调几点,

  1. 您要做的是一个非常简单的UiBinder模板示例,它不包含任何小部件,只包含HTML。
  2. 因此,不是一个小部件,你不能将它作为一个小部件添加到面板,而是需要直接进行DOM操作。
  3. 我在下面添加了我的示例代码

    public class ImageViewer implements EntryPoint
    {
    
        @Override
        public void onModuleLoad()
        {
        SampleUI sampleUI = new SampleUI();
        sampleUI.setNameSpan(" Trying it out!!");
    
        Document.get().getBody().appendChild(sampleUI.getElement());
        }
    }
    

    SampleUI ui-binder

    <ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder">
    <ui:style>
        .important {
            font-weight: bold;
        }
    </ui:style>
    <div>
        Hello,
        <span class="{style.important}" ui:field="nameSpan" />
    </div>
    </ui:UiBinder>
    

    SampleUI java

    public class SampleUI extends UIObject
    {
    
        private static SampleUIUiBinder uiBinder    =     GWT.create(SampleUIUiBinder.class);
    
        interface SampleUIUiBinder extends UiBinder<DivElement, SampleUI>
        {
        }
    
        private DivElement  root;
    
        @UiField
        SpanElement         nameSpan;
    
        public SampleUI()
        {
            setElement(uiBinder.createAndBindUi(this));
        }
    
        public DivElement getRoot()
        {
            return root;
        }
    
        public void setNameSpan(String firstName)
        {
            nameSpan.setInnerText(firstName);
        }
    }