Java 在子视图中隐藏UI组件

Java 在子视图中隐藏UI组件,java,vaadin,vaadin7,Java,Vaadin,Vaadin7,我试图找到在特定子视图中隐藏UI组件,但让它在其他子视图中可见的最佳方法 这是我的UI类的代码: public class DCSAdminUI extends UI { private static final long serialVersionUID = 1L; VerticalLayout root = new VerticalLayout(); CssLayout content = new CssLayout(); private MenuBar

我试图找到在特定子视图中隐藏UI组件,但让它在其他子视图中可见的最佳方法

这是我的UI类的代码:

public class DCSAdminUI extends UI {

    private static final long serialVersionUID = 1L;

    VerticalLayout root = new VerticalLayout();
    CssLayout content = new CssLayout();
    private MenuBar nav = new MenuBar();
    private MenuBar userNav = new MenuBar();
    private Navigator navigator;

    public static final String PERSISTENCE_UNIT = "mystery";

    public static DCSAdminUI getCurrent() {
        return (DCSAdminUI) UI.getCurrent();
    }

    public static DCSAdminUI getApplication() {
        return (DCSAdminUI) getApplication();
    }

    @Override
    protected void init(VaadinRequest request) {

        Page.getCurrent().setTitle("Admin");

        initLayout();
        initNav();
        initUserNav();
        getUserOrg();

        navigator = new Navigator(this, content);

        LoginUI loginView = new LoginUI();
        navigator.addView("", loginView);
        navigator.addView(ActivitiesUI.VIEW_NAME.toLowerCase(), new ActivitiesUI());
        navigator.addView(BookingsUI.VIEW_NAME.toLowerCase(), new BookingsUI());
        navigator.addView(OperatorsUI.VIEW_NAME.toLowerCase(), new OperatorsUI());
        navigator.addView(TeamUI.VIEW_NAME.toLowerCase(), new TeamUI());
        navigator.addView(OrganisationsUI.VIEW_NAME.toLowerCase(), new OrganisationsUI());
        navigator.addView(PlayersUI.VIEW_NAME.toLowerCase(), new PlayersUI());


        navigator.addViewChangeListener(new ViewChangeListener() {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean beforeViewChange(ViewChangeEvent event) {
                return true;
            }

            @Override
            public void afterViewChange(ViewChangeEvent event) {
                if (event.getViewName() == null || event.getViewName().equals("")) {
                    updateNavSelection("activities");
                } else {
                    updateNavSelection(event.getViewName());
                }
            }
        }); 

    }

    private void initLayout() {
        root.setSizeFull();
        setContent(root);

        HorizontalLayout topbar = new HorizontalLayout();
        topbar.addStyleName("topbar");
        topbar.setWidth("100%");
        topbar.setSpacing(true);
        root.addComponent(topbar);

        content.setSizeFull();
        root.addComponent(content);
        root.setExpandRatio(content, 1);

        nav.addStyleName("nav");
        topbar.addComponent(nav);

        userNav.addStyleName("user-nav");
        topbar.addComponent(userNav);
        topbar.setComponentAlignment(userNav, Alignment.TOP_CENTER);
    }

    private void initNav() {
        nav.addItem(ActivitiesUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(BookingsUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(PlayersUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(TeamUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(OperatorsUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
        nav.addItem(OrganisationsUI.VIEW_NAME.toUpperCase(Locale.GERMANY), navCommand).setCheckable(true);
    }

    private void initUserNav() {
        MenuItem username = userNav.addItem("DCS User", FontAwesome.CHEVRON_DOWN, null);
        username.addItem("Edit Profile", null);
        username.addItem("Settings", null);
        username.addSeparator();
        username.addItem("Logout", null);
    }

    private Command navCommand = new Command() {

        private static final long serialVersionUID = 1L;

        @Override
        public void menuSelected(MenuItem selectedItem) {
            updateNavSelection(selectedItem.getText());
            navigator.navigateTo(selectedItem.getText().toLowerCase());
        }
    };

    private void updateNavSelection(String selectedItem) {
        for (MenuItem item : nav.getItems()) {
            item.setChecked(item.getText().toLowerCase()
                    .equals(selectedItem.toLowerCase()));
        }
    }

    void navigateTo(String menuItem) {
        for (MenuItem item : nav.getItems()) {
            if (item.getText().toLowerCase().equals(menuItem.toLowerCase())) {
                navCommand.menuSelected(item);
                return;
            }
        }
    }

}

这里讨论的UI组件是
initLayout()
方法中的
topbar
,这是应用程序的主
MenuBar()
,但我希望它只对经过身份验证的用户显示,这意味着它应该隐藏在
LoginUI()
中(目前的默认视图类)。我的搜索努力让我明白,我可以使用多个UI类,但这最终会变得单调乏味,这就是为什么我希望找到一种在特定视图类中隐藏
topbar
组件的方法。您可以在UI中实现一个
在视图更改之前
。由于这也会拒绝输入
视图
,因此您也可以向登录名发送其他用户。

谢谢@cfrick。你能给我举个例子说明怎么做吗?我试图在
viewchangelister
中隐藏一些组件,但它会在所有视图中隐藏它们,而不仅仅是在导航到的视图中。如果我有两个独立的UI会更好吗?一个用于登录视图,另一个用于身份验证用户?如果一个组件在所有视图之间共享,那么这将在每个视图中隐藏它。组件只能有一个父级,因此如果菜单是中心布局的一部分,并且导航器操纵中心布局的另一部分,则在进入非登录视图时必须再次启用菜单。另一种方法是为您的导航器使用更好的
ViewDisplay
(用于确定要渲染的视图是否为“全屏”)