2015-11-10 1 views
0

Я пытаюсь найти лучший способ скрыть компонент пользовательского интерфейса в определенном подвью, но пусть он будет видимым в других.Скрыть компонент пользовательского интерфейса в подзадаче

Это код моего класса 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; 
      } 
     } 
    } 

} 

компонент пользовательского интерфейса в вопросе здесь в initLayout() методе, который является приложение ГЛАВНОГО MenuBar()topbar, но я хочу, чтобы это появляется только для авторизованных пользователей, а это означает что он должен быть скрыт в LoginUI() (по умолчанию класс View по умолчанию). Мои усилия по поиску привели меня к пониманию того, что я могу использовать несколько классов пользовательского интерфейса, но это в конечном итоге станет утомительным для поддержания, и именно поэтому я бы идеально хотел найти способ скрытия компонента topbar в конкретных классах просмотра.

ответ

0

0 может реализовать ViewChangeListener в вашем пользовательском интерфейсе и иметь дело с вашей навигационной панелью в beforeViewChange. Так как это может также отклонить ввод View, вы также можете отправить анонимных пользователей на вход.

+0

Спасибо @cfrick. Не могли бы вы указать мне пример того, как это сделать? Я попытался скрыть некоторые компоненты в 'ViewChangeListener', но он скрывает их от всех представлений, а не только от того, к которому осуществляется переход. Было бы лучше, если бы у меня было 2 отдельных интерфейса? Один для входа в систему, а другой для аутентифицированных пользователей? – Mimzo

+0

Если компонент разделяется между всеми представлениями, то это скроет его во всех представлениях. компонент может иметь только один родитель, поэтому, если ваше меню является частью центральной компоновки, и навигатор манипулирует другой частью центральной компоновки, тогда вам нужно снова включить меню при вводе имени без входа. Другой подход - использовать лучше 'ViewDisplay' для вашего навигатора (тот, который определяет, если View to render является« полноэкранным »или нет) – cfrick

 Смежные вопросы

  • Нет связанных вопросов^_^