Combobox (SelectOneMenu) adicionar novo item ao clicar no item "Adicionar" dentro do combobox

Alguém sabe como posso fazer um combobox img [/img]abrir uma nova pagina jsf ao clicar em um do seus itens (SelectItem)

Eu fiz aqui um combobox e populei ele com os registros do banco de dados, só que quero que o usuário possa adicionar outro registro caso não tenha o desejado.

Estou usando JSF 2 e a biblioteca PrimeFaces.

Você poderia utilizar o p:ajax do primefaces.

<p:ajax event="change" listener="#{seuBean.seuMetodo}" />

assim, pelo seu backingbean você pode verificar o valor selecionado e renderizar (ou não), a caixa de adição com requestcontext.

RequestContext.getCurrentInstance().update("div-adicionar-opcao");

Dê uma lida sobre o p:ajax, é simples e é o que você procura :lol:

Certo, já tava tentando fazer isso com o p:ajax só que não estava dando muito certo, mas vou estudar mais sobre esse p:ajax e tentar novemente com a sua dica

andre.froes mas antes do

RequestContext.getCurrentInstance().update("div-adicionar-opcao");

preciso abrir uma janela pode ser interna ou externa onde crio o objeto e então sim depois de criado adiciono a opção, tens uma outra dica para isso?

agradeço

Porque você não deixa o componente inputText já criado porém oculto? Se a pessoa selecionar, você simplesmente renderiza ele da mesma forma e já deixa “ligado” com o seu backingbean, e utiliza se necessário e se preenchido.

<h:panelGroup layout="block" rendered="#{meuBean.primeiraCondicao}">
  ...
  <p:inputText value="#{seuBean.valorJaBindado}" rendered="#{seuBean.propriedadeBoolanQueMostaInput}" id="input-novo-valor"/>
  ...
</h:panelGroup>

é que preciso adicionar o objeto inteiro, e esse objeto tem uns 5 atributos , ai seria melhor já chamar a telinha que adiciona o novo objeto, essa telinha eu já tenho pronto ela já faz as validações e tudo para adicionar o objeto certinho

A forma de como realizar permanece a mesma, tem como fazer criando o componente, mas para localizar o componente e realizar a operação é muito mais chato e cansativo de se fazer.

Isso eu quero como componente, pode me mostrar como é?

Eu to tentando fazer assim, com o ui:include mas eu não sei como faço o xhtml do include comunicar o o xhtml que inseriu o include

<p:dialog header="Incluir Material" widgetVar="dlg"> <ui:include src="/incluirComposicaoPapelao.xhtml" /> </p:dialog>


Segue um exemplo funcional, acabei de criar aqui e está funcionando em sua forma mais básica:

select.xhtml:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot; ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:p="http://primefaces.org/ui"&gt;
&lt;h:head&gt;
	&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;
	&lt;title&gt;Página principal&lt;/title&gt;
&lt;/h:head&gt;
&lt;h:body&gt;
	&lt;h:form prependId="false"&gt;
		&lt;h:outputLabel value="Material" for="txMaterial"/&gt;
		&lt;p:selectOneMenu value="#{mb.idSelecionado}" id="select"&gt;
			&lt;f:selectItems value="#{mb.carregarMenu}"/&gt;
			&lt;p:ajax event="change" listener="#{mb.verificarEAbrirDialog}"/&gt;
		&lt;/p:selectOneMenu&gt;
		
		&lt;p:dialog widgetVar="dlgAdicionar" header="Adicionar algum item"&gt;
			&lt;p:commandButton value="Adicionar" actionListener="#{mb.adicionar}"/&gt;
		&lt;/p:dialog&gt;
	&lt;/h:form&gt;
&lt;/h:body&gt;
&lt;/html&gt;

e o managedbean completo pra ti:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import org.primefaces.context.RequestContext;

@ManagedBean(name = "mb")
@ViewScoped
public class NovaOpcao implements Serializable{

	private static final long serialVersionUID = 67183522225166434L;
	private Integer idSelecionado;

	public Collection&lt;SelectItem&gt; getCarregarMenu() {
		// aqui você insere uma query e carrega teus dados
		Collection&lt;SelectItem&gt; lst = new ArrayList&lt;SelectItem&gt;();
		lst.add(new SelectItem(null, &quot;Selecione&quot;));
		for (int i = 0; i &lt; 5; i++) {
			lst.add(new SelectItem(i, &quot;Opção &quot; + i));
		}
		lst.add(new SelectItem(99, &quot;Adicionar&quot;));
		return lst;
	}
	
	public void verificarEAbrirDialog(){
		if (idSelecionado == 99){
			RequestContext.getCurrentInstance().execute(&quot;dlgAdicionar.show()&quot;);
		}
	}
	
	public void adicionar(){
		//aqui você adiciona o item no bd, ao terminar,
		//chama a função do getCarregarMenu e da um upade no componente
		
		getCarregarMenu();
		RequestContext.getCurrentInstance().update(&quot;select&quot;);
		RequestContext.getCurrentInstance().execute(&quot;dlgAdicionar.hide()&quot;);
	}

	public Integer getIdSelecionado() {
		return idSelecionado;
	}

	public void setIdSelecionado(Integer idSelecionado) {
		this.idSelecionado = idSelecionado;
	}
}

Ok andre.froes essa parte está funcionando,

mas agora como posso fazer para o combobox (SelectOneMenu) já selecione o objeto recem criado, eu to fazendo assim só que nao está dando certo:

No controller da telinha que inclui o objeto eu injetei (@Inject) o controller da pagina mãe (o que contem o combobox) e tentei atualizar ele usando o comando:

controllerPaginaMae.getRequestContext().execute("selectTipoMaterial.selectValue('" + novoObjeto.getCodigo + "')");

O comando que seleciona o valor no combobox está certo, ja testei diretamente no controller da pagina mae e funciona, mas quando tento acessar pela pagina filha não da certo,
acredito que seja algo com o @inject que não sendo acessada a mesma instancia e sim sendo criada outra, mas na pagina mãe eu ja coloquei @ScopedSession ApplicationSession mas nenhum da certo

Consegui resolver o problema, era só problema com a requisição ajax mesmo para redenrizar o componente que não estava certo.