Это происходит потому, что когда вы добавляете другой компонент в FlowLayout, он изменяет размеры, увеличивая свою собственную высоту, которая выдвигает нижний компонент ниже видимой области. В коде нет ничего, что сжимало бы центральный компонент, так что нижний компонент остается на своем прежнем месте.
Еще одна вещь заключается в том, что вы используете FitLayout для contentPanel, который содержит 3 компонента, FitLayout используется для контейнеров с одним компонентом внутри, который должен заполнить своего родителя.
Вам необходимо учесть следующее:
1) Используйте RowLayout, который позволяет намного лучше контролировать расположение компонентов
2) Определите, какой компонент вы хотите разместить в вертикальной полосе прокрутки, поскольку вы добавляете компоненты динамически.
Для вашего текущего требования достаточно кода:
public void onModuleLoad() {
final Viewport viewport = new Viewport();
viewport.setLayout(new FitLayout());
// final ContentPanel contentPanel = new ContentPanel(new FlowLayout());
// contentPanel.setHeaderVisible(false);
final LayoutContainer topContainer = new LayoutContainer(
new FlowLayout());
final Button buttonOne = new Button("Top:One");
topContainer.add(buttonOne);
// contentPanel.setTopComponent(topContainer);
final LayoutContainer centerPanel = new LayoutContainer(new FitLayout());
centerPanel.add(new Button("Center"));
// contentPanel.add(centerPanel);
final LayoutContainer botPanel = new LayoutContainer(new FlowLayout());
botPanel.add(new Button("Bottom"));
// contentPanel.setBottomComponent(botPanel);
final ContentPanel panel = new ContentPanel();
panel.setHeaderVisible(false);
panel.setLayout(new RowLayout(Orientation.VERTICAL));
panel.add(topContainer, new RowData(1, -1, new Margins(4)));
panel.add(centerPanel, new RowData(1, 1, new Margins(0, 4, 0, 4)));
panel.add(botPanel, new RowData(1, -1, new Margins(4)));
viewport.add(panel, new FlowData(10));
RootPanel.get().add(viewport);
// Later, add a second button to the topComponent ...
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
final Button buttonTwo = new Button("Top:Two");
topContainer.add(buttonTwo); // Doesn't show up at first.
panel.layout(true);
}
});
}