Vaadin:使用 Tab 组件在视图之间进行适当的导航
Vaadin: Propper navigation between views with Tab component
我已经使用 Vaadin 创建了一个导航菜单栏,我想知道如何将视图或 link 附加到每个选项卡,以便单击它可以将我重定向到相应的视图。我设法找到了解决方法,但我认为这种方法有缺陷:
Tabs tabs = new Tabs(new Tab("Login"), new Tab("Register"));
tabs.setOrientation(Tabs.Orientation.VERTICAL);
tabs.addSelectedChangeListener(event -> {
if (event.getSelectedTab().getLabel().equalsIgnoreCase("Login")) {
UI.getCurrent().navigate(LoginView.class);
} else if (event.getSelectedTab().getLabel().equalsIgnoreCase("Register")) {
UI.getCurrent().navigate(RegisterView.class);
}
});
我没有在 Tab 组件上找到单独的 clickListener 事件,这对我来说很奇怪。还注意到我可以使用 tabName.getUI() 方法将 UI 附加到选项卡,但是我找不到附加它的方法。
帮我找到正确的标签导航方式!提前致谢!
在 Vaadin 14 中,您可以将组件添加到选项卡。因此,除了 new Tab("Login")
之外,您还可以执行以下操作:
private Tab createMenuItem(String title, VaadinIcon icon, Class<? extends Component> target) {
RouterLink link = new RouterLink(null,target);
if (icon != null) link.add(icon.create());
link.add(title);
Tab tab = new Tab();
tab.add(link);
return tab;
}
当然RouterLink不是唯一的选择,如果你喜欢你也可以使用Button并使用按钮的点击监听器来调用导航等。这里有很多选择。
如果您只想 show/hide 不同的标签页而不需要实际导航,您可以在 tabs with pages example 中查看它是如何完成的。
如果您想导航(您的设置似乎就是这种情况),那么 addSelectedChangeListener
是正确的方法 - 如果您不想使用 RouterLink
或 Button
正如塔图斯的回答所暗示的那样。就个人而言,我认为 Tab 组件中的 RouterLinks 和 Buttons 看起来不太好,因此更喜欢这种方式。
为了避免必须比较该侦听器中的硬编码字符串,您可以使用类似于上面 link 中的做法的 Map<Tab, Class>
,然后导航到为以下内容定义的 class那个标签。
Tab loginTab = new Tab("Login");
Tab registerTab = new Tab("Register");
Map<Tab, Class> tabsMap = new HashMap<>();
tabsMap.put(loginTab, LoginView.class);
tabsMap.put(registerTab, RegisterView.class);
Tabs tabs = new Tabs(loginTab, registerTab);
tabs.setOrientation(Orientation.VERTICAL);
tabs.addSelectedChangeListener(event -> {
UI.getCurrent().navigate(tabsMap.get(event.getSelectedTab()));
});
编辑: 现在测试后,我必须说在 Tab 组件中使用 RouterLink
看起来一点也不差(我在想 Buttons,它看起来很糟糕)。因此,如果您使用导航然后使用 Tatu 的答案,如果您想在没有导航的情况下执行 showing/hiding 组件,请制作 Map<Tab, Component>
并显示映射到所选选项卡的组件(同时隐藏所有其他映射的组件到其他标签)
paged-tabs add-on
看起来像 Alejandro Duarte has made a Vaadin 14 add-on, named paged-tabs, for us to plug into our Vaadin projects. I imagine this is a wrapper around the kind of code shown in the correct Answer by Kaspar Scherrer。
这 add-on 简化了制表符的处理。您只需传递组件(小部件、布局)和标题。
PagedTabs tabs = new PagedTabs() ;
tabs.add( component , "Tab caption 1" ) ;
tabs.add( component2 , "Tab caption 2" ) ;
或者,您可以传递 Tab
object。
Tab tab = new Tab();
tab.add( new Span( "Tab caption" ) , new Button( "Click me" ) ) ;
PagedTabs tabs = new PagedTabs() ;
tabs.add( new Span( "Tab content" ) , tab ) ;
该库还提供“可关闭”功能,显示 X
供用户单击以删除该选项卡。
我已经使用 Vaadin 创建了一个导航菜单栏,我想知道如何将视图或 link 附加到每个选项卡,以便单击它可以将我重定向到相应的视图。我设法找到了解决方法,但我认为这种方法有缺陷:
Tabs tabs = new Tabs(new Tab("Login"), new Tab("Register"));
tabs.setOrientation(Tabs.Orientation.VERTICAL);
tabs.addSelectedChangeListener(event -> {
if (event.getSelectedTab().getLabel().equalsIgnoreCase("Login")) {
UI.getCurrent().navigate(LoginView.class);
} else if (event.getSelectedTab().getLabel().equalsIgnoreCase("Register")) {
UI.getCurrent().navigate(RegisterView.class);
}
});
我没有在 Tab 组件上找到单独的 clickListener 事件,这对我来说很奇怪。还注意到我可以使用 tabName.getUI() 方法将 UI 附加到选项卡,但是我找不到附加它的方法。
帮我找到正确的标签导航方式!提前致谢!
在 Vaadin 14 中,您可以将组件添加到选项卡。因此,除了 new Tab("Login")
之外,您还可以执行以下操作:
private Tab createMenuItem(String title, VaadinIcon icon, Class<? extends Component> target) {
RouterLink link = new RouterLink(null,target);
if (icon != null) link.add(icon.create());
link.add(title);
Tab tab = new Tab();
tab.add(link);
return tab;
}
当然RouterLink不是唯一的选择,如果你喜欢你也可以使用Button并使用按钮的点击监听器来调用导航等。这里有很多选择。
如果您只想 show/hide 不同的标签页而不需要实际导航,您可以在 tabs with pages example 中查看它是如何完成的。
如果您想导航(您的设置似乎就是这种情况),那么 addSelectedChangeListener
是正确的方法 - 如果您不想使用 RouterLink
或 Button
正如塔图斯的回答所暗示的那样。就个人而言,我认为 Tab 组件中的 RouterLinks 和 Buttons 看起来不太好,因此更喜欢这种方式。
为了避免必须比较该侦听器中的硬编码字符串,您可以使用类似于上面 link 中的做法的 Map<Tab, Class>
,然后导航到为以下内容定义的 class那个标签。
Tab loginTab = new Tab("Login");
Tab registerTab = new Tab("Register");
Map<Tab, Class> tabsMap = new HashMap<>();
tabsMap.put(loginTab, LoginView.class);
tabsMap.put(registerTab, RegisterView.class);
Tabs tabs = new Tabs(loginTab, registerTab);
tabs.setOrientation(Orientation.VERTICAL);
tabs.addSelectedChangeListener(event -> {
UI.getCurrent().navigate(tabsMap.get(event.getSelectedTab()));
});
编辑: 现在测试后,我必须说在 Tab 组件中使用 RouterLink
看起来一点也不差(我在想 Buttons,它看起来很糟糕)。因此,如果您使用导航然后使用 Tatu 的答案,如果您想在没有导航的情况下执行 showing/hiding 组件,请制作 Map<Tab, Component>
并显示映射到所选选项卡的组件(同时隐藏所有其他映射的组件到其他标签)
paged-tabs add-on
看起来像 Alejandro Duarte has made a Vaadin 14 add-on, named paged-tabs, for us to plug into our Vaadin projects. I imagine this is a wrapper around the kind of code shown in the correct Answer by Kaspar Scherrer。
这 add-on 简化了制表符的处理。您只需传递组件(小部件、布局)和标题。
PagedTabs tabs = new PagedTabs() ;
tabs.add( component , "Tab caption 1" ) ;
tabs.add( component2 , "Tab caption 2" ) ;
或者,您可以传递 Tab
object。
Tab tab = new Tab();
tab.add( new Span( "Tab caption" ) , new Button( "Click me" ) ) ;
PagedTabs tabs = new PagedTabs() ;
tabs.add( new Span( "Tab content" ) , tab ) ;
该库还提供“可关闭”功能,显示 X
供用户单击以删除该选项卡。