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>
@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;
}
}
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();
}
}