On Friday, May 26, 2017 at 10:32:12 PM UTC+2, Piotr Morgwai Kotarbinski 
wrote:
>
> Hey all,
> I have the following code:
>
> uiBinder ui.xml template:
> <!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">
>   <g:ScrollPanel>
>     <g:SimpleLayoutPanel><g:Label>AAA</g:Label></g:SimpleLayoutPanel>
>   </g:ScrollPanel>
> </ui:UiBinder>
>
> uiBinder java class:
> public class TestLayout extends Composite {
>   interface ViewUiBinder extends UiBinder<Widget, TestLayout> {}
>   private static ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class);
>   public TestLayout() { initWidget(uiBinder.createAndBindUi(this)); }
> }
>
> entryPoint:
> public void onModuleLoad() { RootLayoutPanel.get().add(new TestLayout()); 
> }
>
> ...and it renders to an empty page :(
>
> the exact resulting html is like this: (copied from chrome's dom 
> inspector, formatting mine)
> <!doctype html>
> <html>
> <head>
>   <meta http-equiv="content-type" content="text/html; charset=UTF-8">
>   <script type="text/javascript" src="Gwt/Gwt.nocache.js"></script>
>   <link rel="stylesheet" href="
> http://localhost:8088/Gwt/gwt/standard/standard.css";>
>   <script src="
> http://localhost:8088/Gwt/7ED5A073690437962C6F98112D263AB9.cache.js";
> ></script>
> </head>
> <body>
> <iframe src='javascript:""' id="Gwt" tabindex="-1" style="position: 
> absolute; width: 0px; height: 0px; border: none; left: -1000px; top: -
> 1000px;"></iframe>
> <div aria-hidden="true" style="position: absolute; z-index: -32767; top: -
> 20cm; width: 10cm; height: 10cm; visibility: hidden;">&nbsp;</div>
> <div style="position: absolute; left: 0px; top: 0px; right: 0px; bottom: 
> 0px;">
>   <div aria-hidden="true" style="position: absolute; z-index: -32767; top: 
> -20ex; width: 10em; height: 10ex; visibility: hidden;">&nbsp;</div>
>   <div style="position: absolute; overflow: hidden; left: 0px; top: 0px; 
> right: 0px; bottom: 0px;">
>     <div style="overflow: auto; position: absolute; zoom: 1; left: 0px; 
> top: 0px; right: 0px; bottom: 0px;">
>       <div style="position: relative; zoom: 1;">
>         <div style="position: relative;">
>           <div aria-hidden="true" style="position: absolute; z-index: -
> 32767; top: -20ex; width: 10em; height: 10ex; visibility: hidden;">&nbsp;
> </div>
>           <div style="position: absolute; overflow: hidden; left: 0px; top
> : 0px; width: 100%; height: 100%;">
>             <div class="gwt-Label" style="position: absolute; left: 0px; 
> top: 0px; right: 0px; bottom: 0px;">AAA</div>
>           </div>
>         </div>
>       </div>
>     </div>
>   </div>
> </div>
> </body>
> </html>
>
> notice the "position: absolute;" in the style of the 2 inner-most div 
> elements surrounding "AAA" : if I change them manually to "position: 
> relative;" inside chrome's dom inspector then it renders ok.
> moreover, if I just replace the SimpleLayoutPanel with a SimplePanel in 
> the ui.xml file, it all renders fine in spite of still using a 
> RootLayoutPanel (not a RootPanel) in my EntryPoint... :?
>
> I've also noticed that similar problem appears when I try to put a 
> SimpleLayoutPanel inside a VerticalPanel:
> <!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">
>   <g:VerticalPanel>
>     <g:SimpleLayoutPanel><g:Label>AAA</g:Label></g:SimpleLayoutPanel>
>     <g:SimpleLayoutPanel><g:Label>BBB</g:Label></g:SimpleLayoutPanel>
>   </g:VerticalPanel>
> </ui:UiBinder>
>
> ...because of very similar reasons: the 2 inner-most div elements around 
> both "AAA" and "BBB" will have "position: absolute;" in their style. Again, 
> replacing it manually for "position: relative;" makes it render ok and 
> replacing the SimpleLayoutPanel with a SimplePanel makes it all work ok.
>
> Is it a bug or am I missing something? If it's expected then what Panel 
> should I use instead of a SimpleLayoutPanel as a placeholder inside a 
> ScrollPanel or a VerticalPanel when using layout Panels in general? (a 
> SimplePanel works, but it's not a layout Panel, so I guess I should not 
> rely that it will work under all possible circumstances and I guess I 
> should be using some layout Panel instead)
>

tl;dr: use a SimplePanel (it's OK, it's "just a div element"; actually a 
SimplePanel is like a FlowPanel, except its API ensures it can only contain 
one single Widget).

For a ScrollPanel to be able to make its content scroll, it must not 
dictate its size.
A SimpleLayoutPanel expects that its parent will give it dimensions, that 
it will then transfer to its inner widget (hence the div with 
position:relative with a div with position:absolute an 
left:0;top:0;width:100%;height:100%, and the gwt-Label with 
left:0;top:0;right:0;bottom:0). If you don't give an explicit size to the 
SimpleLayoutPanel, and its parent doesn't (such as when it's a ScrollPanel 
or a VerticalPanel), then it'll end up with a height of 0, and because of 
the overflow:hidden you won't see its content (the gwt-Label).

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.

Reply via email to