Получить GWT DialogBox абсолютную позицию - onLoad / onAttach / show не помогает - PullRequest
1 голос
/ 29 декабря 2011

Я застрял в получении абсолютной позиции 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 Ответ

3 голосов
/ 29 декабря 2011

Наконец-то у меня получилось:

@Override
public void setPopupPosition(int left, int top) {
    super.setPopupPosition(left, top);
    if (this.isAttached()) Log.debug("setPos:"+this.getAbsoluteLeft() +";"+this.getAbsoluteTop());
}

Он занимает правильную позицию, и я надеюсь, что это правильный путь, и setPopupPosition вызывается каждый раз. Вы даже будете вызывать его вручную при использовании setPopupPositionAndShow.

Я думаю, что было бы разумно оставить этот вопрос на ТА "для будущих поколений".


Upd. Если вы планируете вызвать center(...) или какой-либо подобный метод вашего диалога, помните, что setPopupPosition будет вызываться дважды или более раз (может быть впервые с 0, 0) , даже если вы проверите, если это isAttached(). Добавьте дополнительную проверку, чтобы убедиться, что позиции в текущем вызове верны.

...