我需要设置absolutePanel的大小与其子大小有关,但是getOffset *方法返回0,因为(我认为)孩子还没有显示。
一个简单的例子:
AbsolutePanel aPanel = new AbsolutePanel();
HTML text = new HTML(/*variable lenght text*/);
int xPosition = 20; // actually variable
aPanel.add(text, xPosition, 0);
aPanel.setSize(xPosition + text .getOffsetWidth() + "px", "50px"); // 20px 50px
我还可以通过使用AbsolutePanel大小设置子位置和大小来解决我的问题:
AbsolutePanel aPanel = new AbsolutePanel();
aPanel.setSize("100%", "50px");
HTML text = new HTML(/*variable lenght text*/);
int xPosition = aPanel.getOffsetWidth() / 3; // Once again, getOffsetWidth() returns 0;
aPanel.add(text, xPosition, 0);
在这两种情况下,我都必须找到一种方法:
答案 0 :(得分:4)
Widget有一个onLoad()方法,你可以覆盖当窗口小部件附加到DOM时触发,此时getOffsetWidth()将返回渲染的文本大小 - 除非你的字符串所在的窗口小部件已经有一些大小应用。如果你可以用CSS做你需要的东西(可能只是设置“溢出:可见;”)这可能更好,但有时你真的需要大小,这种技术会给你。
答案 1 :(得分:2)
我认为你应该尝试用css样式来解决这个问题。如果我是你,我会尝试使用addStyle或addStyleNames为父和/或绝对面板设置样式。也许像是......
AbsolutePanel aPanel = new AbsolutePanel();
aPanel.setSize("100%", "50px");
HTML text = new HTML(/*variable lenght text*/);
text.addStyleName("my-custom-style");
在css中你会创建一个css样式,然后适当地调整你的小部件。
另一种方法是......
您可以创建一个功能,创建一个完全符合您需要的HTML小部件。
这里有一些代码可以帮助您入门:
public native void customizeHTMLElement(Element elem, String widthInPx) /*-{
elem.style.width = widthInPx; //this is basically pure js.
}-*/
Then somewhere within your widget make a call to the above function like
public void foo() {
...
customizeHTMLElement(someElement, "20");
...
}
有关JSNI的一些信息 - http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html
答案 2 :(得分:1)
只有在放置和计算小部件后才应调用getOffsetHeight()。所以GWT有
com.google.gwt.core.client.Scheduler
上课。
在我的项目中,我使用LayoutPanel在顶部显示菜单,在中心显示其他内容。但我不知道菜单的大小。所以我向使用getOffsetHeight计算的LayoutPanel提供了如下信息:
layoutPanel.add(widget);
Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand()
{
public void execute()
{
int offsetHeight = widget.getOffsetHeight();
layoutPanel.setWidgetTopHeight(widget, 0, Style.Unit.PX, offsetHeight, Style.Unit.PX);
}
});