У меня есть класс, расширяющий 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");
}
}
Нормальное окно без его разворачивания: -

Так есть ли способ, чтобы компоненты внутри окна также расходовали или сохраняли свой рацион вместе с окном?
Я мог бы сделать это программно, если бы мог обрабатывать событие максимального нажатия кнопки. Реализовал реализует Window.ResizeListener. Событие windowResized запускается, только когда я пытаюсь изменить размер окна, перетаскивая мышь. Есть ли способ получить событие нажатия кнопки развертывания / восстановления?
Вам нужно определить% ширины, чтобы они меняли размер, когда родительский элемент изменяет ширину
Я использую Ваадин 7. Я изучаю Ваадин. Я установил размер следующим образом. Я не вижу разницы. Нижний колонтитул HorizontalLayout = новый HorizontalLayout (); footer.setMargin (правда); footer.setSpacing (ложь); footer.setWidth (100, Unit.PERCENTAGE);
Подскажите, пожалуйста. Как я могу поймать нажатие кнопки "развернуть / восстановить"?




Комментарий @ 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 {
}
}
Подскажите, пожалуйста. Как я могу поймать нажатие кнопки "развернуть / восстановить"?
Я уточнил ответ.
Какая версия Ваадина?