Получить GWT DialogBox абсолютную позицию - onLoad/onAttach/show не помогает
Я застрял в получении абсолютной позиции DialogBox
, Я знаю, что это общая проблема (и странный обходной путь) для PopupPanel
(который является родителем DialogBox
), чтобы установить его, но что, если я хочу его получить, какой именно момент, когда коробка прикреплена к DOM? Ни переопределение show
ни onAttach
ни show
не помогает:
class MyDialog extends DialogBox {
public MyDialog(. . .) {
ComplexPanel vert = new VerticalPanel();
vert.add("Test");
vert.add(new Button("Close", new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
MyDialog.this.hide();
}
}));
setWidget(vert);
this.addAttachHandler(new AttachEvent.Handler() {
@Override
public void onAttachOrDetach(AttachEvent event) {
if (event.isAttached()) Log.debug("attach:"+MyDialog.this.getAbsoluteLeft() +";"+
MyDialog.this.getAbsoluteTop());
}
});
}
@Override
protected void onLoad() {
super.onLoad();
Log.debug("load:"+this.getAbsoluteLeft() +";"+this.getAbsoluteTop());
}
@Override
public void show() {
super.show();
Log.debug("show:"+this.getAbsoluteLeft() +";"+this.getAbsoluteTop());
}
}
Поэтому, когда я звоню new MyDialog().show();
, все эти строки делают лог 0;0
, однако диалог расположен в центре страницы. Но то, что я хочу, это сумма цепочки offsetParent
позиции. (И они равны 0 в эти моменты даже в JavaScript, если использовать JSNI, чтобы проверить это)
Снова, setPopupPositionAndShow
позволяет установить положение, но не получить его:(
1 ответ
Наконец, у меня есть это, чтобы работать:
@Override
public void setPopupPosition(int left, int top) {
super.setPopupPosition(left, top);
if (this.isAttached()) Log.debug("setPos:"+this.getAbsoluteLeft() +";"+this.getAbsoluteTop());
}
Это занимает правильную позицию, и я надеюсь, что это правильный способ сделать это и setPopupPosition
называется каждый раз. Вы даже будете вызывать его вручную при использовании setPopupPositionAndShow
,
Я думаю, что будет разумно оставить этот вопрос в SO "для будущих поколений".
Upd. Если вы планируете позвонить center(...)
или аналогичный метод вашего диалога, имейте в виду, что setPopupPosition
будет вызываться дважды или более раз (может быть впервые с 0, 0
), даже если вы проверите, если это isAttached()
, Добавьте дополнительную проверку, чтобы убедиться, что позиции в текущем вызове верны.