UI 大小和滚动条的 Vaadin 问题
Vaadin problems with UI size and scrollbar
我真的是 vaadin 的新手,我已经为这个问题苦苦挣扎了 2 天,我很绝望。
我修改了原始的 addressbook 示例,在我不得不用另一个控件扩展 ContactForm 之前,它是完美的。
更容易展示我想要实现的目标。
如果我可以向右滚动就好了,但我不能。我展示了我已经拥有的东西,也许你们中的一些人会注意到我的错。我不会 post 所有代码,只需要必要的部分。
这是我创建主布局的地方。
public class VaadinKoliUI extends UI {
@Override
protected void init(VaadinRequest request) {
TabSheet tabsheet = new TabSheet();
HorizontalLayout residentalsTab = new ResidentalsUI();
residentalsTab.setSizeFull();
tabsheet.addTab(residentalsTab,"Lakók");
tabsheet.setSizeFull();
setContent(tabsheet);
}
}
public class ResidentalsUI extends HorizontalLayout implements View{
private Grid residentalsList = new Grid();
ResidentalFormTest residentalForm = new ResidentalFormTest(this);
public ResidentalsUI(){
buildLayout();
}
private void buildLayout(){
HorizontalLayout actions = new HorizontalLayout(filter,excelDownload, newResidental);
actions.setWidth("100%");
filter.setWidth("100%");
actions.setExpandRatio(filter, 1);
VerticalLayout left = new VerticalLayout(actions, getResidentalsList());
left.setSizeFull();
getResidentalsList().setSizeFull();
left.setExpandRatio(getResidentalsList(), 1);
HorizontalLayout mainLayout = new HorizontalLayout(left, residentalForm);
mainLayout.setSizeFull();
mainLayout.setExpandRatio(left, 1);
this.setSizeFull();
this.addComponent(mainLayout);
}
}
public class ResidentalFormTest extends Panel{
FormLayout content = new FormLayout();
Button save = new Button("Save", this::save);
//more buttons and controlls
public ResidentalFormTest(ResidentalsUI rUI) {
this.rUI = rUI;
buildLayout();
}
private void buildLayout() {
this.setSizeUndefined();
content.setMargin(true);
HorizontalLayout actions = new HorizontalLayout(save, cancel);
actions.setSpacing(true);
content.addComponents(actions, name, sex, address, email, phoneNumber, major,classYear,neptunCode,
roomNumber, rfidCode,comment,equipment,equipment1,equipment2);
actions.setSizeUndefined();
this.setContent(content);
}
}
据我所知,我必须使用面板,因为 FormLayout 无法显示滚动条。我应该使用 .setSizeFull() 将我的根设置为完整,并使用 .setSizeUndefined() 将子项设置为未定义,这样它将是浏览器的大小 window,如果更大,它将显示一个滚动条。
如果我修改 VaadinKoliUI class 如下所示,我有滚动条,但 ui 缩小了。
public class VaadinKoliUI extends UI {
@Override
protected void init(VaadinRequest request) {
TabSheet tabsheet = new TabSheet();
HorizontalLayout residentalsTab = new ResidentalsUI();
residentalsTab.setSizeUndefined();
tabsheet.addTab(residentalsTab,"Lakók");
tabsheet.setSizeFull();
setContent(tabsheet);
}
}
像这样:
现在我不知道该怎么办了。
但是如果有人有更简单和更好的想法ui让 ContactForm 可以滚动请告诉我。
提前致谢
巴拉斯
我觉得你应该
VaadinKoliUI.setSizeFull
ResidentalsUI.setSizeFull
ResidentalsUI.residentalsList.setSizeFull
ResidentalFormTest.setSizeFull
ResidentalFormTest.content.setSizeUndefined
ResidentalsUI.left.setSizeFull
我还建议删除 ResidentalsUI
中的 HorizontalLayout mainLayout
,因为它本身就是水平布局(如果可能的话,重命名它,因为它不是 UI 并删除implements View
因为它似乎不是视图)。
您的展开比率看起来不错,这是 类 我要写的:
public class VaadinKoliUI extends UI {
@Override
protected void init(VaadinRequest request) {
TabSheet tabsheet = new TabSheet();
ResidentalsLayout residentalsTab = new ResidentalsLayout();
residentalsTab.setSizeFull();
tabsheet.addTab(residentalsTab,"Lakók");
tabsheet.setSizeFull();
setContent(tabsheet);
}
public class ResidentalsLayout extends HorizontalLayout {
private Grid residentalsList = new Grid();
ResidentalFormTest residentalForm = new ResidentalFormTest(this);
public ResidentalsLayout(){
buildLayout();
}
private void buildLayout(){
HorizontalLayout actions = new HorizontalLayout(filter,excelDownload, newResidental);
actions.setWidth("100%");
filter.setWidth("100%");
actions.setExpandRatio(filter, 1);
VerticalLayout left = new VerticalLayout(actions, getResidentalsList());
left.setSizeFull();
residentalsList.setSizeFull();
left.setExpandRatio(residentalsList , 1);
addComponents(left, residentalForm);
setExpandRatio(left, 1);
setSizeFull();
}
}
public class ResidentalFormTest extends Panel {
FormLayout content = new FormLayout();
Button save = new Button("Save", this::save);
//more buttons and controlls
public ResidentalFormTest(ResidentalsLayout rUI) {
this.rUI = rUI;
buildLayout();
}
private void buildLayout() {
setSizeFull();
content.setMargin(true);
HorizontalLayout actions = new HorizontalLayout(save, cancel);
actions.setSpacing(true);
content.addComponents(actions, name, sex, address, email, phoneNumber, major,classYear,neptunCode, roomNumber, rfidCode, comment, equipment, equipment1, equipment2);
content.setSizeUndefined();
setContent(content);
}
}
让我知道它是否按预期工作。
I should set my root to full with .setSizeFull() and the childs to undefined...
在您的情况下,您应该将 root 视为您的 Panel
,将 FormLayout
视为 child。根据 Vaadin book:
Normally, if a panel has undefined size in a direction, as it has by
default vertically, it will fit the size of the content and grow as
the content grows. However, if it has a fixed or percentual size and
its content becomes too big to fit in the content area, a scroll bar
will appear for the particular direction
下图是 天真的 视觉表示尝试:
这就是说,从您修改 ResidentalFormTest
以扩展 Panel
并将 FormLayout
设置为内容的那一刻起,为了使您的面板具有滚动条:
- 在
ResidentalFormTest.buildLayout()
中将面板大小设置为 100%:
this.setSizeFull()
- 将内容大小设置为未定义,这样它就可以 "expand" 超出面板大小:在
ResidentalFormTest.buildLayout()
中:content.setSizeUndefined()
为了修复网格和面板之间的 space 分配,我认为 3:1 比例应该足够了。在 ResidentalsUI.buildLayout()
:
- mainLayout.setExpandRatio(左, 3);
- mainLayout.setExpandRatio(residentalForm, 1);
注意: 有时检查(或尝试更改)渲染元素的属性、样式等可能会派上用场。某些浏览器(chrome, firefox ) built-in 支持此类开发人员工具,可通过菜单或键盘组合访问,例如 CTRL+SHIFT+我
我真的是 vaadin 的新手,我已经为这个问题苦苦挣扎了 2 天,我很绝望。
我修改了原始的 addressbook 示例,在我不得不用另一个控件扩展 ContactForm 之前,它是完美的。
更容易展示我想要实现的目标。
这是我创建主布局的地方。
public class VaadinKoliUI extends UI {
@Override
protected void init(VaadinRequest request) {
TabSheet tabsheet = new TabSheet();
HorizontalLayout residentalsTab = new ResidentalsUI();
residentalsTab.setSizeFull();
tabsheet.addTab(residentalsTab,"Lakók");
tabsheet.setSizeFull();
setContent(tabsheet);
}
}
public class ResidentalsUI extends HorizontalLayout implements View{
private Grid residentalsList = new Grid();
ResidentalFormTest residentalForm = new ResidentalFormTest(this);
public ResidentalsUI(){
buildLayout();
}
private void buildLayout(){
HorizontalLayout actions = new HorizontalLayout(filter,excelDownload, newResidental);
actions.setWidth("100%");
filter.setWidth("100%");
actions.setExpandRatio(filter, 1);
VerticalLayout left = new VerticalLayout(actions, getResidentalsList());
left.setSizeFull();
getResidentalsList().setSizeFull();
left.setExpandRatio(getResidentalsList(), 1);
HorizontalLayout mainLayout = new HorizontalLayout(left, residentalForm);
mainLayout.setSizeFull();
mainLayout.setExpandRatio(left, 1);
this.setSizeFull();
this.addComponent(mainLayout);
}
}
public class ResidentalFormTest extends Panel{
FormLayout content = new FormLayout();
Button save = new Button("Save", this::save);
//more buttons and controlls
public ResidentalFormTest(ResidentalsUI rUI) {
this.rUI = rUI;
buildLayout();
}
private void buildLayout() {
this.setSizeUndefined();
content.setMargin(true);
HorizontalLayout actions = new HorizontalLayout(save, cancel);
actions.setSpacing(true);
content.addComponents(actions, name, sex, address, email, phoneNumber, major,classYear,neptunCode,
roomNumber, rfidCode,comment,equipment,equipment1,equipment2);
actions.setSizeUndefined();
this.setContent(content);
}
}
据我所知,我必须使用面板,因为 FormLayout 无法显示滚动条。我应该使用 .setSizeFull() 将我的根设置为完整,并使用 .setSizeUndefined() 将子项设置为未定义,这样它将是浏览器的大小 window,如果更大,它将显示一个滚动条。 如果我修改 VaadinKoliUI class 如下所示,我有滚动条,但 ui 缩小了。
public class VaadinKoliUI extends UI {
@Override
protected void init(VaadinRequest request) {
TabSheet tabsheet = new TabSheet();
HorizontalLayout residentalsTab = new ResidentalsUI();
residentalsTab.setSizeUndefined();
tabsheet.addTab(residentalsTab,"Lakók");
tabsheet.setSizeFull();
setContent(tabsheet);
}
}
像这样:
现在我不知道该怎么办了。
但是如果有人有更简单和更好的想法ui让 ContactForm 可以滚动请告诉我。
提前致谢 巴拉斯
我觉得你应该
VaadinKoliUI.setSizeFull
ResidentalsUI.setSizeFull
ResidentalsUI.residentalsList.setSizeFull
ResidentalFormTest.setSizeFull
ResidentalFormTest.content.setSizeUndefined
ResidentalsUI.left.setSizeFull
我还建议删除 ResidentalsUI
中的 HorizontalLayout mainLayout
,因为它本身就是水平布局(如果可能的话,重命名它,因为它不是 UI 并删除implements View
因为它似乎不是视图)。
您的展开比率看起来不错,这是 类 我要写的:
public class VaadinKoliUI extends UI {
@Override
protected void init(VaadinRequest request) {
TabSheet tabsheet = new TabSheet();
ResidentalsLayout residentalsTab = new ResidentalsLayout();
residentalsTab.setSizeFull();
tabsheet.addTab(residentalsTab,"Lakók");
tabsheet.setSizeFull();
setContent(tabsheet);
}
public class ResidentalsLayout extends HorizontalLayout {
private Grid residentalsList = new Grid();
ResidentalFormTest residentalForm = new ResidentalFormTest(this);
public ResidentalsLayout(){
buildLayout();
}
private void buildLayout(){
HorizontalLayout actions = new HorizontalLayout(filter,excelDownload, newResidental);
actions.setWidth("100%");
filter.setWidth("100%");
actions.setExpandRatio(filter, 1);
VerticalLayout left = new VerticalLayout(actions, getResidentalsList());
left.setSizeFull();
residentalsList.setSizeFull();
left.setExpandRatio(residentalsList , 1);
addComponents(left, residentalForm);
setExpandRatio(left, 1);
setSizeFull();
}
}
public class ResidentalFormTest extends Panel {
FormLayout content = new FormLayout();
Button save = new Button("Save", this::save);
//more buttons and controlls
public ResidentalFormTest(ResidentalsLayout rUI) {
this.rUI = rUI;
buildLayout();
}
private void buildLayout() {
setSizeFull();
content.setMargin(true);
HorizontalLayout actions = new HorizontalLayout(save, cancel);
actions.setSpacing(true);
content.addComponents(actions, name, sex, address, email, phoneNumber, major,classYear,neptunCode, roomNumber, rfidCode, comment, equipment, equipment1, equipment2);
content.setSizeUndefined();
setContent(content);
}
}
让我知道它是否按预期工作。
I should set my root to full with .setSizeFull() and the childs to undefined...
在您的情况下,您应该将 root 视为您的 Panel
,将 FormLayout
视为 child。根据 Vaadin book:
Normally, if a panel has undefined size in a direction, as it has by default vertically, it will fit the size of the content and grow as the content grows. However, if it has a fixed or percentual size and its content becomes too big to fit in the content area, a scroll bar will appear for the particular direction
下图是 天真的 视觉表示尝试:
这就是说,从您修改 ResidentalFormTest
以扩展 Panel
并将 FormLayout
设置为内容的那一刻起,为了使您的面板具有滚动条:
- 在
ResidentalFormTest.buildLayout()
中将面板大小设置为 100%:this.setSizeFull()
- 将内容大小设置为未定义,这样它就可以 "expand" 超出面板大小:在
ResidentalFormTest.buildLayout()
中:content.setSizeUndefined()
为了修复网格和面板之间的 space 分配,我认为 3:1 比例应该足够了。在 ResidentalsUI.buildLayout()
:
- mainLayout.setExpandRatio(左, 3);
- mainLayout.setExpandRatio(residentalForm, 1);
注意: 有时检查(或尝试更改)渲染元素的属性、样式等可能会派上用场。某些浏览器(chrome, firefox ) built-in 支持此类开发人员工具,可通过菜单或键盘组合访问,例如 CTRL+SHIFT+我