0

我已经完成了使用 UiBinder 的教程,并尝试使用教程最后一节中提到的 LazyPanel。

在我看来,该教程似乎暗示只需将一个元素包装在一个 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>
4

1 回答 1

1

编辑开始

这是正确的解决方案:

<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;
  }
}

但我不知道它是否真的很懒惰

...至少它编译并且结果看起来像expexted

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

于 2012-04-20T13:05:38.150 回答