1

の絶対位置を取得するのに行き詰まっていDialogBoxます。PopupPanel(の親であるDialogBox)がそれを設定することは一般的な問題(および奇妙な回避策)であることを私は知っていますが、 それを取得したい場合、ボックスがDOMに接続された正確な瞬間は何ですか?オーバーライドshowも役に立たないonAttachshow

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になります)

Again, setPopupPositionAndShow allows to set position but not get it :(

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

この質問を「将来の世代のために」SOにとどまらせるのが賢明だと思います。


更新 center(...)ダイアログの呼び出しまたは同様のメソッドを計画している場合は、それを確認する場合でも、 setPopupPosition2回以上呼び出されることに注意してください(初めての場合もあります) 。現在の通話で位置が正しいことを確認するために、いくつかのチェックを追加します。0, 0isAttached()

于 2011-12-29T15:22:42.850 に答える