![](/img/trans.png)
[英]Primefaces tree with checkbox mode - setting multiple child nodes from Managed Bean
[英]PrimeFaces Tree component, setting selected node from managed bean
我在 Glassfish 3 上运行 Primefaces 3.2 和 JSF 2.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");
}
“找到要选择的节点”在终端中打印,但在网页的树中未选择该节点。
树是这样的:
<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());
}
}
对我来说,以上都没有奏效。 因为从我在控制台中看到的内容来看,子节点没有任何 id,更不用说任何行键号了,所以我在 rowKey 属性的帮助下使用了 jQuery 高级类选择器,所以我不得不使用
String script = "PF('treeSingleWidget').selectNode($(\"td[data-rowkey='" + selectedNode.getRowKey() + "']\"))";
Primefaces.current().executeScript(script);
要从支持 bean 调用树小部件组件上的 selectNode() 方法突出显示客户端上的选定树节点。
首先,将小部件 var 属性设置为 jsf 树组件:
<p:tree id="treeSingle" widgetVar="treeSingleWidget"
比您可以从浏览器控制台测试它:
PrimeFaces.widgets.treeSingleWidget.selectNode($("#treeSingle\\:1"), true);
第一个方法参数代表节点 jquery 对象,它是通过它的 id 获得的(冒号符号必须用两个反斜杠转义)。 如果第二个参数设置为 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());
PS在浏览器控制台中发现组件js api类型
PrimeFaces.widget.VerticalTree.prototype
在上面的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 上的 JSF 2 上使用 3.4。我不知道是否有区别。
法规
蒂姆
请在treeBean.setSelectedNode(node);
下方添加node.setSelected(true)
treeBean.setSelectedNode(node);
它应该工作。
尝试使用 primefaces 5.2 和多选:
treeBean.setSelectedNode(new TreeNode[]{node});
作品。
我正在使用在 Glassfish 3.1 Build 43 中部署的 Primefaces 3.0;
树节点是或被自动选择: 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;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.