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;
}
}
誰かがこれを行う方法について何か考えがありますか?
私はそれを使用して解決しました:
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());
}
}
バッキング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
node.setSelected(true)
の下にtreeBean.setSelectedNode(node);
を追加してください。機能するはずです。
上記の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を使用しています。違いがあるかどうかはわかりません。
登録
ティム
Primefaces 5.2と複数選択で試してみました:
treeBean.setSelectedNode(new TreeNode[]{node});
動作します。