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
[code]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);[/code]
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.
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?
[code] 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); [/code]
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.
Ninguém sabe a solução desse problema???
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.
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.