如何将LayoutPanel放置在父LayoutPanel(RootLayoutPanel,屏幕,浏览器页面)的中间位置?假设内部面板具有固定尺寸,外部面板是灵活的并且调整大小(使用浏览器窗口)。
在Vaadin中,它是一行命令:
(VerticalLayout)outerPane).setComponentAlignment(innerPane,
Alignment.MIDDLE_CENTER);
什么是GWT等价物?
GWT Layout.Alignment枚举仅提供BEGIN END STRETCH
不足。屏幕居中放置对于显示较小的表单,对话框,警告消息,登录屏幕等至关重要。
my post on the GWT forum的详细信息 谢谢
---更新(27.2.2012)---------------
使用建议的技术 - 使用setWidgetLeftRight()和setWidgetTopBottom() - 我需要计算内部组件相对于外部组件的NW位置(x,y),并在每次调整外部容器或内部容器的大小后执行此操作(内容高度)。
因此,如果GWT不支持居中,并且似乎即使在最新版本中它也没有,也会涉及更多编码:
outerComponent.setWidgetLeftRight(innerComponent, x, PX, x, PX);
outerComponent.setWidgetTopBottom(innerComponent, y, PX, y, PX);
x,y计算如下:
x =(w1-w2)/ 2
y =(h1-h2)/ 2
其中:
w1 - 外部元件宽度(可变,易于获得?)
h1 - 外部元件高度(可变,易于获得?)
w2 - 内部中心部件宽度(固定)
h2 - 内部中心组件高度(可变,取决于内容,可能难以获得)
全部优选为像素(PX?)或EM。与%混合时,必须进行更多转换。
每次调整大小事件时都必须重新计算坐标(w1,h1更改)。
随着内部内容的每次更改,必须重新计算坐标(h2变化)。
这是伪装的绝对布局(AbsolutePanel)
CSS解决方案?我在这台服务器上找到了几个例子,但都没有标记为已解决。没有垂直和水平定心以及灵活的内部组件高度。
为什么我不喜欢基于CSS的布局解决方案:
我在考虑这个基于代码的解决方案:
根据这些前提提供解决方案的任何人的要点:)
答案 0 :(得分:1)
您可以使用VerticalPanel
并设置HorizontalAlignment字段,或者如果您想使用LayoutPanels
,您可以调整您在Google群组中发布的GWT文档中的解决方案线程。
LayoutPanel p = new LayoutPanel();
Widget centercontent;
p.add(centercontent);
p.setWidgetLeftRight(centercontent, 5, EM, 5, EM); // Center panel
p.setWidgetTopBottom(centercontent, 5, EM, 5, EM);
这将创建一个中心面板,其下方有5个边距,右边,顶部和底部,如下图所示(只有中间的白色面板可见)。 EM是一个类似于像素的固定大小,但取决于基本字体大小。如果基本字体大小(为您的身体定义的字体大小)设置为16像素,则为1 EM = 16 px
(有关转化信息,请参阅here)。
您还可以使用边距的相对值:
p.setWidgetLeftRight(centercontent, 5, PCT, 5, PCT); //5 % left and right margin
p.setWidgetTopBottom(centercontent, 5, PCT, 5, PCT); // 5 % top and bottom margin.
然而,通过这种方式,您无法完全解决问题(不同的表单大小 - 请参阅google主题中的屏幕截图),因为中心面板始终具有固定的边距(5 EM或5%),与垂直尺寸无关中心小组。
此外,如果中心面板的内容高于可用的屏幕尺寸,则会对其进行裁剪,并在调整浏览器大小时调整其大小。
所以我认为更好的方法是在LayoutPanel中放置FlowPanel
/ HTMLPanel
并应用CSS样式以允许自然调整大小。
答案 1 :(得分:0)
如果您将ResizeListener添加到中心面板(我不确定这是否有效,将立即尝试),该怎么办?基本上,每当窗口调整大小时,面板就会居中(通过计算它相对于其父级高度的高度)。
我最终通过让我的面板实现ResizeHandler并获得以下内容来获得我想要的内容:
@Override public void onResize(ResizeEvent event) {
// for my case, this is the first parent element with the full height.
Widget parent = getParent().getParent();
int height = parent.getOffsetHeight();
// could make this more exact by including height of this panel.
getElement().getStyle().setPaddingTop((int)((height - 80)/2), Unit.PX);
}
// my panel is not initially visible
@Override public void onAttach() {
super.onAttach();
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override public void execute() {
onResize(null);
}
});
}