Изменение размера окна Vaadin и компонент внутри автоматического выравнивания

У меня есть класс, расширяющий Window следующим образом. Я даю только код, связанный с Window. Код оконного компонента удален, чтобы код и вопрос оставались ясными. У меня окно выглядит как на картинке. Когда я изменяю размер окна, я ожидал, что компоненты внутри окна также будут изменены. Я предполагаю, что мне не хватает какого-то вызова API, чтобы поддерживать соотношение компонентов, увеличивающееся вместе с окном. Или мне нужно делать это самому программно? Пожалуйста, дайте мне знать, как это можно сделать?

 public class VisibleColumnPanel extends Window implements Window.ResizeListener{

  public VisibleColumnPanel(){

    center();
    setResizable(true);
    setModal(true);
    setImmediate(true);
    //setSizeFull();
    addListener(this);
    this.setWidth(720, Unit.PIXELS);
    this.setHeight(600, Unit.PIXELS);
 }

@Override
public void windowResized(ResizeEvent resizeEvent) {

    System.out.println("hit here now");

}


}

Нормальное окно без его разворачивания: - Изменение размера окна Vaadin и компонент внутри автоматического выравнивания

После развертывания окна: - Изменение размера окна Vaadin и компонент внутри автоматического выравнивания

Так есть ли способ, чтобы компоненты внутри окна также расходовали или сохраняли свой рацион вместе с окном?

Я мог бы сделать это программно, если бы мог обрабатывать событие максимального нажатия кнопки. Реализовал реализует Window.ResizeListener. Событие windowResized запускается, только когда я пытаюсь изменить размер окна, перетаскивая мышь. Есть ли способ получить событие нажатия кнопки развертывания / восстановления?

Какая версия Ваадина?

Basil Bourque 21.04.2018 00:30

Вам нужно определить% ширины, чтобы они меняли размер, когда родительский элемент изменяет ширину

André Schild 21.04.2018 06:42

Я использую Ваадин 7. Я изучаю Ваадин. Я установил размер следующим образом. Я не вижу разницы. Нижний колонтитул HorizontalLayout = новый HorizontalLayout (); footer.setMargin (правда); footer.setSpacing (ложь); footer.setWidth (100, Unit.PERCENTAGE);

masiboo 21.04.2018 11:28

Подскажите, пожалуйста. Как я могу поймать нажатие кнопки "развернуть / восстановить"?

masiboo 21.04.2018 11:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
772
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий @ AndréSchild правильный, например установите для TwinColSelect значение setWidth ("100%").

Также обратите внимание, что существует задокументированная ошибка, из-за которой изменение размера TwinColSelect не всегда происходит правильно в окне https://github.com/vaadin/framework/issues/10652. Хорошей новостью является то, что исправление для этого находится в стадии разработки.

Вам не нужно перехватить событие изменения размера, чтобы выполнить то, что вы пытаетесь. Вместо этого вам следует правильно использовать параметры макета, чтобы компоненты и макеты правильно настраивались. Таким образом, он работает более эффективно (т. Е. Без обращения к серверу), поскольку браузер знает, как изменять размер.

Вот упрощенный пример приложения

package com.example.myapplication;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextField;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

@Theme("mytheme")
public class MyUI extends UI {

    public class Person implements Serializable {

        public Person(String name, int birthyear) {
            this.name = name;
            this.birthyear = birthyear;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getBirthyear() {
            return birthyear;
        }

        public void setBirthyear(int birthyear) {
            this.birthyear = birthyear;
        }

        private String name;
        private int birthyear;
        }

    public class MyWindow extends Window implements Window.ResizeListener {
        final HorizontalLayout hLayout = new HorizontalLayout();

        public MyWindow() {
            setCaption("Grid");
            List<Person> people = Arrays.asList(
                new Person("Nicolaus Copernicus", 1543),
                new Person("Galileo Galilei", 1564),
                new Person("Johannes Kepler", 1571));

            Grid<Person> grid1 = new Grid<>();
            grid1.setItems(people);
            grid1.addColumn(Person::getName).setCaption("Name");
            grid1.addColumn(Person::getBirthyear).setCaption("Year of birth");
            grid1.setWidth("100%");

            VerticalLayout buttons = new VerticalLayout();

            Button button1 = new Button("<-");
            Button button2 = new Button("->");
            buttons.addComponents(button1,button2);
            buttons.setComponentAlignment(button1, Alignment.MIDDLE_CENTER);
            buttons.setComponentAlignment(button2, Alignment.MIDDLE_CENTER);

            Grid<Person> grid2 = new Grid<>();
            grid2.setItems(people);
            grid2.addColumn(Person::getName).setCaption("Name");
            grid2.addColumn(Person::getBirthyear).setCaption("Year of birth");
            grid2.setWidth("100%");

            hLayout.addComponents(grid1,buttons,grid2);
            hLayout.setExpandRatio(grid1, 3);
            hLayout.setExpandRatio(buttons, 1);
            hLayout.setExpandRatio(grid2, 3);
            hLayout.setWidth("100%");

            setContent(hLayout);
            setWidth("800px");
        }

        @Override
        public void windowResized(ResizeEvent e) {
            System.out.println("Window resized");
        }
    }

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        final VerticalLayout layout = new VerticalLayout();
        Label label = new Label("Window example");
        layout.addComponent(label);

        final MyWindow window = new MyWindow();

        addWindow(window);

        window.addResizeListener(event -> {
            Label lab = new Label("Window resized");
            layout.addComponent(lab);
        });

        setContent(layout);
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}

Подскажите, пожалуйста. Как я могу поймать нажатие кнопки "развернуть / восстановить"?

masiboo 21.04.2018 11:42

Я уточнил ответ.

Tatu Lund 22.04.2018 17:50

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