GWT: как получить новый размер при выполнении onResize () в SplitLayoutPanel? - PullRequest
3 голосов
/ 07 января 2011

У меня есть SplitLayoutPanel, где одним из дочерних компонентов является FlowPanel.Я расширил FlowPanel, чтобы создать ResizableFlowPanel, который реализует ProvidesResize и requireResize, потому что FlowPanel имеет дочерние компоненты, которые также должны изменить размер.

При перетаскивании разделителей панели SplitLayout, как получить новый размер дочерних компонентов?Я пытался использовать getOffsetWidth() и getElement().getOffsetWidth из FlowPanel, и оба возвращают исходный размер, а не новый размер.

Что я делаю не так?

ВотПодкласс FlowPanel, который я пытаюсь:

class ResizableFlowPanel extends FlowPanel implements ProvidesResize, RequiresResize {

    ResizableFlowPanel() {
        super();
    }

    public void onResize() {
        int li_width = this.getOffsetWidth();
        int li_height = this.getOffsetHeight();
        System.out.println("ResizableFlowPanel:: width : " + li_width + "; height: " + li_height);
        for (Widget child : getChildren()) {
            if (child instanceof RequiresResize) {
                ((RequiresResize) child).onResize();
            }
        }
    }
}

Я просто добавил System.out для просмотра значений в журнале при перемещении сплиттера вместо использования точек останова.Вот как я убедился, что getOffsetHeight () продолжал возвращать исходный размер.

Это также проверяет, что onResize () вызывается для FlowPanel, а также дочерних панелей.Я также попытался добавить границу к FlowPanel, чтобы увидеть, изменится ли она при перетаскивании сплиттера SplitLayoutPanel, и граница не изменится.реализует requireResize реально изменить размер?Или почему onResize () не передает новые ширину и высоту?

1 Ответ

3 голосов
/ 08 января 2011

Я заметил, что получение реальной ширины виджета может занять некоторое время. (Возможно, браузер еще не завершил всю свою работу с макетом.) Поэтому, возможно, вам придется установить таймер в методе onResize ():

    public void onResize() {
        new Timer() {
            @Override
            public void run() {
                int width = ResizeContainer.this.getOffsetWidth();
            }
        }.schedule(100);
    }

или используйте отложенный планировщик:

    public void onResize() {
            Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            @Override
            public void execute() {
                int width = ResizeContainer.this.getOffsetWidth();
            }
        });
    }

Но я попробовал ваш код без таймера или планировщика, и он сработал, так что это может быть проблема, связанная с версией браузера или gwt ... Я использую GWT 2.1.1 и Firefox 3.6.12.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...