web-dev-qa-db-ja.com

PrimeFacesツリーコンポーネント、マネージドBeanから選択したノードを設定

Glassfish3でPrimefaces3.2とJSF2.0を実行しています。

マネージドBeanから選択したノードをプログラムで設定するために、私は多くのことを試みました。これには、選択したノードを次のように設定することも含まれます。

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

「選択するノードが見つかりました」が端末に出力されますが、Webページのツリーでノードが選択されていません。

ツリーは次のようになります。

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

誰かがこれを行う方法について何か考えがありますか?

15
baron5

私はそれを使用して解決しました:

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

バッキングBeanからクライアント側で選択されたツリーノードを強調表示するには、ツリーウィジェットコンポーネントでselectNode()メソッドを呼び出します。

まず、ウィジェットのvar属性をjsfツリーコンポーネントに設定します。

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

ブラウザコンソールからテストできるより:

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

最初のメソッド引数は、そのidによって取得されたノードjqueryオブジェクトを表します(コロン記号は2つの円記号でエスケープする必要があります)。 2番目のパラメーターがfalseに設定されている場合、ノード選択イベントが発生します。

最後に、バッキングBeanから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());

P.S.ブラウザコンソールでコンポーネントのjsapiタイプを検出する

PrimeFaces.widget.VerticalTree.prototype
3
alexSunder

node.setSelected(true)の下にtreeBean.setSelectedNode(node);を追加してください。機能するはずです。

1
user1650624

上記の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();
}

しかし、私はGF 3。のJSF2で3.4を使用しています。違いがあるかどうかはわかりません。

登録

ティム

1

Primefaces 5.2と複数選択で試してみました:

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

動作します。

0
Zardo