GWT: PopupPanel setPopupPositionAndShow() доставляет неправильные offsetWidth и offsetHeight
Я написал свой 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 ответа
Решение
getOffsetWidth()
а также getOffsetHeight()
работать только в том случае, если DOM полностью построен и контейнер, для которого вы хотите получить значение, виден и присоединен.
Почему бы вам не использовать showRelativeTo()
функция PopupPanel
?
popup.showRelativeTo(SomeWidget);
Чтобы решить эту проблему, я следовал инструкциям PopupPanel
"s 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);
}
});