Java 如何隐藏Richfaces树中的某些节点(不按条件渲染节点)?
我在SEAM应用程序中有一个类别和课程树。课程可以是活动的,也可以是非活动的。我希望能够在我的树中仅显示活动或所有课程 我决定总是在我的页面作用域组件中构建完整的树,因为构建这个树是一项非常昂贵的操作。在TreeNode包装的数据中有布尔标志courseActive。现在,我无法找到仅当此标志为true时才显示课程节点的方法 我使用以下代码获得的最佳结果:Java 如何隐藏Richfaces树中的某些节点(不按条件渲染节点)?,java,jsf,seam,richfaces,facelets,Java,Jsf,Seam,Richfaces,Facelets,我在SEAM应用程序中有一个类别和课程树。课程可以是活动的,也可以是非活动的。我希望能够在我的树中仅显示活动或所有课程 我决定总是在我的页面作用域组件中构建完整的树,因为构建这个树是一项非常昂贵的操作。在TreeNode包装的数据中有布尔标志courseActive。现在,我无法找到仅当此标志为true时才显示课程节点的方法 我使用以下代码获得的最佳结果: <h:outputLabel for="showInactiveCheckbox" value="show all courses:
<h:outputLabel for="showInactiveCheckbox" value="show all courses: "/>
<h:selectBooleanCheckbox id="showInactiveCheckbox" value="#{categoryTreeEditorModel.showAllCoursesInTree}">
<a4j:support event="onchange" reRender="categoryTree"/>
</h:selectBooleanCheckbox>
<rich:tree id="categoryTree" value="#{categoryTree}" var="item" switchType="ajax"
ajaxSubmitSelection="true" reRender="categoryTree,controls"
adviseNodeOpened="#{categoryTreeActions.adviseRootOpened}"
nodeSelectListener="#{categoryTreeActions.processSelection}"
nodeFace="#{item.typeName}">
<rich:treeNode type="Category" icon="..." iconLeaf="...">
<h:outputText value="#{item.title}"/>
</rich:treeNode>
<rich:treeNode type="Course" icon="..." iconLeaf="..."
rendered="#{item.courseActive or categoryTreeEditorModel.showAllCoursesInTree}">
<h:outputText rendered="#{item.courseActive}" value="#{item.title}"/>
<h:outputText rendered="#{not item.courseActive}" value="#{item.title}" style="color:#{a4jSkin.inactiveTextColor}"/>
</rich:treeNode>
</rich:tree>
唯一的问题是,如果某个节点没有列在任何rich:treeNode中,那么它仍然显示为Object.toString()方法获得的标题,而不是隐藏
有人知道如何根据某些条件不显示Richfases树中的某些节点吗
更新
为了更好地理解我要做的事情,我可以提供一个简单的例子:
我知道我有一个包含文件和目录的文件系统,有普通的和隐藏的文件(在我的例子中,我没有隐藏的目录,但这并不重要)
我想读取一次文件和目录,并将树存储在模型(org.richfaces.model.TreeNode)中,然后能够在一个页面上仅显示目录,在另一个页面上默认情况下仅显示目录而不显示隐藏文件,并且可以使用此页面上的复选框显示所有文件和目录
在facelet中添加(/不渲染)rish:treeNode元素是不够的,因为如果存在任何渲染的rich:treeNode中未提及的节点,则使用默认图标和标题渲染该节点。有人可能会认为rich:treeNode类似于elemnt,只是为了向某些类型的节点添加自定义视觉样式,而不是作为负责渲染节点的元素。我真的不确定,但也许您可以尝试使用Facelets。EL的计算是否正确,因为c:if是构建时标记 请参阅:您是否尝试了
当标志返回true时,在此处显示一些内容
当标志不正确时,在此处显示一些内容
更新
我不确定你的问题到底是什么,但我猜你想隐藏一个树节点
在您的示例中,它将如下所示:
<s:fragment rendered="#{item.courseActive}">
<rich:treeNode type="Category" icon="..." iconLeaf="...">
<h:outputText value="#{item.title}"/>
</rich:treeNode>
</s:fragment>
<s:fragment rendered="#{not item.courseActive}">
<rich:treeNode type="Course" icon="..." iconLeaf="...">
<h:outputText value="#{item.title}"/>
</rich:treeNode>
</s:fragment>
看来有两种方法可以解决我的问题 第一个:我可以使用rich:recursiveTreeNodeAdaptor,在递归getter函数中,我可以跳过一些节点。此方法可能很难与拖放一起用于移动树中的项目 第二个:在服务器端附加和分离一些节点。这种方法的缺点是通过树进行递归迭代的Java代码太多 我想我将使用第二种方法,因为我需要拖放树编辑器 一年前,JBoss comunity论坛也讨论了同样的问题:
第二种方法也被建议,它不起作用,原因很清楚。如果存在一个节点,则树模型将在rich:tree生成的视图中呈现,即使没有rich:treeNode元素。c:if的结果与我发布的代码获得的结果完全相同。我正在寻找如何避免渲染一些不需要的节点的方法。实际上,我想在三个或四个不同的视图上使用相同的backingbean模型,并且在每个视图中都会有不同的条件,哪些节点要渲染,哪些节点要跳过。这不会像预期的那样工作,因为您的代码将隐藏treeNode元素,而这个元素实际上不会在视图上渲染节点。它只允许为某些类型的节点指定自定义样式参数。如果模型中有一个节点,但没有渲染的treeNode元素,则将使用默认样式渲染该节点。
<s:fragment rendered="#{item.courseActive}">
<rich:treeNode type="Category" icon="..." iconLeaf="...">
<h:outputText value="#{item.title}"/>
</rich:treeNode>
</s:fragment>
<s:fragment rendered="#{not item.courseActive}">
<rich:treeNode type="Course" icon="..." iconLeaf="...">
<h:outputText value="#{item.title}"/>
</rich:treeNode>
</s:fragment>