Компонент PrimeFaces Tree, установка выбранного node из управляемого bean

Я запускаю Primefaces 3.2 и JSF 2.0 на Glassfish 3.

Я много пробовал, чтобы программно установить выбранный node из управляемого bean. Это включает настройку выбранного node следующим образом:

public void setSelectedTreeNode(String name) {
TreeNode root = treeBean.getRoot();
List<TreeNode> tree = root.getChildren();
for(TreeNode node:tree) {
  if(node.getData().toString().contains(name)) {
    System.out.println("found the node to select");
    treeBean.setSelectedNode(node);
    break;
  }
}
RequestContext context = RequestContext.getCurrentInstance(); 
context.update(":navForm:treeSingle");
}

"Найденный node для выбора" будет распечатан в терминале, но node не выбран в дереве на веб-странице.

Дерево выглядит так:

<h:form id="navForm">
<p:tree id="treeSingle" value="#{treeBean.root}" var="node"  
       selectionMode="single" styleClass="treeStyle" 
       selection="#{treeBean.selectedNode}"
       cache="false"
       >  
   <p:ajax event="select" listener="#{treeBean.onNodeSelect}" update=":mainForm" />
   <p:treeNode>  
       <h:outputText value="#{node}" escape="false" />  
   </p:treeNode>  

  

Изменить: TreeBean построен следующим образом:

@ManagedBean
@SessionScoped    
public class TreeBean implements Serializable {  

private TreeNode root;  

private TreeNode selectedNode;  

public TreeBean() {  
    root = new DefaultTreeNode("Root", null);  
    TreeNode node0 = new DefaultTreeNode("Node 0", root);  
    TreeNode node1 = new DefaultTreeNode("Node 1", root);  
    TreeNode node2 = new DefaultTreeNode("Node 2", root);  

    TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);  
    TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);  

    TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);  
    TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);  

    TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);  
    TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);  
    TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);  

    TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);  
}  

public TreeNode getRoot() {  
    return root;  
}  

public TreeNode getSelectedNode() {  
    return selectedNode;  
}  

public void setSelectedNode(TreeNode selectedNode) {  
    this.selectedNode = selectedNode;  
}  
}

Кто-нибудь знает, как это сделать?

Ответ 1

Я решил это, используя:

node.setSelected(true);

Я обнаружил, что выбора node недостаточно для того, чтобы "древовидная составляющая" расширялась от root node до выбранного node.

Для этого я использовал следующий подход. На вид:

 <p:ajax event="expand" listener="#{tree.onExpand}"/>

в java-коде:

public void onExpand(NodeExpandEvent event) {
    expand(event.getTreeNode());
}

private void expand(TreeNode treeNode){
    if (treeNode.getParent()!=null){
        treeNode.getParent().setExpanded(true);
        expand(treeNode.getParent());
    }
}

Ответ 2

Чтобы выделить выбранное дерево node на стороне клиента из bean вызова метода selectNode() компонента дерева виджета.

Сначала установите атрибут varget var в компонент дерева jsf:

<p:tree id="treeSingle" widgetVar="treeSingleWidget"

Чем вы можете протестировать его из консоли браузера:

PrimeFaces.widgets.treeSingleWidget.selectNode($("#treeSingle\\:1"), true);

Первый аргумент метода представляет объект node jquery, который был получен его id (символ двоеточия должен быть экранирован двумя обратными косыми чертами). Если второй параметр установлен на false, то будет выведено событие выбора node.

Наконец, сделайте javascript-вызов из резервной копии bean:

StringBuilder sb = new StringBuilder();
    sb.append("PrimeFaces.widgets.treeSingleWidget.selectNode(");
    sb.append("$(\"#treeSingle\\\\:");
    sb.append(selectedNode.getRowKey());
    sb.append("\")");
    sb.append(", true)");
    RequestContext.getCurrentInstance().execute(sb.toString());

P.S. для обнаружения компонента js api в консоли браузера.

PrimeFaces.widget.VerticalTree.prototype

Ответ 3

В приведенном выше выражении if, когда true, выполните node.setSelected(true);

Я использую это для установки узлов по мере необходимости. Обратное, очевидно, имеет обратный эффект; он отключает их. Моим вариантом использования был логический флажок, чтобы включить или отключить все узлы, так как у меня довольно много бегающих по дереву. Таким образом, мой фактический код с несколькими методами: -

public Boolean getSelectionState() {
    return selectionState;
}

public void setSelectionState(Boolean selectionState) {
    this.selectionState = selectionState;
}

public String getSelectLabel() {
    return selectionState ? "De-select all" : "Select all";
}

/**
 * Flips all nodes on or off depending on checkbox.
 */
public void onSelectChange() {
    if (prefs.isDebug()) {
        LOG.log(Level.INFO, "Value change event occured. Selection state is:{0}", selectionState);
    }
    for (TreeNode node : rootNode.getChildren()) {
        node.setSelected(selectionState);
    }
    nodes = new ArrayList(rootNode.getChildren());
    selectedNodes = nodes.toArray(new TreeNode[nodes.size()]);
    mapDevices();
}

Однако я использую 3.4 на JSF 2 на GF 3. Я не знаю, есть ли разница.

Regs

Тим

Ответ 4

добавьте node.setSelected(true) ниже treeBean.setSelectedNode(node);, и он должен работать.

Ответ 5

Пробовал с перформами 5.2 и мультиселекцией:

treeBean.setSelectedNode(new TreeNode[]{node});

работы.

Ответ 6

Я работаю с Primefaces 3.0, установленным в Glassfish 3.1 Build 43;

Элемент treeNode был или был выбран автоматически: myTreeNode.setSelected(true);

Пример:

 for (TreeNode m2:root.getChildren())   {

         if (((Menu) m2.getData()).getId() != null) {

            if (me.getId().equals(((Menu) m2.getData()).getId())) {

                                            m2.setSelected(true);
                                            break;
                                        }
                                    }
                                }