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

12

Я использую 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;  
}  
}

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

обновил вопрос с TreeBean. Это в основном просто установщик. Построен так:primefaces.org/showcase/ui/treeSelectionSingle.jsf baron5
На самом деле интересный вопрос. Компонент 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;); вместо инъекции. Может быть, там что-то есть ... baron5
Я предлагаю вам отладить или добавить несколько журналов, чтобы определить, используется ли тот же экземпляр. Возможно, с вашим кодом создается новый экземпляр. Также вы можете попробовать использовать @ManagedProperty (value = & quot; # {treeBean} & quot; вместо кода JSF 1.1 damian
что делает treeBean.setSelectedNode (node)? Можете ли вы показать код этого метода? damian
Хорошо. метод setSelectedTreeNode находится в другом бине, верно? Каковы области применения бобов? Вы вводите с помощью ManagedProperty? Вы уверены, что введенный treeBean - это тот же treeBean, который используется страницей? (возможно, создается новый экземпляр) damian

Ваш Ответ

6   ответов
1

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

Тим

3

вызовите метод 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
13

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

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

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

работает.

1

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

-1

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;
                                        }
                                    }
                                }
Это так же, как ответ с 5 голосов ...
Не то же самое в наборе выбранных.

Похожие вопросы