用特殊的UiBinder标记写一个组件?

时间:2013-01-25 19:35:54

标签: gwt uibinder

UiBinder用于以声明方式布局GWT组件,使用XML标记,而不是以编程方式使用Java代码。

UiBinder树中的新XML元素意味着应该创建该类的新实例。因此,GWT docs中的这个例子实例化了一个新的Horizo​​ntalPanel和两个Labels:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
             xmlns:g='urn:import:com.google.gwt.user.client.ui'>
  <g:HorizontalPanel>
    <g:Label>Keep your ducks</g:Label>
    <g:Label>in a row</g:Label>
  </g:HorizontalPanel>
</ui:UiBinder>

还有另一个例子,有一个DockLayoutPanel:

<g:DockLayoutPanel unit='EM'>
  <g:north size='5'>
    <g:Label>Top</g:Label>
  </g:north>
  <g:center>
    <g:Label>Body</g:Label>
  </g:center>
  <g:west size='10'>
    <g:HTML>
      <ul>
        <li>Sidebar</li>
        <li>Sidebar</li>
        <li>Sidebar</li>
      </ul>
    </g:HTML>
  </g:west>
</g:DockLayoutPanel>

在这种情况下,元素是&#39; north&#39; west&#39;&#39; center&#39;,但这些不是类的新实例,而是一个配置新的DockLayoutPanel。

  1. 如何编写像DockLayoutPanel一样接受自定义UiBinder XML元素的组件?
  2. 在DockLayoutPanel类的源代码中,或在其配置文件中,它是否标记为使用特殊标记,以及如何处理特殊标记元素的内部内容?
  3. 还有哪些小部件接受特殊的UiBinder标记?

1 个答案:

答案 0 :(得分:1)

  1. 似乎您必须为自定义小部件引入自定义UiBinder解析器。

  2. com.google.gwt.uibinder.elementparsers.DockLayoutPanelParser类定义了以下静态最终地图:

    private static final Map<String, String> DOCK_NAMES = new HashMap<String, String>();
    static {
       DOCK_NAMES.put("north", "addNorth");
       DOCK_NAMES.put("south", "addSouth");
       DOCK_NAMES.put("east", "addEast");
       DOCK_NAMES.put("west", "addWest");
       DOCK_NAMES.put("lineStart", "addLineStart");
       DOCK_NAMES.put("lineEnd", "addLineEnd");
       DOCK_NAMES.put("center", "add");
    }
    
  3. 没有搜索所有这些,但我猜测任何具有自定义解析器的小部件(如DockLayoutPanel)都可以处理您为其编程处理的内部XML元素。