GWT - получить размер виджета, который не отображается - PullRequest
6 голосов
/ 22 апреля 2010

Мне нужно установить размер absolutePanel относительно его дочернего размера, но методы getOffset * возвращают 0, потому что (я думаю) дочерний элемент еще не отображался.

A Быстрый пример:

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 ]

4 голосов
/ 06 июня 2011

Виджет имеет метод onLoad (), который вы можете переопределить, который срабатывает, когда виджет присоединен к DOM, после чего getOffsetWidth () возвращает размер отрисованного текста - если виджет, в котором находится ваша строка, уже не имеет некоторого размераприменяется.Если вы можете делать то, что вам нужно, с помощью CSS (в том числе, возможно, просто установив «overflow: visible;»), это, вероятно, лучше, но иногда вам действительно нужен размер, и этот метод даст его вам.

2 голосов
/ 23 апреля 2010

Я думаю, вы должны попытаться решить эту проблему с помощью стилей 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

1 голос
/ 27 марта 2013

Вы должны вызывать getOffsetHeight () только после того, как виджет будет размещен и рассчитан. Так что у GWT есть

com.google.gwt.core.client.Scheduler

класс, чтобы сделать это.

В моем проекте я использую LayoutPanel для отображения меню вверху и другого контента в центре. Но я не знаю размер меню. Поэтому я предоставляю информацию для LayoutPanel, рассчитанную с использованием getOffsetHeight, следующим образом:

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);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...