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

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

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

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");
}

& Quot; нашел узел для выбора & quot; печатается в терминале, но узел не выбран в дереве на веб-странице.

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

<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;  
}  
}

У кого-нибудь есть идеи как это сделать?

 damian15 мая 2012 г., 17:29
что делает treeBean.setSelectedNode (node)? Можете ли вы показать код этого метода?
 baron518 мая 2012 г., 08:16
На самом деле интересный вопрос. Компонент SessionScoped, но я редактирую старое приложение, которое обновлено с JSF 1.1 до JSF 2.0, поэтому я использую старый FacesContext FaceContext = FacesContext.getCurrentInstance (); VariableResolver vr = FaceContext.getApplication (). GetVariableResolver (); TreeBean treeBean = (TreeBean) vr.resolveVariable (FaceContext, & quot; TreeBean & quot;); вместо инъекции. Может быть, там что-то есть ...
 damian18 мая 2012 г., 13:51
Я предлагаю вам отладить или добавить несколько журналов, чтобы определить, используется ли тот же экземпляр. Возможно, с вашим кодом создается новый экземпляр. Также вы можете попробовать использовать @ManagedProperty (value = & quot; # {treeBean} & quot; вместо кода JSF 1.1
 damian16 мая 2012 г., 13:55
Хорошо. метод setSelectedTreeNode находится в другом бине, верно? Каковы области применения бобов? Вы вводите с помощью ManagedProperty? Вы уверены, что введенный treeBean - это тот же treeBean, который используется страницей? (возможно, создается новый экземпляр)
 baron516 мая 2012 г., 08:17
обновил вопрос с TreeBean. Это в основном просто установщик. Построен так:primefaces.org/showcase/ui/treeSelectionSingle.jsf

Ответы на вопрос(6)

TreeNode был или выбран автоматически с помощью:myTreeNode.setSelected(true);

Example :

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

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

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

                                            m2.setSelected(true);
                                            break;
                                        }
                                    }
                                }
 25 окт. 2015 г., 11:40
Не то же самое в наборе выбранных.
 12 окт. 2015 г., 11:36
Это так же, как ответ с 5 голосов ...

if Скажите, когда правда, сделайте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

Тим

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

работает.

вызовите метод selectNode () в компоненте виджета дерева.

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

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

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

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

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

Наконец, сделайте вызов javascript из поддерживающего компонента:

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

Постскриптум найти компонент js api типа в консоли браузера

PrimeFaces.widget.VerticalTree.prototype

Я решил это с помощью:

node.setSelected(true);

Я обнаружил, что выбора узла недостаточно для «компонента дерева» расширить от корневого узла до выбранного узла.

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

 <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());
    }
}
 23 нояб. 2017 г., 16:10
Где должен быть кодnode.setSelected(true); ? Это в представлении или в Java Back bean @jlago

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

Ваш ответ на вопрос