0

私は Primefaces を初めて使用し、数日間 Primefaces Tree を使用しようとしています。基本的に、私はツリーを持っています。このツリーにコンテキスト メニューを追加します。コンテキスト メニューをクリックすると、ダイアログ ウィンドウが開き、ツリーの選択したノードに関する詳細が表示されます。Tree と TreeTable の例に基づいて、primefaces ショーケースを再現しようとしています。

プロジェクトを実行するときに、ダイアログ ウィンドウを開こうとすると、デバッガーに次のエラーが表示されます。

WARNING: /protected/treeonly.xhtml @34,91 value="#{folderManagedBean.selectedNode.data.name}": Target Unreachable, 'null' returned null
javax.el.PropertyNotFoundException: /protected/treeonly.xhtml @34,91 value="#{folderManagedBean.selectedNode.data.name}": Target Unreachable, 'null' returned null

JSFページの下にある

    <?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:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>

        <h:form id="form">  

            <!--*********** Context Menu ***********-->
            <p:contextMenu for="folderTree">  
                <p:menuitem value="Rename Folder" update="folderPanel" oncomplete="folderDialog.show();" icon="ui-icon-plus"/>
            </p:contextMenu> 

            <!--*********** Folder Tree ***********-->
            <p:tree style="border:none;" id="folderTree" value="#{folderManagedBean.root}" var="folder" selectionMode="single" selection="#{folderManagedBean.selectedNode}">  
                <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed">  
                    <h:outputText value="#{folder.name}" />  
                </p:treeNode>  
            </p:tree>  


            <!--*********** Dialog Box ***********-->
            <p:dialog header="New Folder" widgetVar="folderDialog" modal="true" resizable="false"  
                      showEffect="clip" hideEffect="fold">  
                <p:outputPanel id="folderPanel">  
                    <h:panelGrid columns="2" cellpadding="4">  
                        <h:outputText value="Folder Name:" />  
                        <p:inputText value="#{folderManagedBean.selectedNode.data.name}"/> 
                    </h:panelGrid>  
                </p:outputPanel>
            </p:dialog>  


        </h:form>


    </h:body>
</html>

マネージド Bean は次のとおりです。

@ManagedBean
@SessionScoped
public class FolderManagedBean implements Serializable{

    @EJB
    private FolderBean folderBean;

    private Folder froot;  
    private TreeNode root;

    private TreeNode selectedNode;  

    public FolderManagedBean() {   
    }

    @PostConstruct
    public void initialize(){
        root = buildTree();
    }

    public TreeNode getRoot(){
        return root;
    }


    private TreeNode buildTree(){
        froot = folderBean.getRootFolder();

        root = new DefaultTreeNode("root", null);      
        TreeNode realRoot = new DefaultTreeNode(froot, root);

        for (Folder child : froot.getChildFolders()){
            TreeNode tnChild = new DefaultTreeNode(child, realRoot);
            tnChild.setParent(realRoot);
            buildTreeRecursively(tnChild);
        }        
        return root;     
    }

    private void buildTreeRecursively(TreeNode currentNode){
        Folder folder =  (Folder)(currentNode.getData());
        for(Folder child : folder.getChildFolders()){
            TreeNode tnChild = new DefaultTreeNode(child, currentNode);
            tnChild.setParent(currentNode);

            buildTreeRecursively(tnChild);
        }
    }

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

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

どんな助けでも本当に感謝しています。

4

2 に答える 2

1

ページの読み込み時に例外が表示されることを期待しています。ダイアログには、 を参照する inputText がありますselectedNode。その値は、ページの読み込み時に null になるため (選択がまだ行われていないため) NullPointerException、. あなたの問題には複数の解決策があります。

最も簡単な解決策は、ダイアログを設定<p:dialog dynamic="true"し、ダイアログがアクセスされたときにのみプロパティにアクセスすることです。

更新: AJAX イベント ハンドラーを使用して、選択時にダイアログを更新する必要もあります。

<p:tree style="border:none;" id="folderTree" value="#{folderManagedBean.root}" var="folder" selectionMode="single" selection="#{folderManagedBean.selectedNode}">
    <p:ajax event="select" update="folderPanel"/>  
    <p:treeNode expandedIcon="ui-icon-folder-open" collapsedIcon="ui-icon-folder-collapsed">  
        <h:outputText value="#{folder.name}" />  
    </p:treeNode>  
</p:tree>

コンテキスト メニューのupdate属性を削除する必要があります。

于 2012-09-11T05:38:44.830 に答える
0

Ok, I finally solve it. I add the attribute appendToBody="true" to the dialog and it works. The attribute dynamic="true" is not necessary.

Update: This solutions works, but is not so clear. I don't understand exactly what is the purpose of the attribute appendToBody="true". That's why, the solution above is more correct, in my opinion.

于 2012-09-11T06:43:18.387 に答える