Vaadin 12 中的选项卡和网格
Tabs&Grid in Vaadin 12
我选择 Vaadin 在 spring 引导应用程序中构建我非常简单的 UI。
我有:
@Route
@PWA(name = "Signing certificates manager", shortName = "CertMgr")
public class MainView extends VerticalLayout {
public MainView() {
Tab tab1 = new Tab("Certificates");
Tab tab2 = new Tab("Users");
Tabs tabs = new Tabs(tab1, tab2);
CertView certView = new CertView();
certView.setVisible(false);
UserView userView = new UserView(addUsers());
userView.setVisible(true);
Map<Tab, Component> tabsToPages = new HashMap<>();
tabsToPages.put(tab1, certView);
tabsToPages.put(tab2, userView);
Div pages = new Div(certView, userView);
Set<Component> pagesShown = Stream.of(userView)
.collect(Collectors.toSet());
tabs.addSelectedChangeListener(event -> {
pagesShown.forEach(page -> page.setVisible(false));
pagesShown.clear();
Component selectedPage = tabsToPages.get(tabs.getSelectedTab());
selectedPage.setVisible(true);
pagesShown.add(selectedPage);
});
add(tabs, pages);
}
private List<User> addUsers() {
return new LinkedList<User>() {{
add(new User("qewr", "asdf", "xzcv"));
}};
}
}
和
public class UserView extends VerticalLayout {
Grid<User> grid;
public UserView(List<User> users) {
grid = new Grid<>(User.class);
grid.setItems(users);
grid.addColumn(User::getMail).setHeader("mail");
grid.addColumn(User::getName).setHeader("name");
grid.addColumn(User::getPass).setHeader("pass");
grid.addSelectionListener(event -> {
List<User> selected = (List<User>) event.getAllSelectedItems();
add(new UserRow(selected.get(0)));
});
add(grid);
}
}
结果是这样的视图:
所以你可以看到,网格没有宽度而且太长(我那里只有一个用户)
我是 Vaadin 的新手,所以我肯定做错了什么,但基本上这是 vaadin tabs 样本处理。
我的问题是:
如何使用当前设置正确绘制网格?
当单击带有该页面的选项卡时,是否可以显示来自完全不同页面的视图将具有它自己的上下文并且可以使用 spring 的 DI?喜欢拥有自主页面而不是像我现在这样的耦合对象。或者请建议使用 vaadin 处理此问题的最佳模式。
Vaadin: 12.0.7
Spring-Boot: 2.1.2.RELEASE
希望你明白我的意思。
感谢指教!
就这样
Div pages = new Div(certView, userView);
pages.setSizeFull();
我选择 Vaadin 在 spring 引导应用程序中构建我非常简单的 UI。
我有:
@Route
@PWA(name = "Signing certificates manager", shortName = "CertMgr")
public class MainView extends VerticalLayout {
public MainView() {
Tab tab1 = new Tab("Certificates");
Tab tab2 = new Tab("Users");
Tabs tabs = new Tabs(tab1, tab2);
CertView certView = new CertView();
certView.setVisible(false);
UserView userView = new UserView(addUsers());
userView.setVisible(true);
Map<Tab, Component> tabsToPages = new HashMap<>();
tabsToPages.put(tab1, certView);
tabsToPages.put(tab2, userView);
Div pages = new Div(certView, userView);
Set<Component> pagesShown = Stream.of(userView)
.collect(Collectors.toSet());
tabs.addSelectedChangeListener(event -> {
pagesShown.forEach(page -> page.setVisible(false));
pagesShown.clear();
Component selectedPage = tabsToPages.get(tabs.getSelectedTab());
selectedPage.setVisible(true);
pagesShown.add(selectedPage);
});
add(tabs, pages);
}
private List<User> addUsers() {
return new LinkedList<User>() {{
add(new User("qewr", "asdf", "xzcv"));
}};
}
}
和
public class UserView extends VerticalLayout {
Grid<User> grid;
public UserView(List<User> users) {
grid = new Grid<>(User.class);
grid.setItems(users);
grid.addColumn(User::getMail).setHeader("mail");
grid.addColumn(User::getName).setHeader("name");
grid.addColumn(User::getPass).setHeader("pass");
grid.addSelectionListener(event -> {
List<User> selected = (List<User>) event.getAllSelectedItems();
add(new UserRow(selected.get(0)));
});
add(grid);
}
}
结果是这样的视图:
所以你可以看到,网格没有宽度而且太长(我那里只有一个用户)
我是 Vaadin 的新手,所以我肯定做错了什么,但基本上这是 vaadin tabs 样本处理。
我的问题是: 如何使用当前设置正确绘制网格? 当单击带有该页面的选项卡时,是否可以显示来自完全不同页面的视图将具有它自己的上下文并且可以使用 spring 的 DI?喜欢拥有自主页面而不是像我现在这样的耦合对象。或者请建议使用 vaadin 处理此问题的最佳模式。
Vaadin: 12.0.7
Spring-Boot: 2.1.2.RELEASE
希望你明白我的意思。
感谢指教!
就这样
Div pages = new Div(certView, userView);
pages.setSizeFull();