GWT - 检索未显示的窗口小部件的大小

时间:2010-04-22 15:20:24

标签: gwt

我需要设置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);

在这两种情况下,我都必须找到一种方法:

  • 检索尚未显示的窗口小部件的大小
  • 在显示小部件时收到通知

3 个答案:

答案 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);
    }
});