次のアプローチは私にとってはうまくいきました。これは、Zack Linder のアドバイスに基づいてい
ます Google Web Toolkit ›layout panel problem
(1) HeaderLayoutPanel を RootLayoutPanel にアタッチします。headerLayoutPanel は、HeaderPanel を拡張し、ProvidesResize() を実装する作成するクラスです。
import com.google.gwt.user.client.ui.HeaderPanel;
import com.google.gwt.user.client.ui.ProvidesResize;
import com.google.gwt.user.client.ui.SimpleLayoutPanel;
import com.google.gwt.user.client.ui.Widget;
public class HeaderLayoutPanel extends HeaderPanel implements ProvidesResize {
SimpleLayoutPanel contentPanel;
public HeaderLayoutPanel() {
super();
contentPanel=new SimpleLayoutPanel();
}
@Override
public void setContentWidget(Widget w) {
contentPanel.setSize("100%","100%");
contentPanel.setWidget(w);
super.setContentWidget(contentPanel);
}
public void onResize() {
int w=Window.getClientWidth();
int h=Window.getClientHeight();
super.setPixelSize(w, h);
}
}
(2) 次に、HeaderLayoutPanel をインスタンス化します。ヘッダーとフッターのウィジェットには固定の高さ (メニュー バーの高さなど) が割り当てられ、幅はパネルの幅に合わせて自動的に調整されます。中央のウィジェットは ProvidesSize である必要があります。レイアウトパネルを使用しました。例えば、
public class AppViewer extends Composite implements MyApp.AppDisplay {
private HeaderLayoutPanel allContentsPanel;
MenuBar menuBarTop;
MenuBar menuBarBottom;
LayoutPanel dataPanel;
public AppViewer() {
allContentsPanel = new HeaderLayoutPanel();
menuBarTop = new MenuBar(false);
menuBarBottom = new MenuBar(false);
dataPanel = new LayoutPanel();
menuBarTop.setHeight("30px");
menuBarBottom.setHeight("20px");
allContentsPanel.setHeaderWidget(menuBarTop);
allContentsPanel.setFooterWidget(menuBarBottom);
allContentsPanel.setContentWidget(dataPanel);
initWidget(allContentsPanel);
}
@Override
public void doOnResize() {
allContentsPanel.onResize();
}
}
(3) 中央のウィジェット (LayoutPanel) は、別の Composite で定義する DeckLayoutPanel を保持します (ただし、やりたいことは何でもできます)。例えば、
public class MyDataView extends Composite implements MyDataPresenter.DataDisplay {
private DockLayoutPanel pnlAllContents;
private HorizontalPanel hpnlButtons;
private HorizontalPanel hpnlToolbar;
private VerticalPanel pnlContent;
public MyView() {
pnlAllContents=new DockLayoutPanel(Unit.PX);
pnlAllContents.setSize("100%", "100%");
initWidget(pnlAllContents);
hpnlToolbar = new HorizontalPanel();
hpnlToolbar.setWidth("100%");
pnlAllContents.addNorth(hpnlToolbar, 30);
hpnlButtons = new HorizontalPanel();
hpnlButtons.setWidth("100%");
pnlAllContents.addSouth(hpnlButtons,20);
pnlContent=new VerticalPanel();
//center widget - takes up the remainder of the space
pnlAllContents.add(pnlContent);
...
}
}
(4) 最後にすべてが onModuleLoad() クラスで結び付けられます。AppViewer は RootLayoutPanel に追加されるディスプレイを生成し、MyDataView はコンテナに追加される display.asWidget() を生成します。例えば、
public class MyApp implements EntryPoint,Presenter{
private HasWidgets container=RootLayoutPanel.get();
private static AppDisplay display;
private DataPresenter dataPresenter;
public interface AppDisplay extends Display{
@Override
Widget asWidget();
HasWidgets getContentContainer();
void doOnResize();
}
@Override
public void onModuleLoad() {
display=new AppViewer();
dataPresenter = new DataPresenter();
display.getContentContainer().add(dataPresenter.getDisplay().asWidget());
container.add(display.asWidget());
bind();
}
@Override
public void bind() {
Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
display.doOnResize();
}
});
}
@Override
public com.midasmed.client.presenter.Display getDisplay() {
return display;
}
}
お役に立てれば!