2012-04-20 185 views
0

我已经完成了Tutorial on using the UiBinder并尝试使用本教程最后一节中提到的LazyPanel。GWT LazyPanel with UiBinder

对我来说,仿佛这个教程暗示着简单地将一个元素包装到一个LazyPanel中就足以让这个事情起作用。然而,当我尝试编译并运行该项目的GWT编译器抱怨,并告诉我,

Rebind result 'com.google.gwt.user.client.ui.LazyPanel' cannot be abstract 

如何必须使用使用UiBinder的的LazyPanel?我的配置有问题吗?我错过了什么?

我使用GWT 2.4(这是AFAIK最新的稳定版本)。

-

编辑:这是我使用的XML:

<?xml version="1.0" encoding="UTF-8"?> 
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:s="urn:import:de.dfv.yankee.client.tabs.start" 
    xmlns:b="urn:import:de.dfv.yankee.client.tabs.bewerber" xmlns:f="urn:import:de.dfv.yankee.client.tabs.firmen" 
    xmlns:k="urn:import:de.dfv.yankee.client.tabs.kommunikation" xmlns:a="urn:import:de.dfv.yankee.client.tabs.admin" 
    xmlns:v="urn:import:de.dfv.yankee.client.tabs.abrechnung" xmlns:u="urn:import:de.dfv.yankee.client.tabs.user" 
    xmlns:svg="urn:import:org.vectomatic.dom.svg.ui"> 

    <ui:with field="svgBundle" type="de.dfv.yankee.client.tabs.Tabs.SVGBundle" /> 

    <g:TabLayoutPanel barUnit="PX" barHeight="30" 
     ui:field="tabs"> 

     <g:tab> 
      <g:header>Start</g:header> 
      <s:StartTab ui:field="startTab" /> 
     </g:tab> 

     <g:tab> 
      <g:header>Bewerber</g:header> 
      <b:BewerberSucheTab ui:field="bewerberSucheTab" /> 
     </g:tab> 

     <g:tab> 
      <g:header>Bewerber Ergebnis</g:header> 
      <g:HTMLPanel> 
       <svg:SVGImage ui:field="svgImage" resource="{svgBundle.plz}" /> 
      </g:HTMLPanel> 
     </g:tab> 

     <g:tab> 
      <g:header>Firmen</g:header> 
      <g:LazyPanel> 
       <f:FirmenSucheTab ui:field="firmenSucheTab" /> 
      </g:LazyPanel> 
     </g:tab> 

     <g:tab> 
      <g:header>Firma Ergebnis</g:header> 
      <g:HTMLPanel> 

      </g:HTMLPanel> 
     </g:tab> 

     <g:tab> 
      <g:header>Kommunikation</g:header> 
      <k:KommunikationsTab ui:field="kommunikationsTab" /> 
     </g:tab> 

     <g:tab> 
      <g:header>Abrechnung</g:header> 
      <v:VermittlungenTab ui:field="vermittlungenTab" /> 
     </g:tab> 

     <g:tab> 
      <g:header>Userverwaltung</g:header> 
      <u:UserTab ui:field="userTab" /> 
     </g:tab> 

     <g:tab> 
      <g:header>Admin</g:header> 
      <a:AdminTab ui:field="adminTab" /> 
     </g:tab> 

    </g:TabLayoutPanel> 

</ui:UiBinder> 
+0

你可以显示你的XML?它应该工作。 (是的,2.4是最新的稳定版) – 2012-04-20 13:28:34

+0

我编辑了我正在使用的XML。 – scravy 2012-04-20 13:51:31

回答

1

编辑BEGIN

这里是正确的解决方案:

<g:TabLayoutPanel barHeight="2" barUnit="EM" width="250px" height="150px"> 
    <g:tab> 
    <g:header>T1</g:header> 
    <t:MyLazyPanel1 /> 
    </g:tab> 
    <g:tab> 
    <g:header>T2</g:header> 
    <t:MyLazyPanel2 /> 
    </g:tab> 
</g:TabLayoutPanel> 

MyLazyPanel1

public class MyLazyPanel1 extends LazyPanel { 
    Label l = new Label("label1"); 
    @Override 
    protected Widget createWidget() { 
    System.out.println("now1"); 
    return l; 
    } 
} 

MyLazyPanel2

public class MyLazyPanel2 extends LazyPanel { 
    Label l = new Label("label2"); 
    @Override 
    protected Widget createWidget() { 
    System.out.println("now2"); 
    return l; 
    } 
} 

现在你可以看到“now1”显示在控制台了应用程序启动时,和“now2”显示当你点击第二个选项卡上。

编辑结束

这工作:

<g:TabLayoutPanel barHeight="2" barUnit="EM" width="250px" height="150px"> 
    <g:tab> 
    <g:header>T1</g:header> 
    <t:MyLazyPanel> 
     <g:Label>ABC</g:Label> 
    </t:MyLazyPanel> 
    </g:tab> 
    <g:tab> 
    <g:header>T2</g:header> 
    <t:MyLazyPanel> 
     <g:Label>123</g:Label> 
    </t:MyLazyPanel> 
    </g:tab> 
</g:TabLayoutPanel> 

其中MyLazyPanel是:

public class MyLazyPanel extends LazyPanel { 
    @Override 
    protected Widget createWidget() { 
    return null; 
    } 
} 

但我不知道它是否真正加载懒

..至少它编译和结果看起来像expedted

并在这里看看:http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/user/client/ui/LazyPanel.html

+0

不,这不是懒加载。 Lazy加载通过在attach上调用'createWidget()'来实现,并且应该在'createWidget()'中完成,否则它就像任何其他的部件一样工作。 – 2012-04-21 10:18:13

+0

在我的帖子顶部有编辑开始(和中间编辑结束),这是懒加载,我测试了它。 – 2012-04-21 15:29:00

+0

看起来不像懒加载给我。延迟加载的想法是推迟创建内容直到实际需要为止。在你的例子中,一旦创建了类,你的内容就会被创建,而为了让它真的延迟加载,应该在createWidget方法中创建它。 – 2012-04-22 09:40:24