Menu dinâmica no Primefaces

5 respostas
M

Prezados,

Preciso de um ajuda, estou usando o Menu do primafaces de forma dinâmica, onde carrego vários itens cadastrados no banco, itens diferentes do menu podem ir para a mesma tela exemplo graficoPizza.xhtml onde outros itens também apontam para ela, porém o que muda é a query que irá carregar na tela.
O problema está exatamente ai, quero identifica qual o item o usuário click no menu para busca a query desse item e popula o Bean com os dados correspondente.

Segue os códigos:

menu.xhtml
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:c="http://java.sun.com/jsp/jstl/core"
	xmlns:p="http://primefaces.org/ui" template="layout.xhtml">
	<ui:define name="menu">
		<p:menu model="#{menuAction.model}" style="width:95%"/>
	</ui:define>
</ui:composition>
parte da classe do menuAction
while (graficoIt.hasNext()) {
			Grafico graficoNovo = graficoIt.next();
			item = new MenuItem();
			item.setId("itemMenu" + graficoNovo.getTitulo().replace(" ", ""));
			item.setValue(graficoNovo.getTitulo());
			item.setAjax(false);
			if (graficoNovo.getComponenteWeb().equals("Barra")) {
				item.setUrl("graficoBarra.xhtml");
				item.setActionExpression(createMethodExpression("#{barraAction.teste}"));
			} else if (graficoNovo.getComponenteWeb().equals("Pizza")) {
				item.setUrl("conteudo/graficoPizza.xhtml");
				item.setActionExpression(createMethodExpression("#{pizzaAction.teste}"));
			} else if (graficoNovo.getComponenteWeb().equals("Area")) {
				item.setUrl("graficoArea.xhtml");
				item.setActionExpression(createMethodExpression("#{areaAction.teste}"));
			} else if (graficoNovo.getComponenteWeb().equals("Gauge")) {
				item.setUrl("graficoGauge.xhtml");
				item.setActionExpression(createMethodExpression("#{gaugeAction.teste}"));
			} else if (graficoNovo.getComponenteWeb().equals("Linha")) {
				item.setUrl("graficoLinha.xhtml");
				item.setActionExpression(createMethodExpression("#{linhaAction.teste}"));
			}
			submenu.getChildren().add(item);
		}

		model.addSubmenu(submenu);
private MethodExpression createMethodExpression(String action) {
		MethodExpression methodExpression = FacesContext
				.getCurrentInstance()
				.getApplication()
				.getExpressionFactory()
				.createMethodExpression(
						FacesContext.getCurrentInstance().getELContext(),
						action, null, new Class<?>[0]);
		return methodExpression;
	}
método teste da pizzaAction
public void teste(ActionEvent event) {
		System.out.println(event.getComponent().getId());
	}

Aguardo a ajuda de vocês.
Obrigado.

5 Respostas

M
E se fizer o cast?
public void teste(ActionEvent event) {  
        System.out.println(new ((MenuItem)event.getComponent()).getId());
    }
E se tirar os if... else não seria mais rápido?
while (graficoIt.hasNext()) {  
                Grafico graficoNovo = graficoIt.next();  
                item = new MenuItem();  
                item.setId("itemMenu" + graficoNovo.getTitulo().replace(" ", ""));  
                item.setValue(graficoNovo.getTitulo());  
                item.setAjax(false);

                item.setUrl("grafico"
                                + graficoNovo.getComponenteWeb() 
                                + ".xhtml");  
                item.setActionExpression(createMethodExpression("#{"
                                + graficoNovo.getComponenteWeb().toLowerCase()
                                + "Action.teste}"));  

                submenu.getChildren().add(item);  
            }  
      
            model.addSubmenu(submenu);
M

Marcelo,

Desculpa, acho que omiti uma informação importante.
O problema é que ele não entra no método actionEvent, mas para frente irei precisa saber sobre isso também de como recupera o item selecionado.

E sobre os IF e porque o dado volta do banco e preciso verifica um coluna para sabe qual o tipo do gráfico e para qual tela ele tem que ser redirecionada.

Obrigado pela ajuda.

NOSSA MARCELO AGORA QUE ENTENDI DO IF…VLW pela dica…
MAS O PROBLEMA CONTINUA, PRECISA IDENTIFICA OQUE ITEM DO MENU QUE CLIQUEI.

M

Ninguém sabe a solução desse problema???

H

Cara,

eu tive este problema a pouco tempo e resolvi passando
no metodo uma string com o conteudo que eu preciso,
sem usar Action.

Segue um exemplo:

for (String filho : filhos) {
            MenuItem item = new MenuItem();
            item.setValue(filho);
            // item.setUrl("#");
            item.setAjax(false);
            //factory = FacesContext.getCurrentInstance().getApplication()
            //        .getExpressionFactory();
            //methodExpression = new MethodExpressionActionListener(
            //        factory.createMethodExpression(FacesContext
            //                .getCurrentInstance().getELContext(),
            //                "#{menuBean.processAction2('login.jsf')}", Void.TYPE,
            //                new Class[] { ActionEvent.class }));
            //item.addActionListener(methodExpression);
            String programaChamado = "login.jsf";
            item.setActionExpression(createMethodExpression("#{menuBean.processAction2('" + programaChamado + "')}"));
            id++;
            item.setId("id_" + Integer.toString(id));
            submenu2.getChildren().add(item);
           
        }

E o método:

private MethodExpression createMethodExpression(String action) { 
        MethodExpression methodExpression = FacesContext 
                .getCurrentInstance() 
                .getApplication() 
                .getExpressionFactory() 
                .createMethodExpression( 
                        FacesContext.getCurrentInstance().getELContext(), 
                        action, null, new Class<?>[0]); 
        return methodExpression; 
    }  

public String processAction2(String pagina) throws AbortProcessingException {
		// TODO Auto-generated method stub
		System.out.println(pagina);
		
		return pagina;
		

	}

Espero ter ajudado.

M

Dei um tempo nesse projeto, mas assim que consegui um tempo irei alterar para testar dessa maneira que você me passou.

Mas desde já, obrigado.

Criado 14 de fevereiro de 2012
Ultima resposta 14 de jan. de 2013
Respostas 5
Participantes 3