Rich:tree no RichFaces 4.2.2.Final sem associar nó selecionado à propriedade do managed-bean

1 resposta
ziegfried

Estou testando o componente rich:tree na versão 4.2.2.Final do RichFaces e não estou conseguindo capturar os nós selecionados da árvore no managed-bean. Estou usando o atributo selection="#{arvoreBean.selecionados}" do rich:tree para guardar o conjunto de nós selecionados nessa propriedade que, segundo a API, deve ser do tipo HashSet para aceitar seleção múltipla. Pelo que entendi, o selectionType="ajax" em conjunto com selection="#{arvoreBean.selecionados}" faria com que essa propriedade "selecionados" fosse populada no managed-bean, fazendo com que o render="showSelecionado" fizesse o a4j:outputPanel correspondente ser re-renderizado, exibindo o nó selecionado. Infelizmente, não é o que acontece. Eu ficaria muito agradecido se alguém pudesse dar alguma sugestão :)

Eis os trechos relevantes do meu código:

Página:
<h:form id="formArvore">
	
	<rich:tree id="arvore" value="#{arvoreBean.tronco}" var="node" nodeType="#{node.type}" toggleType="client"
		style="width: 500px" selectionType="ajax" selection="#{arvoreBean.selecionados}" render="showSelecionado">
		
		<rich:treeNode type="folha">
			<h:outputText value="#{node}" />
		</rich:treeNode>
		
		<rich:treeNode type="ramo">
			<h:outputText value="#{node}" />
		</rich:treeNode>
		
	</rich:tree>
	
	<a4j:outputPanel id="showSelecionado" layout="block">
		<h:outputText value="#{arvoreBean.unicoSelecionado}" rendered="#{not empty arvoreBean.selecionados}" />
	</a4j:outputPanel>
	
</h:form>
Managed-bean:
@ManagedBean
@SessionScoped
public class ArvoreBean {
	
	/* O tronco que encapsulará todos os demais elementos da árvore */
	private ElementoArvore<String> tronco;
	
	/* Guarda o elemento selecionado na árvore */
	private HashSet<ElementoArvore<String>> selecionados;
	
	public ArvoreBean() {
		if(tronco == null) {
			ElementoArvore<String> ramo = new ElementoArvore<String>(false, "Primeiro ramo");
			
			for(int i = 0; i < 5; i++) {
				ElementoArvore<String> folha = new ElementoArvore<String>(true, "Folha " + (i + 1));
				ramo.addChild(i, folha);
			}
			
			tronco = new ElementoArvore<String>();
			tronco.addChild(0, ramo);
			tronco.addChild(1, new ElementoArvore<String>(false, "Segundo ramo"));
			tronco.addChild(2, new ElementoArvore<String>(true, "Folha diretamente ligada ao tronco"));
		}
	}

	public ElementoArvore<String> getTronco() {
		return tronco;
	}

	public HashSet<ElementoArvore<String>> getSelecionados() {
		return selecionados;
	}

	public void setSelecionados(HashSet<ElementoArvore<String>> selecionados) {
		this.selecionados = selecionados;
	}
	
	public ElementoArvore<String> getUnicoSelecionado() {
		if(!selecionados.isEmpty()) {
			return selecionados.iterator().next();
		}
		
		return null;
	}
}
Finalmente, a classe ElementoArvore:
public class ElementoArvore<T> extends TreeNodeImpl {
	
	private T data;
	private String type;
	
	public ElementoArvore() {
		super();
	}
	
	public ElementoArvore(boolean leaf, T data) {
		super(leaf);
		this.data = data;
		this.type = leaf ? "folha" : "ramo";
	}

	public T getData() {
		return data;
	}

	public void setData(T data) {
		this.data = data;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	@Override
	public String toString() {
		return this.data.toString();
	}
}

1 Resposta

ziegfried

alguma sugestão? ainda estou empacado nesse problema…

Criado 25 de maio de 2012
Ultima resposta 6 de jun. de 2012
Respostas 1
Participantes 1