RichFaces rich:没有被监听的tree nodeSelectListener

时间:2010-02-24 17:33:30

标签: java jsf richfaces

我有一个rich:tree组件,如下所示:

                    <rich:tree switchType="client" value="#{MyBacking.logTree}"
                    reRender="selectedLog" var="item" nodeFace="#{item.type}"
                    nodeSelectListener="#{MyBacking.processLogSelection}"
                    style="width: 50px;">
                    <rich:treeNode type="folder"
                        icon="/img/logListFolderIconClosed.png"
                        iconLeaf="/img/logListFolderIconOpen.png">
                        <h:outputText value="#{item.name}" />
                    </rich:treeNode>
                    <rich:treeNode type="log" iconLeaf="/img/logFileIcon.png"
                        icon="/img/logFileIcon.png">
                        <h:outputText value="#{item.name}" />
                    </rich:treeNode>
                </rich:tree>

我的MyBacking processLogSelection()方法是:

    public void processLogSelection(NodeSelectedEvent event) {
    logger.info("In processLogSelection");
    HtmlTree tree = (HtmlTree) event.getComponent();
    nodeTitle = (String) tree.getRowData();
    selectedNodeChildren.clear();
    TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
    if (currentNode.isLeaf()){
        selectedNodeChildren.add((String)currentNode.getData());
    } else {
        Iterator<Map.Entry<Object, TreeNode>> it = currentNode.getChildren();
        while (it != null && it.hasNext()) {
            Map.Entry<Object, TreeNode> entry = it.next();
            selectedNodeChildren.add(entry.getValue().getData().toString()); 
            logger.info("selected node: " + entry.getValue().getData().toString());
        }
    }
}

但是当页面呈现树(精细)时,单击某个节点会突出显示该节点,但不会从任何Bean记录器调用中记录任何内容 - 该方法只是未被调用。任何帮助回答为什么会这样做将不胜感激。 标记

编辑添加了建议的标签/简化的bean方法 - 就日志而言,仍然无法从bean获得响应:

            <h:panelGrid columns="2" border="0" width="100%" rowClasses="tt">
            <rich:panel styleClass="panelLogTree" header="Log Select">
                <h:form>
                    <rich:tree switchType="client" value="#{MyBacking.logTree}"
                        var="item" nodeFace="#{item.type}" reRender="selectedLog"
                        nodeSelectListener="#{MyBacking.processLogSelection}"
                        ajaxSubmitSelection="true" style="width: 50px;">
                        <rich:treeNode type="folder"
                            icon="/img/logListFolderIconClosed.png"
                            iconLeaf="/img/logListFolderIconOpen.png">
                            <h:outputText value="#{item.name}" />
                        </rich:treeNode>
                        <rich:treeNode type="log" iconLeaf="/img/logFileIcon.png"
                            icon="/img/logFileIcon.png">
                            <h:outputText value="#{item.name}" />
                        </rich:treeNode>
                    </rich:tree>
                </h:form>
            </rich:panel>

            <rich:panel styleClass="panelLogOutput" header="Log Content">
                <h:outputText escape="false"
                    value="Log content: #{MyBacking.nodeTitle}" id="selectedLog" />
            </rich:panel>
        </h:panelGrid>
    </rich:tab>

注意结束rich:tab,因为此树在包含的jsp文件的选项卡中呈现。我的支持bean方法现在也是:

    public void processLogSelection(NodeSelectedEvent event) {
    logger.info("In processLogSelection");
}

进一步编辑 有趣的是,我以为我会回到基本的工作模式。我从RichFaces Demo Page获取了代码。我修改了faces-config.xml以包含SimpleTreeData bean。我无法获取在(simple-tree-data.properties)中读取数据文件的bean代码,因此我改为使用FileReader。这个构建好了,我得到了一个修改过的index.jsp jsf页面,在示例页面上列出了简单的树例子,除了点击列表项没有将选定的nodeTitle报告给指定的地方(同样的问题) )。

我可以将此视为上面报告的相同问题,或者loadTree bean中的SimpleTreeData.java方法已被更改的事实。在更改中,我删除了以下行并根据需要更改了无关代码:

        FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    InputStream dataStream = externalContext.getResourceAsStream(DATA_PATH);

如前所述,我使用了FileReader,但有人认为这个问题可能与我删除这3行有关吗?如上所列,我的processLogSelection方法不使用getCurrentInstance,但我不确定如果JSF中列出ajaxSubmitSelection="true"则需要它。

难住了。

2 个答案:

答案 0 :(得分:1)

我尝试this facelets template和此sample java backing bean并调用了该方法。我假设你使用Seam,但也许我错了:)不久之前有一些抱怨:seam forum。您使用的是什么版本的Richfaces以及哪些浏览器?如果你也使用Seam,请告诉它的版本。

答案 1 :(得分:0)

解决这个问题的方法是安装一个facelets jar。见here。不出所料,它影响了我的其他问题。