Java 在进行导航时动态更改AppLayout中的导航栏内容

Java 在进行导航时动态更改AppLayout中的导航栏内容,java,vaadin,vaadin-flow,vaadin14,Java,Vaadin,Vaadin Flow,Vaadin14,我想在导航到视图时在AppLayout导航栏部分动态添加按钮。我在抽屉中使用RouterLink链接(包装在选项卡中),即在导航事件之前未实例化视图对象。在Vaadin 14+中是否有实现这一目标的标准方法 理想情况下,导航到的视图能够检查其父视图(布局)并访问导航栏以添加/删除其中的组件 以下是AppLayout的外观: MainLayout.java public class MainLayout extends AppLayout implements BeforeEnterObserv

我想在导航到视图时在AppLayout导航栏部分动态添加按钮。我在抽屉中使用RouterLink链接(包装在选项卡中),即在导航事件之前未实例化视图对象。在Vaadin 14+中是否有实现这一目标的标准方法

理想情况下,导航到的视图能够检查其父视图(布局)并访问导航栏以添加/删除其中的组件

以下是AppLayout的外观:

MainLayout.java

public class MainLayout extends AppLayout implements BeforeEnterObserver, TrackerConfigurator {

    private Map<Tab, Component> tabSet = new HashMap<>();
    
    public MainLayout() {
        FlexLayout navBarLayout = new FlexLayout(leftNavBarLayout, navBarContentContainer, rightNavBarLayout);
        navBarLayout.setWidthFull();
        navBarLayout.setJustifyContentMode(FlexComponent.JustifyContentMode.BETWEEN);
        navBarLayout.setAlignItems(FlexComponent.Alignment.CENTER);
        addToNavbar(navBarLayout);
            
        // Tabs
        TabWithIdentifier page0 = tabForPageWithRouter("Dashboard", new IronIcon("icomoon", "icons"), DashboardView.class);
        TabWithIdentifier page1 = tabForPageWithRouter("Users", new IronIcon("icomoon", "users2"), UserView.class);
        ...
            
        final Tabs tabs = new Tabs(page0, page1, ...);
        tabs.setOrientation(Tabs.Orientation.VERTICAL);
            
        addToDrawer(tabs);
    }
    
    private TabWithIdentifier tabForPageWithRouter(String title, IronIcon icon, Class classType)   {
        icon.setSize("1.3em");
        icon.getStyle().set("margin-right", "10px");

        RouterLink routerLink = new RouterLink(null, classType);
        routerLink.add(icon);
        routerLink.add(title);

        TabWithIdentifier tab = new TabWithIdentifier(routerLink);
        tab.setId(title);
        tab.setIdentifier(title);
        tab.addClassName("drawer-tab");

        return tab;
    }
MainLayout.java
公共类MainLayout在Enterobserver、TrackerConfiguration之前扩展了AppLayout实现{
私有映射tabSet=newhashmap();
公共主布局图(){
FlexLayout navBarLayout=新FlexLayout(leftNavBarLayout、navBarContentContainer、rightNavBarLayout);
navBarLayout.setWidthFull();
navBarLayout.setJustifyContentMode(FlexComponent.JustifyContentMode.BETWEEN);
navBarLayout.setAlignItems(FlexComponent.Alignment.CENTER);
addToNavbar(导航栏布局);
//标签
TabWithIdentifier page0=tabForPageWithRouter(“仪表板”、新IronIcon(“图标月亮”、“图标”)、DashboardView.class);
TabWithIdentifier page1=tabForPageWithRouter(“用户”、新Icon(“icomoon”、“users2”)、UserView.class);
...
最终选项卡=新选项卡(第0页,第1页,…);
tabs.setOrientation(tabs.Orientation.VERTICAL);
addToDrawer(选项卡);
}
private TabWithIdentifier tabForPageWithRouter(字符串标题、IronIcon图标、类类型){
图标设置大小(“1.3em”);
icon.getStyle().set(“右边距”、“10px”);
RouterLink RouterLink=新RouterLink(null,类类型);
routerLink.add(图标);
routerLink.add(标题);
TabWithIdentifier tab=新TabWithIdentifier(routerLink);
tab.setId(标题);
tab.setIdentifier(标题);
tab.addClassName(“抽屉选项卡”);
返回选项卡;
}

通过覆盖showRouterLayoutContent(HasElement内容)并创建一个为任何组件提供Div容器的基本视图类,解决了这种情况 我想添加到导航栏

@Override
public void showRouterLayoutContent(HasElement content) {

    super.showRouterLayoutContent(content);

    BaseView baseView = null;

    if (content instanceof BaseView) {
        baseView = (BaseView) content;

        pageTitle = new Label(baseView.getViewTitle());

        controlContainer.removeAll();
        controlContainer.add(baseView.getViewIconTray());
    }

    fireEvent(new RouterNavigated(this));
}