【问题标题】:primefaces tree selection always returns nullprimefaces 树选择始终返回 null
【发布时间】:2014-04-04 09:13:11
【问题描述】:

我正在尝试使用 primefaces 示例中的一个非常简单的树示例。我有一个按钮应该显示当前选择的内容。但是getselection 函数的结果始终为null。 (我在加载 bean 的 xhtml 中有一个调用——我不知道这是否是问题所在) xhtml 和 beans 代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:p="http://primefaces.org/ui"
  xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head>
    <title>Facelet Title</title>
</h:head>
   <f:event type="preRenderView" listener="#{masterpage_bean.init()}" />


<h:body>
      <h:form>     
<p:layout style="min-width:650px;min-height:400px;" id="head">  
    <p:layoutUnit position="center"  size="275"  resizable="true">

    <p:growl id="messages" showDetail="true" />      
    <p:panel header="Work">  
         <h:panelGrid columns="2" cellpadding="5">  


       <p:tree id="treeSingle" value="#{masterpage_bean.root}" var="node" style="font-size: 12px"
        selectionMode="single"  

        selection="#{masterpage_bean.selectedNode}">  


    <p:treeNode>     
       <h:outputText value="#{node}" />  

    </p:treeNode>  


</p:tree>  
        <p:commandButton value="Display Selected" action="#{masterpage_bean.displaySelectedSingle}" id="btnDisplay"/>          



         </h:panelGrid>     
  </p:panel>

</p:layoutUnit>
    </p:layout>       
                </h:form>
</h:body>

还有豆子:

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

@ViewScoped
@ManagedBean 
public class Masterpage_bean  {


TreeNode root;
TreeNode selectedNode;  


   public void init(){
   selectedNode=new DefaultTreeNode("root",null);

     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("Some guy G.J", node0);  
    TreeNode node01 = new DefaultTreeNode("Another the third", node0);  


   }     


  public TreeNode getRoot() {
    return root;
}



   public TreeNode getSelectedNode() {  
    return selectedNode;  
}  

    public void setSelectedNode(TreeNode selectedNode) {  
    this.selectedNode = selectedNode;  
}  



    public void displaySelectedSingle() {  
      if(selectedNode != null) {  
          // this never happens ! 
    }  

} 

}

【问题讨论】:

  • 在对类似问题进行了一些额外的搜索后:我可以报告我也尝试了以下方法: 1.删除了所有布局和面板 - 这没有效果。我还将 primefaces 库降级到了 3.5 版(我使用的是 4.0)——这导致 displaySelectedSingle() 函数甚至没有被调用!

标签: java jsf-2 primefaces


【解决方案1】:

在 xhtml 中,我将“action”按钮更改为“actionListener”并退出事件标记。 在 java 代码中,我使用构造函数而不是“init”方法。 试试这个

Java 代码

import java.io.Serializable;  
import javax.faces.application.FacesMessage;  
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;  
import javax.faces.event.ActionEvent;  

import org.primefaces.model.DefaultTreeNode;  
import org.primefaces.model.TreeNode;  

@ViewScoped
@ManagedBean (name="masterpage_bean")
public class TreeBean implements Serializable {  

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    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("Some guy G.J", node0);  
        TreeNode node01 = new DefaultTreeNode("Another the third", node0);
    }  

    public TreeNode getRoot() {  
        return root;  
    }  

    public TreeNode getSelectedNode() {  
        return selectedNode;  
    }  

    public void setSelectedNode(TreeNode selectedNode) {  
        this.selectedNode = selectedNode;  
    }  

    public void displaySelectedSingle(ActionEvent event) {  
        if(selectedNode != null) {  
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", selectedNode.getData().toString());  

            FacesContext.getCurrentInstance().addMessage(null, message);  
        }  
    }  
}  

XHTML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"   
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://java.sun.com/jsf/facelets"
      >
<h:head>
    <title>Facelet Title</title>
</h:head>

<h:body>
   <h:form>     
<p:layout style="min-width:650px;min-height:400px;" id="head">  
    <p:layoutUnit position="center"  size="275"  resizable="true">

    <p:growl id="messages" showDetail="true" />      
    <p:panel header="Work">  
         <h:panelGrid columns="2" cellpadding="5">  


       <p:tree id="treeSingle" value="#{masterpage_bean.root}" var="node" style="font-size: 12px"
        selectionMode="single"  

        selection="#{masterpage_bean.selectedNode}">  


    <p:treeNode>     
       <h:outputText value="#{node}" />  

    </p:treeNode>  


</p:tree>  
        <p:commandButton value="Display Selected" actionListener="#{masterpage_bean.displaySelectedSingle}" update="messages" id="btnDisplay"/>          

         </h:panelGrid>     
  </p:panel>

</p:layoutUnit>
    </p:layout>       
                </h:form>

</h:body>
</html>

【讨论】:

  • 感谢 Rafa - 成功了。我现在看到它起作用的原因是因为构造函数。我可以简单地调用 init();在构造函数中 - 然后我的代码也可以工作。 bean 显然会在调用之间丢失数据。我认为@ViewScoped 会解决这个问题 - 但显然不是。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-05-31
  • 2015-08-15
  • 2012-03-18
  • 2016-11-04
  • 2016-07-28
  • 2010-11-08
相关资源
最近更新 更多