1

我被困在获得DialogBox. 我知道 设置PopupPanel它是(它是父级DialogBox)的常见问题(和奇怪的解决方法) ,但是如果我想得到,盒子连接到 DOM 的确切时刻是什么时候?既不压倒也无济于事:showonAttachshow

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位置链的总和。(即使在 JavaScript 中,它们在这些时刻也是 0,如果使用 JSNI 来检查这一点)

同样,setPopupPositionAndShow允许设置位置但不获取它:(

4

1 回答 1

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()。添加一些额外的检查以确保当前调用中的位置正确。

于 2011-12-29T15:22:42.850 回答