`
topideal
  • 浏览: 2029 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Richfaces复选框树(Checkbox tree)的纯java解决方案

阅读更多

最近需要做树形选择,google了好久找到<<Richfaces复选框树(Checkbox tree)的权限分配的解决方案 >>一文,但觉得和自己的要求不太符合,它的缺点在于选择时用jquery来决定子项的状态,但不能决定父项的状态,因此自己在此思路上扩展了一些功能,在此记录一下.

效果图:

 

xhtml文件:

<a4j:region renderRegionOnly="true" selfRendered="true">
        <h:panelGrid id="checkBoxTree" columns="1">
            <a4j:form>
                <rich:tree adviseNodeOpened="#{treeBean.adviseNodeOpened}" nodeFace="leaf" ajaxSubmitSelection="true"
                           switchType="client" value="#{treeBean.rootNode}" var="item" ajaxKeys="#{null}"
                           preserveModel="state" treeNodeVar="treeNode" ajaxSingle="true">
                    <rich:treeNode type="leaf">
                        <h:selectBooleanCheckbox value="#{item.selected}" id="boxselect">
                             <a4j:support reRender="checkBoxTree" event="onclick" ajaxSingle="true" actionListener="#{treeBean.processSelected}" />
                         </h:selectBooleanCheckbox>
                        <h:outputLabel value="#{item.name}" for="boxselect"/>
                    </rich:treeNode>
                 </rich:tree>
            </a4j:form>
        </h:panelGrid>
    </a4j:region>

在些我用a4j:support 来实现Checkbox选中的触发事件,如果用Tree中的nodeSelectListener,单击CheckBox控件不会触发事件

 

 

Bean文件:

package com.test.bean;

import com.office.frames.tree.bean.CompanyTreeState;
import com.office.frames.tree.service.CompanyStructTreeService;
import org.richfaces.component.UITree;
import org.richfaces.component.state.TreeState;
import org.richfaces.model.TreeNode;
import org.richfaces.model.TreeRowKey;

import javax.faces.event.ActionEvent;
import java.util.Iterator;
import java.util.Map;

/**
 * Created by IntelliJ IDEA.
 * User: david
 * Date: 11-2-15
 * Time: 下午3:59
 * To change this template use File | Settings | File Templates.
 */
public class TreeBean {
    private CompanyStructTreeService companyStructTreeService;
    private CompanyTreeState companyTreeState;

    public CompanyTreeState getCompanyTreeState() {
        return companyTreeState;
    }

    public void setCompanyTreeState(CompanyTreeState companyTreeState) {
        this.companyTreeState = companyTreeState;
    }

    public CompanyStructTreeService getCompanyStructTreeService() {
        return companyStructTreeService;
    }

    public void setCompanyStructTreeService(CompanyStructTreeService companyStructTreeService) {
        this.companyStructTreeService = companyStructTreeService;
    }

    private TreeNode rootNode = null;

    //取树数据
    public TreeNode getRootNode() {
        if (rootNode == null) {
            try {
                rootNode = companyStructTreeService.getCompanyExtendedTreeNode();

            } catch (Exception e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
        return rootNode;
    }

    public void setRootNode(TreeNode rootNode) {
        this.rootNode = rootNode;
    }

    //因xhtml文件switchType="client",保持树打开形状,并且控制初始化时打开第一级
    public Boolean adviseNodeOpened(UITree tree) {
        if (tree.isExpanded()) {
            return Boolean.TRUE;
        }
        TreeRowKey key = (TreeRowKey) tree.getRowKey();
        if (key != null) {
            TreeState state = (TreeState) tree.getComponentState();
            if (companyTreeState.getSelectedMenuKey() == null) {
                companyTreeState.setSelectedMenuKey(key);
            }
            TreeRowKey selectedKey = state.getSelectedNode();
            if (selectedKey == null) {
                selectedKey = companyTreeState.getSelectedMenuKey();
            }


            if (selectedKey != null && (key.isSubKey(selectedKey)))
                return Boolean.TRUE;


        }

        return Boolean.FALSE;
    }

    // 点击checkbox处理
    public void processSelected(ActionEvent event) {

        if (rootNode != null) {
            UITree tree = (UITree) event.getComponent().getParent().getParent().getParent();
            TreeRowKey key = (TreeRowKey) tree.getRowKey();
            companyTreeState.setSelectedMenuKey(key);
            TreeNode currentNode = tree.getModelTreeNode(key);
            //子项状态跟当前项一致
            setSelectdNode(currentNode);
            //修改父项状态
            if (!((ExtendedTreeNode) (currentNode.getData())).isSelected()) {
                setNodeUncheck(tree, key);
            } else {
                setNodecheck(tree, key);
            }
        }
    }

    //当有某个子项为uncheck状态,把父项的checkbox也设置成uncheck状态
    private void setNodeUncheck(UITree tree, TreeRowKey key) {

        while (!"".equals(key.getParentKey().toString())) {
            TreeRowKey parentKey = key.getParentKey();
            TreeNode parentNode = tree.getModelTreeNode(parentKey);
            ExtendedTreeNode extendedTreeNode = ((ExtendedTreeNode) parentNode.getData());
            key = parentKey;
            extendedTreeNode.setSelected(Boolean.FALSE);
        }

    }

    //当把有的子项为check状态,把父项的checkbox也设置成check状态
    private void setNodecheck(UITree tree, TreeRowKey key) {

        while (!"".equals(key.getParentKey().toString())) {
            TreeRowKey parentKey = key.getParentKey();
            TreeNode parentNode = tree.getModelTreeNode(parentKey);
            ExtendedTreeNode extendedTreeNode = ((ExtendedTreeNode) parentNode.getData());
            key = parentKey;
            if (checkNodeCheck(parentNode)) {
                extendedTreeNode.setSelected(Boolean.TRUE);
            }

        }
    }

    //检查所有子项check状态
    private Boolean checkNodeCheck(TreeNode parentNode) {
        Iterator itr = parentNode.getChildren();
        while (itr.hasNext()) {

            TreeNode childNode = (TreeNode) ((Map.Entry) itr.next()).getValue();
            ExtendedTreeNode extendedTreeNode = ((ExtendedTreeNode) childNode.getData());

            if (!extendedTreeNode.isSelected()) {
                return Boolean.FALSE;
            }

        }
        return Boolean.TRUE;
    }

    //设置选中项的子项状态
    private void setSelectdNode(TreeNode currentNode) {
        ExtendedTreeNode currentNodeData = ((ExtendedTreeNode) currentNode.getData());
        boolean currentNodeIsChecked = currentNodeData.isSelected();
        Iterator itr = currentNode.getChildren();
        while (itr.hasNext()) {
            TreeNode childNode = (TreeNode) ((Map.Entry) itr.next()).getValue();
            ExtendedTreeNode extendedTreeNode = ((ExtendedTreeNode) childNode.getData());
            extendedTreeNode.setSelected(currentNodeIsChecked);
            setSelectdNode(childNode);
        }
    }

}

至此,在Rich Face 中的选择树的问题就解决了。。

 

  • 大小: 19.2 KB
0
0
分享到:
评论
1 楼 discoverisland 2011-11-30  
LZ想问问用JS怎样获取树的长度,我现在要做一个全选按钮,想法是通过获取节点长度后,将checkbox状态设置为true.若您有什么好的办法,请指点指点

相关推荐

    richfaces tree权限树

    "richfaces tree权限树"是一个基于RichFaces框架构建的用于实现权限管理的树形结构组件。RichFaces是一个功能强大的JavaServer Faces(JSF)扩展库,它提供了许多高级UI组件和Ajax功能,使得开发人员能够更轻松地...

    使用richfaces 实现tree

    在Java世界中,JSF(JavaServer Faces)是一种用于构建用户界面的服务器端MVC框架,而RichFaces是它的一个扩展库,提供了丰富的组件和功能,尤其在创建交互式、富客户端界面方面表现出色。本教程将聚焦于如何使用...

    richfaces自动构建树实现.docx

    RichFaces 自动构建树实现是基于 Java 语言和 RichFaces 框架的树形结构实现。树形结构在软件系统中非常常见,包括树形菜单的构建、基于二叉树的二分查找法等等。RichFaces 提供了树形结构接口和默认的实现类,我们...

    JSF Richfaces构建树

    通过使用JavaServer Faces (JSF) 和 RichFaces 的 `&lt;t:tree&gt;` 组件,可以高效地构建出功能丰富且具有良好用户体验的树形菜单。选择合适的数据结构和构建策略对于确保系统的性能和可维护性至关重要。此外,通过合理...

    RichFaces4.5 JavaApi JSApi

    此外,`org.richfaces.model.SelectItem`类用于创建可选的下拉框或列表项,提供更灵活的数据绑定选项。`org.richfaces.renderkit.html_extended.AjaxRenderer`则负责处理AJAX渲染逻辑,确保页面更新只发生在必要的...

    richfaces-ui-3.2.1

    《深入理解RichFaces UI 3.2.1在JBoss中的应用》 RichFaces UI 3.2.1是JBoss框架中一个重要的组件,它为开发人员提供了一套强大的AJAX(Asynchronous JavaScript and XML)功能,极大地提升了Web应用程序的交互性和...

    richfaces 相关资料2

    - 这篇文章可能深入介绍了如何结合Enterprise JavaBeans (EJB)、JavaServer Faces (JSF) 和Seam框架,使用RichFaces的Tree和TreeNode组件来构建动态的节点树结构。 4. **RichFaces自动构建树实现 .docx** - 这个...

    用richFaces的<rich:treeNode>标签开发tree

    在实际应用中,`&lt;rich:tree&gt;`组件还可以与其他RichFaces组件结合,比如`&lt;rich:contextMenu&gt;`,为树节点提供右键菜单,增强用户体验。同时,通过CSS和JavaScript,可以进一步定制组件的样式和交互行为。 总的来说,`...

    usersrc.rar_jsf richfaces_richfaces_办公 Java

    《Java JSF Richfaces在办公自动化系统中的应用详解》 在现代企业信息化建设中,办公自动化系统的开发与应用已经成为提升工作效率、实现管理现代化的关键。本文将深入探讨如何利用Java、JSF(JavaServer Faces)...

    Richfaces ShowCase离线包

    **Richfaces ShowCase离线包** 是一个专为开发者设计的资源包,它包含了Richfaces框架的演示示例,能够帮助用户在没有网络连接的情况下也能深入理解和学习Richfaces的功能和用法。这个离线包特别适合那些需要在本地...

    richfaces中文开发文档

    RichFaces是一款基于JavaServer Faces(JSF)技术的开源UI组件库,由JBoss组织开发。它为JSF应用程序提供了丰富的用户体验和强大的交互功能。这款框架极大地简化了Web开发过程,尤其是对于需要高度互动性和动态效果...

    richfaces3.3.1中树的节点的拖动

    在IT行业中,富客户端框架(RichFaces)是一个广泛使用的JavaScript和JavaServer Faces(JSF)组件库,它提供了丰富的用户界面功能。本文将深入探讨"richfaces3.3.1中树的节点的拖动"这一主题,这是RichFaces 3.3.1...

    richfaces参考文档

    - **&lt;rich:tree&gt;**:创建可扩展的树形视图,支持拖放操作和节点状态管理。 - ****:增强版的树组件,支持拖放操作,常用于构建可配置的树状结构。 ### RichFaces 集成与配置 - **Maven 依赖**:在 Maven 项目中,...

    richfaces开发指南(英文版)

    RichFaces拥有活跃的社区论坛和文档,开发者可以在这里找到解决方案、示例代码以及与其他开发者交流的机会。 总之,RichFaces提供了一个强大而全面的框架,使开发者能够快速构建富客户端的JSF应用。理解其核心概念...

    richfaces4.0所需jar包

    RichFaces 4.0 是一个强大的JavaServer Faces (JSF) 框架的扩展库,主要用于构建富互联网应用程序(RIA)。它提供了丰富的组件库,增强了用户体验,允许开发者创建交互性和动态性极强的Web应用。这个压缩包包含了...

    richfaces官方demo

    **标题:“RichFaces官方Demo”** **描述:**“这个资源是从JBoss网站上下载的,其中包含了完整的源代码,并且可以直接运行。这意味着你可以深入理解并实践RichFaces框架的各种功能和特性。” **知识点详解:** *...

Global site tag (gtag.js) - Google Analytics