我被困在获得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
位置链的总和。 (如果使用JSNI检查这个,那么即使在JavaScript中它们在这些时刻也是0)
同样,setPopupPositionAndShow
允许设置位置但不能获得它:(
答案 0 :(得分:3)
最后,我有这个工作:
@Override
public void setPopupPosition(int left, int top) {
super.setPopupPosition(left, top);
if (this.isAttached()) Log.debug("setPos:"+this.getAbsoluteLeft() +";"+this.getAbsoluteTop());
}
它得到了正确的位置,我希望这是正确的方法,并且每次调用setPopupPosition
。您甚至可以在使用setPopupPositionAndShow
时手动调用它。
我认为让这个问题保持在“为子孙后代”这一点是明智的。
更新。如果您打算拨打center(...)
或类似对话方法,请注意setPopupPosition
将被调用两次或更多次(可能是第一次使用0, 0
),即使您要检查它是否isAttached()
。添加一些额外的检查以确保当前呼叫中的位置正确。