Как реализовать программное меню с помощью panelmenu и defaultmenumodel

Я попытался реализовать программно panelmenu, используя defaultmenumodel и panelmenu с PrimeFaces 4.0. Проблема в том, что когда я реализую простую модель, одно или несколько подменю, содержащих один или несколько пунктов меню, работают нормально. Но когда я реализую подменю, которые содержат элементы меню, и дополнительные подменю, содержащие другие элементы меню, defaultmenumodel не показывает все уровни.

Menu level one
...MenuItem one.one *
...MenuItem one.two *
...SubMenu one.one
......MenuItem one.one.one
......MenuItem one.one.two
...SubMenu one.two
......MenuItem one.two.one
Menu lebel two
... And so on 

MenuItem с * не отображается при отображении страницы. Как реализовать эту модель меню с помощью DefaultMenuModel и ?? Я хочу использовать pojo для сохранения структуры меню в базе данных для управления. Спасибо

(Добавлено/отредактировано) Я запустил следующий предложенный код, но не работал с p:panelMenu. С p:menuBAr хорошо работает, показывая элемент и подменю с элементом внутри.

//create the first menu item It is not SubMenu, It's a simple MenuItem
//This item not shows in <p:panelmenu>
DefaultMenuItem accueil = new DefaultMenuItem();
accueil.setStyleClass("only simple menuItem");
accueil.setUrl("/accueil.jsf");
this.menumodel.addElement(accueil);

//This work properly ans shows in <p:panelMenu>
DefaultSubMenu submenu = new DefaultSubMenu();
submenu.setIcon(null);
submenu.setLabel("submenu 01");
this.menumodel.addElement(submenu);
//Add items to submenu
DefaultMenuItem item = new DefaultMenuItem();
item.setValue("Administrar Usuarios");
item.setUrl("/clientapp/modules/admin/manage_users.xhtml");
submenu.addElement(item);

person user2248409    schedule 01.03.2014    source источник


Ответы (2)


Я создаю свое меню следующим образом:

Бин:

private MenuModel menumodel = new DefaultMenuModel();

//create the first menu item
DefaultMenuItem accueil = new DefaultMenuItem("Accueil");
accueil.setStyleClass("accueil");
accueil.setUrl("/accueil.jsf");
this.menumodel.addElement(accueil);
//Start here i create submenu with personal access for all user
for (Autorisation auto : this.permList) {
    if (auto.getRessource().getSousMenu() != null) {
        if (auto.getRessource().getSousMenu().size() != 0) {
            //Create submenu
            DefaultSubMenu submenu = new DefaultSubMenu();
            submenu.setIcon(null);
            submenu.setLabel(auto.getRessource().getMenu());
            this.menumodel.addElement(submenu);
            for (Ressource r : auto.getRessource().getSousMenu()) {
                //Feed submenu with menu item
                DefaultMenuItem item = new DefaultMenuItem();
                item.setValue(r.getMenu());
                item.setUrl(r.getPath());
                submenu.addElement(item);
            }
        }
    }
}

XHTML:

<p:menubar model="#{SessionUser.menumodel}"/>
person Joffrey Hernandez    schedule 02.03.2014
comment
Думаю, это хорошее решение. Попробую с ‹p:panelMenu /› Вы пробовали с ‹p:panelMenu /›? - person user2248409; 03.03.2014
comment
Я только что запустил код, и он хорошо работает с ‹p:menuBar/›, но не с ‹p:panelMenu/›, первый элемент с именем accueil отображается в строке меню, но не отображается в меню панели. Любое предложение?? Это ошибка в panelMenu? - person user2248409; 03.03.2014
comment
Вы должны создать свой собственный пункт меню и добавить его в модель меню. - person Joffrey Hernandez; 03.03.2014
comment
Я отредактировал вопрос, чтобы добавить код, который не работает. Я создаю один элемент меню и добавляю его в модель меню, затем создаю подменю с одним элементом меню и добавляю его в модель меню, наконец, назначаю модель меню p:panelmenu, но не показываю первый элемент меню. Я новичок в jsf и Primefaces и не имею опыта работы с ним. - person user2248409; 04.03.2014

сам отвечаю.

Чтобы использовать модель меню, вам нужно подменю, которое обертывает (или содержит) все пункты меню или подменю с их собственными пунктами меню.

  1. Создайте Menumodel.
  2. Создать подменю mySubmenu.
  3. Создайте один или несколько Menuitems, а затем добавьте их в mySubmenu.
  4. Создайте один или несколько объектов Submenu (которые могут содержать сам Menuitems) и добавьте к mySubMenu.
  5. наконец, добавьте mySubmenu, который содержит все элементы MenuItem и Submenu, к Menumodel, созданному изначально.

Спасибо, Ламк, вы помогли мне активировать мою главную страницу. (И извините за мой английский ::)

person user2248409    schedule 03.03.2014
comment
Подумайте о том, чтобы отредактировать свой ответ для публикации примера кода и подтвердить его, который может помочь кому-то еще. Пожалуйста. - person Joffrey Hernandez; 04.03.2014