Получить 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(), Добавьте дополнительную проверку, чтобы убедиться, что позиции в текущем вызове верны.

Другие вопросы по тегам