`
tan4836128
  • 浏览: 27754 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

增强版JAVA实现文本形式的树状结构显示

阅读更多

 
应网友要求,重新书写了代码,请参考使用。旧代码毅然保留,在文章的后半部

此最新代码增加了对下拉列表的输出支持,可以直接使用在<select>里面
同时可以访问父节点和兄弟节点。

package net.java2000.tools;

import java.util.ArrayList;
import java.util.List;

/** *//**
 * 树状结构的文本显示和下拉框显示。<br>
 * 转载请保留本说明,并注明出处<br>
 * www.java2000.net<br>
 * blog.csdn.net/java2000_net/
 * 
 * @version 2008.02.23
 * @author 赵学庆
 */
public class ForumFolder ...{
  // 编号
  private long id;

  // 标题
  private String title;

  // 下级列表
  private List<ForumFolder> children = new ArrayList<ForumFolder>();

  // 上级,顶层为null
  private ForumFolder parent;

  // 前一个节点
  private ForumFolder prev;

  // 后一个节点
  private ForumFolder next;

  // 当前处理的节点
  private ForumFolder current;

  /** *//**
   * 默认的构造器
   */
  public ForumFolder() ...{
  }

  /** *//**
   * 推荐使用的构造器
   * 
   * @param id 编号
   * @param title 文本
   */
  public ForumFolder(long id, String title) ...{
    this.id = id;
    this.title = title;
  }

  /** *//**
   * 增加一个下属。<br>
   * 自动对应上级和兄弟结点
   * 
   * @param f 被增加的节点
   */
  public void addChild(ForumFolder f) ...{
    children.add(f);
    f.setParent(this);
    if (current != null) ...{
      current.next = f;
    }
    f.prev = current;
    current = f;
  }

  /** *//**
   * 输出为下拉列表的方法
   * 
   * @param selectedId 被选中的编号
   * @return 下拉列表的字符串。可以直接放到<select></select>里面
   */
  public String getOption(long selectedId) ...{
    return "<option>" + toStringOption("", "", selectedId);
  }

  /** *//**
   * 输出为Text的方法。<br>
   * 应网友建议,更改toString为toStringText方法。
   * 
   * @param lftStr 左侧额外的字符串
   * @param append 右侧显示的字符串
   * @return 文本形式的字符串
   */
  public String toStringText(String lftStr, String append) ...{
    StringBuilder b = new StringBuilder();
    b.append(append + title);
    b.append(" ");
    if (children.size() > 0) ...{
      for (int i = 0; i < children.size() - 1; i++) ...{
        b.append(lftStr + children.get(i).toStringText(lftStr + "│", "├"));
      }
      b.append(lftStr + children.get(children.size() - 1).toStringText(lftStr + " ", "└"));
    }
    return b.toString();
  }

  public static void main(String[] args) ...{
    ForumFolder root = new ForumFolder(0, "菜单列表");
    ForumFolder f1 = new ForumFolder(1, "开始菜单");
    root.addChild(f1);
    ForumFolder f1_1 = new ForumFolder(11, "程序");
    f1.addChild(f1_1);
    ForumFolder f1_1_1 = new ForumFolder(111, "附件");
    f1_1.addChild(f1_1_1);
    ForumFolder f1_1_1_1 = new ForumFolder(1111, "娱乐");
    f1_1_1.addChild(f1_1_1_1);
    ForumFolder f1_1_1_2 = new ForumFolder(1112, "娱乐2");
    f1_1_1.addChild(f1_1_1_2);
    ForumFolder f1_2 = new ForumFolder(12, "辅助工具");
    f1.addChild(f1_2);
    ForumFolder f2 = new ForumFolder(2, "My Documents ");
    root.addChild(f2);
    ForumFolder f3 = new ForumFolder(3, "My Documents2 ");
    root.addChild(f3);
    System.out.println(root.toStringText(" ", ""));
    System.out.println(root.getOption(111));
    System.out.println(f1_1_1_2.getPrev().getTitle());
    System.out.println(f1_1_1_2.getPrev().getParent().getTitle());
  }

  public List<ForumFolder> getChildren() ...{
    return children;
  }

  public long getId() ...{
    return id;
  }

  /** *//**
   * 得到下一个兄弟结点。
   * 
   * @return 如果是最后一个,则返回null
   */
  public ForumFolder getNext() ...{
    return next;
  }

  public ForumFolder getParent() ...{
    return parent;
  }

  /** *//**
   * 得到前一个兄弟结点。
   * 
   * @return 如果是第一个,则返回null
   */
  public ForumFolder getPrev() ...{
    return prev;
  }

  public String getTitle() ...{
    return title;
  }

  public void setId(long id) ...{
    this.id = id;
  }

  public void setNext(ForumFolder next) ...{
    this.next = next;
  }

  public void setParent(ForumFolder parent) ...{
    this.parent = parent;
  }

  public void setPrev(ForumFolder prev) ...{
    this.prev = prev;
  }

  public void setTitle(String title) ...{
    this.title = title;
  }

  /** *//**
   * 构造下拉列表.
   * 
   * @param lftStr 左侧的字符
   * @param append 增加的字符
   * @param idSelected 被选中的编号
   * @return 下拉列表字符串
   */
  private String toStringOption(String lftStr, String append, long idSelected) ...{
    StringBuilder b = new StringBuilder();
    b.append(append + title + "</option>");
    b.append(" ");
    if (children.size() > 0) ...{
      for (int i = 0; i < children.size() - 1; i++) ...{
        b.append("<option value='" + children.get(i).getId() + "'" + (idSelected == children.get(i).getId() ? " selected" : "")
            + ">" + lftStr + children.get(i).toStringOption(lftStr + "│", "├", idSelected));
      }
      b.append("<option value='" + children.get(children.size() - 1).getId() + "'"
          + (idSelected == children.get(children.size() - 1).getId() ? " selected" : "") + ">" + lftStr
          + children.get(children.size() - 1).toStringOption(lftStr + " ", "└", idSelected));
    }
    return b.toString();
  }
}

运行结果如下:


菜单列表
 ├开始菜单
 │├程序
 ││└附件
 ││ ├娱乐
 ││ └娱乐2
 │└辅助工具
 ├My Documents 
 └My Documents2 

<option>菜单列表</option>
<option value='1'>├开始菜单</option>
<option value='11'>│├程序</option>
<option value='111' selected>││└附件</option>
<option value='1111'>││ ├娱乐</option>
<option value='1112'>││ └娱乐2</option>
<option value='12'>│└辅助工具</option>
<option value='2'>├My Documents </option>
<option value='3'>└My Documents2 </option>

娱乐
附件

原文出处: http://www.java2000.net/viewthread.jsp?tid=944

--------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------- 以下为老版本的代码,仅供参考 -------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------




代码如下,可根据需求衍生出各种格式的输出和使用

package test;

import java.util.ArrayList;
import java.util.List;

public class Folder ...{
    public Folder(String title) ...{
        this.title = title;
    }

    private String title;

    private List<Folder> children = new ArrayList<Folder>();

    public void addChild(Folder f) ...{
        children.add(f);
    }

    public List<Folder> getChildren() ...{
        return children;
    }

    public void setChildren(List<Folder> children) ...{
        this.children = children;
    }

    public String getTitle() ...{
        return title;
    }

    public void setTitle(String title) ...{
        this.title = title;
    }

    public String toString(String lftStr, String append) ...{
        StringBuilder b = new StringBuilder();
        b.append(append + title);
        b.append("\n");
        if (children.size() > 0) ...{
            for (int i = 0; i < children.size() - 1; i++) ...{
                b.append(lftStr+children.get(i).toString(lftStr + "│", "├"));
            }
            b.append(lftStr + children.get(children.size() - 1).toString(
                    lftStr + " ", "└"));

        }
        return b.toString();

    }

    public static void main(String[] args) ...{
        Folder root = new Folder("菜单列表");
        Folder f1 = new Folder("开始菜单");
        root.addChild(f1);
        Folder f1_1 = new Folder("程序");
        f1.addChild(f1_1);
        Folder f1_1_1 = new Folder("附件");
        f1_1.addChild(f1_1_1);
        Folder f1_1_1_1 = new Folder("娱乐");
        f1_1_1.addChild(f1_1_1_1);
        Folder f1_1_1_2 = new Folder("娱乐2");
        f1_1_1.addChild(f1_1_1_2);
        Folder f1_2 = new Folder("辅助工具");
        f1.addChild(f1_2);
        Folder f2 = new Folder("My Documents ");
        root.addChild(f2);
        Folder f3 = new Folder("My Documents2 ");
        root.addChild(f3);

        System.out.println(root.toString(" ", ""));
    }
}

 运行结果如下:

菜单列表
 ├开始菜单
 │├程序
 ││└附件
 ││ ├娱乐
 ││ └娱乐2
 │└辅助工具
 ├My Documents 
 └My Documents2 
应网友要求,增加了JDK 1.4版及以下的程序版本,取消了泛型

import java.util.ArrayList;
import java.util.List;

public class Folder ...{
  public Folder(String title) ...{
    this.title = title;
  }

  private String title;

  private List children = new ArrayList();

  public void addChild(Folder f) ...{
    children.add(f);
  }

  public List getChildren() ...{
    return children;
  }

  public void setChildren(List children) ...{
    this.children = children;
  }

  public String getTitle() ...{
    return title;
  }

  public void setTitle(String title) ...{
    this.title = title;
  }

  public String toString(String lftStr, String append) ...{
    StringBuilder b = new StringBuilder();
    b.append(append + title);
    b.append(" ");
    if (children.size() > 0) ...{
      for (int i = 0; i < children.size() - 1; i++) ...{
        b.append(lftStr + ((Folder) children.get(i)).toString(lftStr + "│", "├"));
      }
      b.append(lftStr + ((Folder) children.get(children.size() - 1)).toString(lftStr + " ", "└"));
    }
    return b.toString();
  }

  public static void main(String[] args) ...{
    Folder root = new Folder("菜单列表");
    Folder f1 = new Folder("开始菜单");
    root.addChild(f1);
    Folder f1_1 = new Folder("程序");
    f1.addChild(f1_1);
    Folder f1_1_1 = new Folder("附件");
    f1_1.addChild(f1_1_1);
    Folder f1_1_1_1 = new Folder("娱乐");
    f1_1_1.addChild(f1_1_1_1);
    Folder f1_1_1_2 = new Folder("娱乐2");
    f1_1_1.addChild(f1_1_1_2);
    Folder f1_2 = new Folder("辅助工具");
    f1.addChild(f1_2);
    Folder f2 = new Folder("My Documents ");
    root.addChild(f2);
    Folder f3 = new Folder("My Documents2 ");
    root.addChild(f3);
    System.out.println(root.toString(" ", ""));
  }
}

分享到:
评论

相关推荐

    Java.Swing第二版

    除此之外,Swing还支持拖放操作、国际化、以及JTable、JTree和JList等高级组件,用于展示数据表格、树状结构和列表。书中将详细介绍如何使用这些组件来增强用户界面的功能性和用户体验。 在Swing的第二版中,作者...

    常用JAVAjar包

    Java JAR(Java Archive)文件是Java平台上的一个重要组成部分,它允许开发者将多个类文件、相关的元数据和其他资源(如图像、声音或文本文件)打包到一个单一的可执行文件中。这使得分发和执行Java应用程序和库更加...

    计算机图形学:应用JAVA 2D和3D X-7

    Java 2D API是Java标准版(Java SE)的一部分,提供了丰富的功能来创建和操纵二维图形、文本和图像。它包括以下核心组件: 1. **Graphics2D类**:这是绘图的核心类,继承自Graphics类,提供了更多的绘图操作,如...

    java3d编程资料

    1. **数据结构**:Java3D采用了场景图(Scene Graph)结构,这是一种树状的数据结构,其中每个节点(Node)代表3D场景中的一个元素(如几何体、光源等)。这种结构使得管理和渲染复杂的3D场景变得高效而直观。 2. **节点...

    BBS.rar_MyEclipse tomcat_MyEclipse BBS_bbs jsp_myeclipse b_s2s

    描述中提到:“BBS 的例子,MyEclipse+Mysql+Tomcat5.0开发的简单的BBS,实现了树状结构!”这告诉我们这个BBS系统不仅包含了基本的发帖、回帖功能,还特别强调了它具有树状结构的实现。在BBS系统中,树状结构通常...

    Jsp XML树状菜单类库源码.rar

    3. **树状菜单**:树状菜单是一种以层次结构展示信息的界面元素,它通常以折叠或展开的形式显示,方便用户导航和浏览多级目录或分类。在网页设计中,树状菜单能有效地组织大量数据,提高用户交互效率。 4. **类库...

    自己写的树状图,简单方便,可修改,EL传个集合就行

    标题中的“自己写的树状图,简单方便,可修改,EL传个集合就行”表明这是一个自定义实现的树形图表,适用于Java Web开发环境。它强调了易用性、灵活性和可修改性,而且可以通过Expression Language (EL)传递集合数据...

    安卓文件查看器代码

    Android系统基于Linux内核,因此其文件系统遵循Linux的传统,使用目录树状结构来组织文件。根目录“/”下包含各种系统目录,如“/data”用于存储应用程序数据,“/mnt”用于挂载外部存储设备等。文件查看器的目标...

    xom 1.2,一个开源的XML java类库

    - **修改XML**:通过修改树状结构中的元素、属性和文本,可以实现XML的修改。 - **序列化XML**:使用`XMLWriter`类,可以将XML树写入输出流或字符串,生成XML格式的数据。 **总结** XOM 1.2作为一个强大的XML处理...

    AlaiJSCtr.rar_TC35i.r_多级菜单

    多级菜单通常由主菜单项组成,这些主菜单项下拉显示子菜单,子菜单可能还包含更多的子级,形成一个多级的树状结构。这种设计允许用户通过较少的点击就能访问深层的页面或功能,同时保持界面整洁。 在JavaScript中...

    在bs开发中经常用到的javaScript技术整理

    - **ASP+SQL版**:使用ASP和SQL数据库构建树状数据结构。 - **ASP+xml+sql版**:结合XML和SQL数据库实现。 - **Java+SQL或Java+SQL+xml**:使用Java后端处理树形数据。 7. **无边框效果**:通过CSS和JavaScript...

    asm-tree-1.3.5.jar.zip

    在处理复杂的类结构和代码逻辑时,这种树状结构特别有用,因为它允许开发者以结构化的方式遍历和修改字节码。 "asm-tree-1.3.5.jar"是这个版本的ASM Tree API的主要组件,它包含所需的类和方法来解析类文件并构建...

    在bs开发中经常用到的javaScript技术整理.doc

    - **树型结构展示**:使用不同技术(如ASP、XML、Java等)实现树状数据结构的可视化。 - **无边框效果**:创建没有边框的元素,如按钮、图像等,以达到更现代的设计风格。 - **连动下拉框**:下拉框之间相互关联,...

    dhtmlxTree v.3.0

    DhtmlxTree是一款功能强大的JavaScript组件,主要用于在Web应用程序中构建交互式的树状结构。它允许用户以灵活的方式展示和操作层次化的数据,适用于菜单系统、文件目录浏览、组织结构展示等多种场景。在v.3.0版本中...

    android多级文件管理

    深度导航允许用户深入文件系统的树状结构,而面包屑导航则帮助用户跟踪他们在哪个层级,以及轻松返回上一级。这种设计符合用户的直观操作习惯,提高了用户体验。 在Android中实现多级文件管理通常涉及以下关键知识...

    javapms门户网站源码

    页面模板控制前台页面所展示出来的显示效果,点击“系统管理”左侧功能菜单里的“模板管理”,所有模板都按页面类型树状显示,如下图所示: 点击某个模板末级节点,可以查看模板详细html代码,对模板进行编辑修改...

    dbeaver-ce-21.2.2-win32.win32.x86_64.zip

    同时,它提供了一个结果集查看器,可以以表格、树状或文本形式显示查询结果。 5. **数据浏览和管理**:用户可以通过DBeaver查看和操作DB2数据库中的表、视图、索引和其他对象。可以进行数据的添加、修改、删除操作...

    1.5api-part1

    Java 1.5 API,也被称为Java SE 5.0,是Java开发工具包的一个重要版本,它引入了许多新特性,增强了语言的功能性和效率。这个API文档提供了详细的类和接口说明,帮助开发者理解和使用Java 1.5中的新功能。 在压缩包...

    cedet-1.0&ecb-2.32

    1. ** 源代码浏览器**: 可以在独立的窗口中显示函数、类和变量的树状结构,方便快速定位和导航。 2. ** 搜索和替换**: 在ECB窗口中进行搜索,可以在整个项目范围内查找和替换文本。 3. ** 编辑器缓冲区管理**: 显示...

Global site tag (gtag.js) - Google Analytics