Определение доступного места на экране Vaadin и GridLayout

Я пытаюсь создать приложение Vaadin с сеткой внутри VerticalLayout, которая занимает большую часть экрана (так, маленький заголовок, большая сетка, маленький нижний колонтитул). Достаточно легко сделать.

Но я хочу рассчитать размер доступной мне области браузера и разделить его на блоки размером 80x60 пикселей, чтобы на разных дисплеях было разное количество GridLayout ячеек. то есть чем больше у вас дисплей, тем больше ячеек у вас в сетке.

У меня проблема в том, что в init() время информация WebBrowser, из которой я могу получить ширину и высоту, мне недоступна (и об этом сказано в API). Я пробовал пример кода, но "attach" все еще эффективно вызывается из init.

Я мог бы использовать какой-то слушатель (не уверен, какой) для настройки моей сетки и добавления элементов управления ко всему этому, но для меня это звучит очень запутанно и громоздко.

Итак, вопросы:

  1. Какой слушатель подойдет?
  2. Разве нет простого способа выяснить, какое доступное пространство на экране есть?

person ac_    schedule 31.05.2012    source источник


Ответы (2)


Альтернатива 1:

WebBrowser browser = ((WebApplicationContext) getApplication().getContext()).getBrowser();
int width = browser.getScreenWidth();
int height = browser.getScreenHeight();

Наилучший способ:

getApplication().getMainWindow().addListener(new ResizeListener() {
    @Override
    public void windowResized(ResizeEvent e) {
        System.out.printf("window info : %sx%s\n", 
                         e.getWindow().getWidth(), 
                         e.getWindow().getHeight()));
    }
});
person sergiofbsilva    schedule 31.05.2012
comment
Спасибо, но всегда ли гарантируется, что вы получите событие изменения размера при запуске приложения (независимо от того, изменяется ли размер окна браузера) - или это зависит от того, какой браузер вы используете? - person ac_; 31.05.2012
comment
Это хороший вопрос. Вероятно, вам придется использовать обе альтернативы в разных частях вашего кода. - person sergiofbsilva; 31.05.2012
comment
кстати, как вы справитесь с этой проблемой, когда (ширина% 80! = 0 || высота% 60! = 0)? - person sergiofbsilva; 31.05.2012
comment
Если я правильно понял ваш вопрос ... вы устанавливаете размер сетки, кратный количеству ячеек, которые вы можете в ней разместить, и центрируете это на дисплее (вы, несомненно, получите немного `` левый край '' по краям сетки). Таким образом, вы получите хорошо стандартное сеточное пространство - в любом случае, это теория, мне не очень повезло с Ваадином. - person ac_; 31.05.2012

Сделайте свою Application реализацию HttpServletRequestListener и реализуйте обратный вызов следующим образом:

public void onRequestEnd(HttpServletRequest request,
        HttpServletResponse response) {
    WebBrowser browser = ((WebApplicationContext) getContext()).getBrowser();
    int width = browser.getScreenWidth();
    int height = browser.getScreenHeight();
    if(width==0 || width==-1) return;
    if(height==0 || height==-1) return;
    System.out.println("Your browser window is "+width+" by "+height);
person ac_    schedule 02.06.2012
comment
На самом деле это работает только для установки размера компонентов после того, как я нажму «Обновить» в браузере. Просто нужно придумать, как сейчас обновить клиент. - person ac_; 02.06.2012