如何在GWT中将自定义HTML元素注册为窗口小部件

Ton*_*ark 7 java gwt android mgwt polymer

嗨大家有没有人知道如何将自定义html元素注册为GWT小部件uiBinder并直接使用它们代替在HTMLPanel中使用.

例如,如果我在我的mgwt项目中使用Google Polymer,我使用的是自定义html元素

                 <g:HTMLPanel >
                    <paper-shadow class="{style.card}">
                        <mgwt:touch.TouchPanel ui:field="touchPanel">
                            <mgwt:panel.flex.FlexPanel orientation="VERTICAL" alignment="CENTER">
                                <g:Image url="{global.getDirection.getSafeUri.asString}" />
                                <g:HTMLPanel>Take me to Deal</g:HTMLPanel>
                            </mgwt:panel.flex.FlexPanel>
                        </mgwt:touch.TouchPanel>
                    </paper-shadow>
                </g:HTMLPanel>
Run Code Online (Sandbox Code Playgroud)

我想注册/创建纸质阴影作为自定义小部件,以便我可以编写代码,以便它容易handel事件

                <polymer:paper-shadow class="{style.card}">
                    <mgwt:touch.TouchPanel ui:field="touchPanel">
                        <mgwt:panel.flex.FlexPanel orientation="VERTICAL" alignment="CENTER">
                            <g:Image url="{global.getDirection.getSafeUri.asString}" />
                            <g:HTMLPanel>Take me to Deal</g:HTMLPanel>
                        </mgwt:panel.flex.FlexPanel>
                    </mgwt:touch.TouchPanel>
                <polymer:paper-shadow>
Run Code Online (Sandbox Code Playgroud)

Igo*_*mer 0

据我所知,您无法轻松添加 UiBinder 能够理解的新自定义元素。不过,您可以将一个添加到您的自定义小部件中。

您会注意到 GWT 允许在这些自定义元素上自定义属性,例如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='192'>
    <g:HTML>
      <ul>
        <li>Sidebar</li>
        <li>Sidebar</li>
        <li>Sidebar</li>
      </ul>
    </g:HTML>
  </g:west>
</g:DockLayoutPanel>
Run Code Online (Sandbox Code Playgroud)

注意该<g:north size='5'>元素 - 如果您查看 的DockLayoutPanel源代码,您会发现它是由以下方法处理的:

public void addNorth(Widget widget, double size) {
    insert(widget, Direction.NORTH, size, null);
}
Run Code Online (Sandbox Code Playgroud)

没有@UiChild注释和额外的参数意味着幕后正在发生一些“神奇”的事情。确实,有一个DockLayoutPanelParser类可以处理这种特殊情况。您会注意到它实现了ElementParser- 不幸的是,不可能“插入”您自己的ElementParser.

有一个项目gwt-customuibinder试图绕过这个限制,但它已被较新的(2.5+?)版本的 GWT 弃用:

请注意,随着 GWT 的新版本,该项目现已被弃用,因为许多用于将自定义元素解析器添加到 UiBinder 的技术现在已无法实现。