Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何隐藏Richfaces树中的某些节点(不按条件渲染节点)?_Java_Jsf_Seam_Richfaces_Facelets - Fatal编程技术网

Java 如何隐藏Richfaces树中的某些节点(不按条件渲染节点)?

Java 如何隐藏Richfaces树中的某些节点(不按条件渲染节点)?,java,jsf,seam,richfaces,facelets,Java,Jsf,Seam,Richfaces,Facelets,我在SEAM应用程序中有一个类别和课程树。课程可以是活动的,也可以是非活动的。我希望能够在我的树中仅显示活动或所有课程 我决定总是在我的页面作用域组件中构建完整的树,因为构建这个树是一项非常昂贵的操作。在TreeNode包装的数据中有布尔标志courseActive。现在,我无法找到仅当此标志为true时才显示课程节点的方法 我使用以下代码获得的最佳结果: <h:outputLabel for="showInactiveCheckbox" value="show all courses:

我在SEAM应用程序中有一个类别和课程树。课程可以是活动的,也可以是非活动的。我希望能够在我的树中仅显示活动或所有课程

我决定总是在我的页面作用域组件中构建完整的树,因为构建这个树是一项非常昂贵的操作。在TreeNode包装的数据中有布尔标志courseActive。现在,我无法找到仅当此标志为true时才显示课程节点的方法

我使用以下代码获得的最佳结果:

<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>