Hi!
It is the 3rd or 4th sites I'm doing with GWT, it is a very sexy solution which is working nicely, but I'm still having some basic problems of setting the height of some elements of my sites. This is really basic, but not so easy to handle...
I really hope that some GWT guru can help us (I'm sure I'm not the only one to get that issue) on what is the best practice to handle such cases.
Problems:
1) How do I set the height of a widget when setHeight() does not work with % or not as expected (either height=0, or not as expected)?
2) Why in onLoad(), headerPanel.getOffsetHeight() and footerPanel.getOffsetHeight() are == 0? (Please read code bellow)
3) Same with ScrollerPanel, how can I set the height of it without need to set it in pixels?
4) Why height in % behavior does not work when included in a DecoratorPanel?
I could read on gwt group that the height is very browser dependent and would require heavy calculs - BUT - do we need to do them in Applications?
Code principles:
- gwt 2.1.0.m2 (same issus with 2.04)
- NOT using declarative UI with UiBinder - good old style java code
- Using Standard Mode, and, LayoutPanels
Site description:
- 1 FlowPanel used as like VerticalPanel, filled with
- 1 headerPanel: FlowPanel containing 2 other FlowPanel: logoPanel, and flagPanel
- 1 tabPanel: TabLayoutPanel containing few tabs
- 1 footerPanel: FlowPanel containing a Label
Idea:
- header is fixed height depending on logos (image) height, and possible margin/padding in css.
- footer is fixed height depending on label height, and possible margin/padding in css
- tabPanel's height depends on the document height => it should fill the whole space between header and footer.
Solutions in mind:
- use tabPanel.setHeight( "100%" ), but it does take the 100% of the whole page (!), not the 100% of the space between header/ footer.
- calculate tabPanel's height in px, BUT, I need to know the height of the header and the footer, which isn't accessible through getOffsetHeight()...
Code:
Here is my Application.java file:
public class Application extends Composite implements ResizeHandler {
final FlowPanel logoPanel = new FlowPanel();
final FlowPanel flagPanel = new FlowPanel();
final FlowPanel headerPanel = new FlowPanel();
final SimplePanel headerWrapperPanel = new SimplePanel();
final CipherPanel cipherPanel = new CipherPanel();
final OptionPanel optionPanel = new OptionPanel();
final AboutPanel aboutPanel = new AboutPanel();
final TabLayoutPanel tabPanel = new TabLayoutPanel( 3, Unit.EM );
final FlowPanel footerPanel = new FlowPanel();
final FlowPanel panel = new FlowPanel();
public Application() {
final Image padlockImg = new Image( Resources.inst.padlock() );
final Image titleImg = new Image( Resources.inst.title() );
final Image flagUKImg = new Image( Resources.inst.flagUK() );
final Image flagFRImg = new Image( Resources.inst.flagFR() );
final Image flagESImg = new Image( Resources.inst.flagES() );
final Label emailLabel = new Label( Strings.inst.contactEmail() );
flagUKImg.addStyleName( "App_flagImg" );
flagFRImg.addStyleName( "App_flagImg" );
flagESImg.addStyleName( "App_flagImg" );
logoPanel.add( padlockImg );
logoPanel.add( titleImg );
logoPanel.addStyleName( "App_logoPanel" );
flagPanel.add( flagFRImg );
flagPanel.add( flagUKImg );
flagPanel.add( flagESImg );
flagPanel.addStyleName( "App_flagPanel" );
headerPanel.add( logoPanel );
headerPanel.add( flagPanel );
//headerWrapperPanel.setWidget( headerPanel );
tabPanel.add( cipherPanel, CipherPanel.Strings.inst.panelTitle() );
tabPanel.add( optionPanel, OptionPanel.Strings.inst.panelTitle() );
tabPanel.add( aboutPanel, AboutPanel.Strings.inst.panelTitle() );
tabPanel.addStyleName( "App_tabPanel" );
tabPanel.setSize( "80%", "100%" );
emailLabel.addStyleName( "App_emailLabel" );
footerPanel.add( emailLabel );
panel.add( headerPanel );
//panel.add( headerWrapperPanel );
panel.add( tabPanel );
panel.add( footerPanel );
panel.addStyleName( "App_panel" );
initWidget( panel );
}
protected void onLoad() {
super.onLoad();
String txt = "logo panel: " + logoPanel.getOffsetHeight() + " header height: " + headerPanel.getOffsetHeight() + " header wrapper height: " + headerWrapperPanel.getOffsetHeight() + " footer height: " + footerPanel.getOffsetHeigh
t() + " panel.height: " + panel.getOffsetHeight();
Window.alert( txt );
}
}
Note: no size has been set in the .css.
Description:
- Here, I'm using tabPanel.setSize( "80%", "100%" ), which does set the height but definitely too big, it seams that it use the 100% of the ClientWidth!
- Also, in onLoad() I'm printing the height of the logoPanel (which is correct), headerPanel (which is ==0), I've used a headerWrapperPanel (which is ==0), footerPanel (==0 too) -
Why these panels do not get the height of their inner panels?
I also got the problem with ScrollerPanel, impossible to tell it setHeight("100%")... It is a nightmare!
We need to set the size in pixel which is almost impossible in some case...
Why is it still so complicated to set widget's height in the second version of GWT?
GWT is a sweet toolkit! I love the idea, and I love it, BUT, some times it is a pain! With such basic stuffs, it is quite annoying...
Thanks to all, and be happy!
--
Jeanluc