在子窗口中扩大或缩小 vaadin 日历组件的大小
Expanding or shrinking size of vaadin calendar component in subwindow
子窗口中 Calendar
组件的大小不 展开 或 收缩 以适应子窗口的大小,当我单击子窗口中的最大化或最小化按钮。
所以我必须单击随机按钮或组合框才能使 vaadin 日历组件完全适合子窗口。
以下图片显示了我的问题:
- 第一次打开时的子窗口(OK)。
- 当我点击最大化按钮时(不正常)。
打开子窗口的代码:
Window abonWindow = new Window("Abonma");
abonWindow.setImmediate(true);
abonWindow.setHeight("450px");
abonWindow.setWidth("700px");
abonWindow.setModal(true);
abonWindow.setContent(new AddAbonma(abonWindow));
UI.getCurrent().addWindow(abonWindow);
我使用以下代码在 subwindow 中添加所有组件:
mainLayout = new AbsoluteLayout();
mainLayout.setImmediate(true);
mainLayout.setWidth("100%");
mainLayout.setHeight("100%");
setWidth("100.0%");
setHeight("100.0%");
initCalendar();
initLayoutContent();
initSettingPopupview();
panel_criteria = buildPanel_criteria();
mainLayout.addComponent(panel_criteria, "right:0.0px;top:0.0px;left:0.0px;");
mainLayout.addComponent(calendarComponent, "right:0.0px;top:70.5px;bottom:0px;left:0.0px;");
initCalendar
代码:
calendarComponent.setLocale(new Locale("sl","SL"));
calendarComponent.setImmediate(true);
calendarComponent.setHeight("100%");
calendarComponent.setWidth("100%");
这是我在 SubWindow 的构造函数中的所有代码,我还在其中放了 addWindowModeChangeListener
:
buildMainLayout();
setCompositionRoot(mainLayout);
initGui(window);
window.addWindowModeChangeListener(new WindowModeChangeListener() {
@Override
public void windowModeChanged(WindowModeChangeEvent event) {
System.out.println("AddAbonma WindowMode");
if(calendarComponent!=null){
calendarComponent.markAsDirtyRecursive();
}
}
});
此方法适用于表格,但不适用于 vaadin 日历组件。
那么,当用户单击最大化或最小化按钮时,我该如何扩展或收缩 vaadin 日历组件以适应 子窗口?
您可以使用 JavaScript 强制 Vaadin 重新计算布局。这不是必需的,您描述的行为看起来像是 Vaadin 中的错误。
你可以尝试这样的事情。这使用 150 毫秒的任意超时,因为在 Vaadin LayoutManager 工作时无法请求布局重新计算,我们希望在 Vaadin 处理 window 调整大小(并且无法计算布局)后强制布局。
Window window = new Window();
Calendar calendar = new Calendar("Calendar");
calendar.setWidth("100%");
window.setWidth("700px");
window.setHeight("450px");
window.setContent(calendar);
window.addWindowModeChangeListener(event -> Page
.getCurrent()
.getJavaScript()
.execute("setTimeout(function() { vaadin.forceLayout(); }, 150);"));
Button button = new Button("Click me", event -> UI.getCurrent().addWindow(window));
setContent(button);
子窗口中 Calendar
组件的大小不 展开 或 收缩 以适应子窗口的大小,当我单击子窗口中的最大化或最小化按钮。
所以我必须单击随机按钮或组合框才能使 vaadin 日历组件完全适合子窗口。
以下图片显示了我的问题:
- 第一次打开时的子窗口(OK)。
- 当我点击最大化按钮时(不正常)。
打开子窗口的代码:
Window abonWindow = new Window("Abonma");
abonWindow.setImmediate(true);
abonWindow.setHeight("450px");
abonWindow.setWidth("700px");
abonWindow.setModal(true);
abonWindow.setContent(new AddAbonma(abonWindow));
UI.getCurrent().addWindow(abonWindow);
我使用以下代码在 subwindow 中添加所有组件:
mainLayout = new AbsoluteLayout();
mainLayout.setImmediate(true);
mainLayout.setWidth("100%");
mainLayout.setHeight("100%");
setWidth("100.0%");
setHeight("100.0%");
initCalendar();
initLayoutContent();
initSettingPopupview();
panel_criteria = buildPanel_criteria();
mainLayout.addComponent(panel_criteria, "right:0.0px;top:0.0px;left:0.0px;");
mainLayout.addComponent(calendarComponent, "right:0.0px;top:70.5px;bottom:0px;left:0.0px;");
initCalendar
代码:
calendarComponent.setLocale(new Locale("sl","SL"));
calendarComponent.setImmediate(true);
calendarComponent.setHeight("100%");
calendarComponent.setWidth("100%");
这是我在 SubWindow 的构造函数中的所有代码,我还在其中放了 addWindowModeChangeListener
:
buildMainLayout();
setCompositionRoot(mainLayout);
initGui(window);
window.addWindowModeChangeListener(new WindowModeChangeListener() {
@Override
public void windowModeChanged(WindowModeChangeEvent event) {
System.out.println("AddAbonma WindowMode");
if(calendarComponent!=null){
calendarComponent.markAsDirtyRecursive();
}
}
});
此方法适用于表格,但不适用于 vaadin 日历组件。
那么,当用户单击最大化或最小化按钮时,我该如何扩展或收缩 vaadin 日历组件以适应 子窗口?
您可以使用 JavaScript 强制 Vaadin 重新计算布局。这不是必需的,您描述的行为看起来像是 Vaadin 中的错误。
你可以尝试这样的事情。这使用 150 毫秒的任意超时,因为在 Vaadin LayoutManager 工作时无法请求布局重新计算,我们希望在 Vaadin 处理 window 调整大小(并且无法计算布局)后强制布局。
Window window = new Window();
Calendar calendar = new Calendar("Calendar");
calendar.setWidth("100%");
window.setWidth("700px");
window.setHeight("450px");
window.setContent(calendar);
window.addWindowModeChangeListener(event -> Page
.getCurrent()
.getJavaScript()
.execute("setTimeout(function() { vaadin.forceLayout(); }, 150);"));
Button button = new Button("Click me", event -> UI.getCurrent().addWindow(window));
setContent(button);