2011-11-03 82 views
3

編輯包含以下建議:此代碼塊現在可用於生成屏幕截圖中的佈局;如何使一個小部件填充GWT中VerticalLayout的空間

我有一個UIBinder,我試圖做一個佈局,使內容窗格有一個主要部分填充可用的寬度和高度,將頁腳推到底部。我試過了;

<!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> 
.eastPanel { 
     background-color: #F60; 
    } 

    .westPanel { 
     background-color: #EEE; 
    } 

    .northPanel { 
     background-color: #39F; 
    } 

    .southPanel { 
     background-color: #99C; 
    } 

    .centrePanel { 
     background-color: #FFC; 
    } 

    .headerPanel { 
     font-weight: bold; 
     background-color: #37B6CE; 
    } 

    .mainPanel { 
     font-weight: bold; 
     background-color: #123; 
    } 

    .footerPanel { 
     font-weight: bold; 
     background-color: #206876; 
    } 
</ui:style> 
<g:DockLayoutPanel unit='EM'> 
    <g:north size='8'> 
     <g:FlowPanel styleName="{style.northPanel}"> 
      <g:SimplePanel ui:field="northPanel" /> 
      <g:Label>This is the NORTH panel</g:Label> 
     </g:FlowPanel> 
    </g:north> 
    <g:west size='13'> 
     <g:FlowPanel styleName="{style.westPanel}"> 
      <g:SimplePanel ui:field="westPanel" /> 
      <g:Label>This is the WEST panel</g:Label> 
     </g:FlowPanel> 
    </g:west> 
    <g:center> 
     <g:LayoutPanel styleName="{style.centrePanel}" ui:field="centrePanel"> 
      <g:layer top="0em" height="2em"> 
       <g:HTMLPanel styleName="{style.headerPanel}" ui:field="headerPanel">     
       fixed header - usually a search box 
       </g:HTMLPanel> 
      </g:layer> 
      <g:layer top="2em" bottom="2em"> 
       <g:HTMLPanel styleName="{style.mainPanel}" ui:field="meainPanel"> 
Expanding main area 
       </g:HTMLPanel> 
      </g:layer> 
      <g:layer bottom="0px" height="2em"> 
       <g:HTMLPanel styleName="{style.footerPanel}" ui:field="footerPanel"> 

       fixed footer - maybe some copyright information 
       </g:HTMLPanel> 
      </g:layer> 
     </g:LayoutPanel> 
    </g:center> 

    <g:east size='0'> 
     <g:FlowPanel styleName="{style.eastPanel}"> 
      <g:Label>This is the EAST panel</g:Label> 
     </g:FlowPanel> 
    </g:east> 
    <g:south size="0"> 
     <g:FlowPanel styleName="{style.southPanel}"> 
      <g:Label>This is the SOUTH panel</g:Label> 
     </g:FlowPanel> 
    </g:south> 
</g:DockLayoutPanel> 

`

enter image description here

這是老代碼,沒有工作的原因,而是用一個表來嘗試佈局主要內容的區域;

<!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" xmlns:wids="urn:import:org.limepepper.JavaCart.gwt.ui.client.widgets"> 
<ui:style> 
    .mainPanel { 
     background-color: #AFC; 
     width: 100%; 
     height: 100%; 
    } 
</ui:style> 
<g:DockLayoutPanel unit='EM'> 
    <g:north size='8'> 
     <g:FlowPanel styleName="{style.northPanel}"> 
      <g:SimplePanel ui:field="northPanel" /> 
      <g:Label>This is the NORTH panel</g:Label> 
     </g:FlowPanel> 
    </g:north> 
    <g:west size='13'> 
     <g:FlowPanel styleName="{style.westPanel}"> 
      <g:SimplePanel ui:field="westPanel" /> 
      <g:Label>This is the WEST panel</g:Label> 
     </g:FlowPanel> 
    </g:west> 
    <g:center> 
     <g:HTMLPanel> 
      <g:VerticalPanel> 
       <g:HTMLPanel> 
        A heade panel 
       </g:HTMLPanel> 
       <g:HTMLPanel styleName="{style.mainPanel}"> 
       I want this panel to fill the space 
       th 
       rh 
       tr 
       h 
       <br> 
       </br> 
       <br></br> 
       <p></p> 

       </g:HTMLPanel> 
       <g:HTMLPanel> 
        Footer here 
       </g:HTMLPanel> 
      </g:VerticalPanel> 

     </g:HTMLPanel> 
    </g:center> 
    <g:east size='0'> 
     <g:FlowPanel styleName="{style.eastPanel}"> 
      <g:Label>This is the EAST panel</g:Label> 
     </g:FlowPanel> 
    </g:east> 
    <g:south size="0"> 
     <g:FlowPanel styleName="{style.southPanel}"> 
      <g:Label>This is the SOUTH panel</g:Label> 
     </g:FlowPanel> 
    </g:south> 
</g:DockLayoutPanel> 

`

enter image description here

但這並不填補空間,我能做到這一點編程,但我相信有一些GWT的方法來使用。

回答

3

首先,您必須認識到,VerticalPanel如何實現以及它如何佈置其子部件。如果你檢查你的頁面生成的HTML,你會立即看到它被實現爲<table>

一旦你意識到這一點,你可以馬上看到,沒有多少與VerticalPanel<table>標籤搞砸的事情可以讓你達到你想要的效果。

執行DockLayoutPanel<g:center/>的正確方法是使用LayoutPanel並使用它的<g:layer>...</g:layer>子元素來定位頁眉,頁腳和內容。 LayoutPanel(很像DockLayoutPanel)使用絕對定位來定位其圖層,以達到像素完美的位置。

因此,這裏是它應該是什麼樣子:

... 
<g:center> 
    <g:layer top="0px" height="YOUR HEADER HEIGHT"> 
    <g:HTMLPanel> 
     A heade panel 
    </g:HTMLPanel> 
    </g:layer> 
    <g:layer top="YOUR HEADER HEIGHT" bottom="YOUR FOOTER HEIGHT"> 
    <g:HTMLPanel styleName="{style.mainPanel}"> 
     I want this panel to fill the space 
    </g:HTMLPanel> 
    </g:layer> 
    <g:layer bottom="0px" height="YOUR FOOTER HEIGHT"> 
    <g:HTMLPanel> 
     Footer here 
    </g:HTMLPanel> 
    </g:layer> 
</g:center> 
... 

這足以說明在X或Y軸2個座標的層和LayoutPanel將使層內的小部件佔用全部可用空間在另一個軸上。因此,如果您指定了topheight值,則小部件將佔用橫軸上的所有可用空間,並位於top座標處並指定height

1

您可以嵌入另一個DockLayoutPanel作爲外部DockLayoutPanelcenter小部件。

即:

<g:DockLayoutPanel unit='EM'> 
... 
    <g:center> 
      <g:DockLayoutPanel unit="EM" width="100%" height="100%"> 
       <g:center> 
        <g:HTMLPanel> 
         I want this panel to fill the space 
        </g:HTMLPanel> 
       </g:center> 
       <g:north size="3"> 
        <g:HTMLPanel> 
         A header panel 
        </g:HTMLPanel> 
       </g:north> 
       <g:south size="3"> 
        <g:HTMLPanel> 
         Footer here 
        </g:HTMLPanel> 
       </g:south> 
      </g:DockLayoutPanel> 

    </g:center> 
... 

DockLayoutPanel是一個專門LayoutPanelLayoutPanel可讓您將相對於其自身邊緣的東西放置,當您想要將某物放到其容器底部時,這非常有用(例如)。如果您需要比DockLayoutPanel更先進的東西,我建議您查看LayoutPanel

+0

我認爲DocLayoutPanels只能連接到RootLayout,所以如果沒有側面板就可以展開 –

+0

如果你把嵌套的DocklayoutPanel放到一個HTMLPanel中,你可能必須指定HTMLPanel的顯式大小,因爲它沒有' t實現RequireResize和ProvideResize接口。所以你把它直接放到了Parnet DockLayoutPanel的中心元素中。 @Tom H:DocklayoutPanels與所有其他LayoutPanels可以連接到實現ProvideResize接口的任何Panel。所以你嵌套任意數量的LayoutPanels –

+0

@timeu糟糕,我不小心將DockLayoutPanel包裝在HTMLPanel中。我編輯了我的答案以解決這個問題。 –

相關問題