无法让SplitLayoutPanel工作 - GWT + UIBinder让我发疯

时间:2010-03-22 20:25:19

标签: java javascript gwt uibinder

...
<g:VerticalPanel styleName="{style.mainVerticalPanel}">
    <g:SplitLayoutPanel>
    <g:north size="700">
        <g:VerticalPanel>
                <g:ScrollPanel styleName="{style.conversationPanelContainer}">
                    <g:FlexTable ui:field="conversationPanel" styleName="{style.conversationPanel}"></g:FlexTable>
                </g:ScrollPanel>
                <g:HorizontalPanel styleName="{style.messageTextAndSendPanel}">
                    <g:TextBox ui:field="messageText" styleName="{style.messageText}"></g:TextBox><g:Button ui:field="sendButton">Send</g:Button>
                </g:HorizontalPanel>
        </g:VerticalPanel>
    </g:north>
    <g:south size="300">
    <g:button>TestButton</g:button>
    </g:south>
    </g:SplitLayoutPanel>
</g:VerticalPanel>
...

这有什么不妥吗?我所要做的就是制作一个简单的拆分面板,但每当我运行这个时,我得到的只是一个空白页面。没有任何SplitPanel的东西,它工作正常。 DockLayoutPanel也是如此。

2 个答案:

答案 0 :(得分:7)

好的,让它正常工作(请参阅以前尝试的旧版本的答案;))。

我的解决方案基于Mail example。 工作代码:

public class SplitTest implements EntryPoint {

    private static TestUiBinder uiBinder = GWT.create(TestUiBinder.class);

    interface TestUiBinder extends UiBinder<SplitLayoutPanel, SplitTest> {
    }

    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {
        SplitLayoutPanel outer = uiBinder.createAndBindUi(this);

        RootLayoutPanel.get().add(outer);
    }
}

UiBinder * .ui.xml:

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
  xmlns:g="urn:import:com.google.gwt.user.client.ui">
  <ui:style>
    .conversationPanelContainer, .conversationPanel, .messageTextAndSendPanel, .messageText {
      font-weight: bold;
    }
  </ui:style>
    <g:SplitLayoutPanel>
    <g:north size="700">
        <g:VerticalPanel>
                <g:ScrollPanel styleName="{style.conversationPanelContainer}">
                    <g:FlexTable ui:field="conversationPanel" styleName="{style.conversationPanel}"></g:FlexTable>
                </g:ScrollPanel>
                <g:HorizontalPanel styleName="{style.messageTextAndSendPanel}">
                    <g:TextBox ui:field="messageText" styleName="{style.messageText}"></g:TextBox><g:Button ui:field="sendButton">Send</g:Button>
                </g:HorizontalPanel>
        </g:VerticalPanel>
    </g:north>
    <g:south size="300">
    <g:Button>TestButton</g:Button>
    </g:south>
    </g:SplitLayoutPanel>
</ui:UiBinder> 

请注意以下几点:

  • 首先:您的UiBinder XML模板出错了:它是<g:Button>,而不是<g:button>(区分大小写)
  • 使用RootLayoutPanel代替通常的RootPanel
  • 我仍然对整个LayoutPanel的东西感到有点困惑 - 在Mail example他们使用嵌套在SplitLayoutPanel中的DockLayoutPanel,但只有DockLayoutPanel 1}}被明确添加到RootLayoutPanel - 我是否理解SplitLayoutPanel自动添加(以便它可以接收调整大小事件等)?嵌套在主LayoutPanel中的其他一些小部件怎么样 - 它们是否必须明确地添加到RootLayoutPanel中,或者只有当它们是该Widget / Composite的根或者甚至不可能时?我没有时间来进一步追求这一点 - 我会把它作为其他人的家庭作业;)

顺便说一下:我已经在Quirks模式和标准模式下检查了这段代码 - 我没有看到区别,两者都工作O_o(不过,这只是SplitLayoutPanel的简单使用 - 可能更复杂的例子在Quirks模式和/或渲染错误中导致一些奇怪的行为

答案 1 :(得分:2)

您使用的是哪种doctype?这些面板仅在标准模式下工作(至少对一些broswers)。如果你使用怪癖模式,那么经常发生这种情况,你得到一个带有这些面板的空白页面。

检查您的HTML文件。理想情况下应该从:

开始
<!DOCTYPE html>

或者其他一些导致标准模式的文档类型(但请确保以100%逐字输入),请参阅http://hsivonen.iki.fi/doctype/