Vaadin - развернуть компоненты в сетке в Vaadin

Я делаю свой проект на Vaadin 6. В нем я интегрировал компоненты в сетку. Я прикрепил изображение с этим. Это похоже на макет моего проекта. Это похоже на затмение. Итак, макет будет иметь две боковые панели слева и справа. а также центральную и нижнюю панели. И красный цвет на картинке - это кнопки. Когда я их нажимаю, панель сворачивается. Я хочу, чтобы центральная панель расширялась и занимала область свернутой панели. Я интегрировал панели в сетку. Может ли кто-нибудь сказать мне, как развернуть компонент в макете сетки.

Когда я минимизирую "R"; «C» и «B» должны занимать эту область.

Когда я минимизирую «B»; «C» должна занимать эту площадь.

Когда я минимизирую «L»; «C» и «B» должны занимать эту область. layout


person Gugan    schedule 11.03.2013    source источник


Ответы (4)


Вот рабочий пример без дополнительных надстроек. Вы можете использовать горизонтальную и вертикальную компоновку.

public class TestUI extends UI {

    Panel L = new Panel();
    Panel C = new Panel();
    Panel B = new Panel();
    Panel R = new Panel();

    Button bL = new Button("Toggle L", new CloseButtonHandler(L));
    Button bC = new Button("Toggle C", new CloseButtonHandler(C));
    Button bB = new Button("Toggle B", new CloseButtonHandler(B));
    Button bR = new Button("Toggle R", new CloseButtonHandler(R));

    @Override
    protected void init(VaadinRequest request) {
        L.setWidth("80px");
        L.setHeight("100%");
        L.setContent(new Label("L"));
        R.setWidth("80px");
        R.setHeight("100%");
        R.setContent(new Label("R"));
        B.setHeight("80px");
        B.setWidth("100%");
        B.setContent(new Label("B"));
        C.setHeight("100%");
        C.setHeight("100%");
        C.setContent(new Label("C"));

        VerticalLayout vl = new VerticalLayout();
        vl.addComponent(C);
        vl.addComponent(B);
        vl.setExpandRatio(C, 1);
        vl.setSizeFull();

        HorizontalLayout hl = new HorizontalLayout();
        hl.addComponent(L);
        hl.addComponent(vl);
        hl.addComponent(R);
        hl.setExpandRatio(vl, 1);
        hl.setSizeFull();

        CssLayout root = new CssLayout();
        root.addComponent(bL);
        root.addComponent(bC);
        root.addComponent(bB);
        root.addComponent(bR);
        root.addComponent(hl);
        root.setSizeFull();

        setContent(root);
    }

    private class CloseButtonHandler implements ClickListener {
        private Panel layout;

        public CloseButtonHandler(Panel layout) {
            this.layout = layout;
        }

        @Override
        public void buttonClick(ClickEvent event) {
            layout.setVisible(!layout.isVisible());
        }
    }
}

Пример для Vaadin 7, но концепция должна работать и с Vaadin 6.

person raffael    schedule 11.03.2013
comment
Да, он работает в Vaadin 6. Но я все еще не могу реализовать его в своем проекте. В любом случае, я принимаю этот ответ, потому что вы ответили на мой вопрос. - person Gugan; 14.03.2013

Ответ Раффеля - лучшее и самое быстрое решение этого вопроса. Но при его реализации у меня возникла проблема со структурой проекта.

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

Я установил «C» и «B» в вертикальной компоновке под названием «VL». И я установил «L», «VL» и «R» в горизонтальной компоновке под названием «HL». И я добавил кнопки для переключения, где мне было нужно. Всякий раз, когда я нажимаю любую кнопку-переключатель, он скроет макет. Я добился этого, переопределив

 setExpandRatio();

Когда нажимается кнопка переключения, я переопределяю setExpandRation () для этого компонента. И снова, когда кнопка нажимается снова, я сбрасываю setExpandRatio () на более старое значение. Эта идея хорошо работает с мониторами любого размера.

person Gugan    schedule 14.03.2013

Думаю, вам повезет больше, если вы воспользуетесь надстройкой BorderLayout. Я не говорю, что это невозможно сделать с помощью GridLayout, но я считаю, что это требует дополнительных усилий. Посмотрите демонстрацию.

Как и в демонстрации, вы можете заменить позицию кнопкой «восстановить» при нажатии кнопки сворачивания (вы не упомянули о восстановлении части макета, но я предполагаю, что это было в ваших планах вместе с минимизацией?). Поэтому, когда вы щелкаете по минимуму в полноразмерном макете (скажем, R или восток), вы заменяете восточное положение кнопкой восстановления, которая заменяет себя макетом R.

person miq    schedule 11.03.2013
comment
Похоже, аддон мне поможет. Я приму этот ответ, как только он удовлетворит потребности моего проекта. Thankyu miq. - person Gugan; 11.03.2013
comment
Привет, Мик. Я попробовал то, что вы предложили. Но я не могу изменить размер компонентов. Только я могу изменить размер макета границы. - person Gugan; 13.03.2013
comment
Вы имеете в виду, что вы вызываете setWidth и setHeight для компонентов, но они не подчиняются? Имеет ли отношение размер компонентов к исходной проблеме? Я спрашиваю, потому что в моем решении не будет необходимости изменять размер каких-либо компонентов. Вместо этого вы заменяете контейнер компонента в borderlayout кнопкой восстановления и наоборот, когда нажимаете кнопку восстановления. - person miq; 13.03.2013
comment
Кто бы ни проголосовал против моего ответа, ПОЖАЛУЙСТА, дайте нам знать, почему, по вашему мнению, мой ответ не помог. - person miq; 13.03.2013
comment
Вы правы, Miq. Я попытался изменить размер компонентов. Но они этого не сделали. Компоненты меняют размер только тогда, когда мы изменяем размер макета границы. - person Gugan; 14.03.2013
comment
Я предполагаю, что это немного выходит за рамки исходного вопроса ... но пробовали ли вы анализировать свои макеты в режиме отладки (добавьте? Отладка в конце вашего URL-адреса)? Подобные вещи обычно происходят, когда у вас есть макет с неопределенным размером и компонентами относительно размера внутри него. - person miq; 14.03.2013
comment
Может быть. Но это основы. Мы должны самостоятельно контролировать размер компонентов. - person Gugan; 14.03.2013
comment
Значит, размеры ваших макетов не определены? Вам нужно будет установить для них размер, если вы хотите использовать относительный размер с дочерними компонентами. Это не ошибка в Vaadin или компоненте BorderLayout. Вы можете изменить размер ваших компонентов. - person miq; 14.03.2013

Я бы попытался реализовать это таким образом, чтобы использовать VerticalLayouts и HorizontalLayouts. Непроверенный пример:

HorizontalLayout root = new HorizontalLayout();
root.setSizeFull();

Component l = ...
l.setWidth("200px");
l.setHeight("100%");
root.addcomponent(l);

VerticalLayout cb = new VerticalLayout();
cb.setSizeFull();

Component c = ...
c.setSizeFull();
cb.addComponent(c);
cb.setExpandRatio(c, 1);

Component b = ...
b.setWidth("100%");
l.setHeight("200px");
cb.addComponent(b);

root.addcomponent(cb);
root.setExpandRatio(cb, 1);

Component r = ...
r.setWidth("200px");
r.setHeight("100%");
root.addComponent(r);

Затем вы можете реализовать скрытие, удалив компонент из его макета или сделав его невидимым.

person Henri Kerola    schedule 11.03.2013