Question

How to instantiate a MenuItem and Submenu?

I have the following code is from a tutorial on PrimeFaces I was following, but I have no way to instantiate MenuItem and Submenu because they are interfaces, but the tutorial does not say anything. I think it might be because of the version of PrimeFaces. Can someone help me make this code work?

package br.com.k19.controle;

import javax.faces.bean.ManagedBean;

import org.primefaces.component.column.Column;
import org.primefaces.model.menu.DefaultMenuModel;
import org.primefaces.model.menu.MenuItem;
import org.primefaces.model.menu.MenuModel;
import org.primefaces.model.menu.Submenu;

@ManagedBean
public class MegaMenuBean {

    private MenuModel menuModel;

    public MegaMenuBean() {

        this.menuModel = new DefaultMenuModel();

        Submenu esporteMenu = new Submenu();
        esporteMenu.setLabel("Esportes");

        Submenu futebolMenu = new Submenu();
        futebolMenu.setLabel("Futebol");

        MenuItem item = new MenuItem();
        item.setValue("Brasileiro");
        item.setUrl("#");
        futebolMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Europeu");
        item.setUrl("#");
        futebolMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Japonês");
        item.setUrl("#");
        futebolMenu.getChildren().add(item);

        Submenu voleiMenu = new Submenu();
        voleiMenu.setLabel("Volei");

        item = new MenuItem();
        item.setValue("Liga Mundial");
        item.setUrl("#");
        voleiMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Eliminatórias da Copa");
        item.setUrl("#");
        voleiMenu.getChildren().add(item);

        Submenu automobilismoMenu = new Submenu();
        automobilismoMenu.setLabel("Automobilismo");

        item = new MenuItem();
        item.setValue("Fórmula 1");
        item.setUrl("#");
        automobilismoMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Fórmula 3");
        item.setUrl("#");
        automobilismoMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Fotos");
        item.setUrl("#");
        automobilismoMenu.getChildren().add(item);

        Column esporteColuna1 = new Column();
        esporteColuna1.getChildren().add(futebolMenu);
        esporteColuna1.getChildren().add(voleiMenu);
        esporteMenu.getChildren().add(esporteColuna1);

        Column esporteColuna2 = new Column();
        esporteColuna2.getChildren().add(automobilismoMenuesporteMenu.getChildren().add(esporteColuna2);

        this.menuModel.addSubmenu(esporteMenu);
        Submenu noticiaMenu = new Submenu();
        noticiaMenu.setLabel("Notícias");

        Submenu economiaMenu = new Submenu();
        economiaMenu.setLabel("Economia");

        item = new MenuItem();
        item.setValue("Brasil");
        item.setUrl("#");
        economiaMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Mundo");
        item.setUrl("#");
        economiaMenu.getChildren().add(item);

        Submenu tecnologiaMenu = new Submenu();
        tecnologiaMenu.setLabel("Tecnologia");

        item = new MenuItem();
        item.setValue("Segurança");
        item.setUrl("#");
        tecnologiaMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("Negócios em TI");
        item.setUrl("#");
        tecnologiaMenu.getChildren().add(item);

        Submenu educacaoMenu = new Submenu();
        educacaoMenu.setLabel("Educação");

        item = new MenuItem();
        item.setValue("Vestibular");
        item.setUrl("#");
        educacaoMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("ENEM");
        item.setUrl("#");
        educacaoMenu.getChildren().add(item);

        item = new MenuItem();
        item.setValue("ProUni");
        item.setUrl("#");
        educacaoMenu.getChildren().add(item);

        Column noticiaColuna1 = new Column();
        noticiaColuna1.getChildren().add(economiaMenu);
        noticiaColuna1.getChildren().add(tecnologiaMenu);
        noticiaMenu.getChildren().add(noticiaColuna1);

        Column noticiaColuna2 = new Column();
        noticiaColuna2.getChildren().add(educacaoMenu);
        noticiaMenu.getChildren().add(noticiaColuna2);

        this.menuModel.addSubmenu(noticiaMenu);
    }

    public MenuModel getMenuModel(){
        return menuModel;
    }

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>K19 Treinamentos</title>
</h:head>
<h:body>
    <p:megaMenu model="#{megaMenuBean.menuModel}" />
</h:body>
</html>
Was it helpful?

Solution

You should be using org.primefaces.model.menu.DefaultMenuItem and org.primefaces.model.menu.DefaultSubMenu instead, as seen on the main menu item page. So what you would have instead is:

DefaultSubMenu esporteMenu = new DefaultSubMenu();
   esporteMenu.setLabel("Esportes");

OTHER TIPS

If someone has the same problem, I had to use DefaultMenuColumn instead of Column.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top