GWT: PopupPanel setPopupPositionAndShow () доставляет неправильные offsetWidth и offsetHeight - PullRequest
2 голосов
/ 08 ноября 2011

Я написал свой PopupPanel в GWT.Я хочу показать всплывающее окно относительно другого виджета.Моя реализация класса выглядит следующим образом:

public class Popover extends PopupPanel implements PositionCallback {

    private static final Binder binder = GWT.create(Binder.class);
    private UIObject relative;

    interface Binder extends UiBinder<Widget, Popover> {
    }

    public Popover() {
        setWidget(binder.createAndBindUi(this));
        setStylePrimaryName("popover");
    }

    public void show(UIObject relative) {

        this.relative = relative;
        setPopupPositionAndShow(this);

    }

    public void setPosition(int offsetWidth, int offsetHeight) {

        if (relative != null) {

            int left = relative.getAbsoluteLeft();
            int top = relative.getAbsoluteTop();
            int width = relative.getOffsetWidth();
            int height = relative.getOffsetHeight();

            int topCenter = top + height / 2 - offsetHeight / 2;


            if (offsetWidth < left) {
                setPopupPosition(left - offsetWidth, topCenter);
            } else {
                setPopupPosition(left + width, topCenter);

            }
        }
    }

}

Проблема в том, что offsetWidth и offsetHeight всегда 10?

Мой Popover.ui.xml выглядит следующим:

<g:FlowPanel stylePrimaryName="popover">
    <g:FlowPanel stylePrimaryName="arrow" />
    <g:FlowPanel stylePrimaryName="inner">
        <g:Label stylePrimaryName="title" text="New Label" />
        <g:FlowPanel stylePrimaryName="content">
            <g:Label text="Hallo" />
        </g:FlowPanel>
    </g:FlowPanel>
</g:FlowPanel>

Ответы [ 2 ]

5 голосов
/ 07 февраля 2013

Чтобы решить эту проблему, я следовал инструкциям PopupPanel setPopupPositionAndShow(), но сделал шаг позиционирования отложенной командой. Мой код не расширил PopupPanel, следовательно, переменная popupPanel:

popupPanel.setVisible(false);
popupPanel.show();

// Pausing until the event loop is clear appears to give the browser
// sufficient time to apply CSS styling.  We use the popup's offset
// width and height to calculate the display position, but those
// dimensions are not accurate until styling has been applied.
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
   @Override
   public void execute() {
      yourMethodToSetPositionGoesHere(popupPanel);
      popupPanel.setVisible(true);
   }
});
1 голос
/ 09 ноября 2011

getOffsetWidth() и getOffsetHeight() работают только в том случае, если DOM полностью создан и контейнер, для которого вы хотите получить значение, виден и присоединен.

Почему бы вам не использовать функцию showRelativeTo() PopupPanel?

popup.showRelativeTo(SomeWidget);
...