免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 943 | 回复: 0
打印 上一主题 下一主题

增强版JAVA实现文本形式的树状结构显示 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-23 19:46 |只看该作者 |倒序浏览

源地址:
http://blog.csdn.net/java2000_net/archive/2008/02/17/2100448.aspx

应网友要求,重新书写了代码,请参考使用。旧代码毅然保留,在文章的后半部
此最新代码增加了对下拉列表的输出支持,可以直接使用在里面
同时可以访问父节点和兄弟节点。

package net.java2000.tools;


import java.util.ArrayList;

import java.util.List;



/** *//**

* 树状结构的文本显示和下拉框显示。

* 转载请保留本说明,并注明出处

* www.java2000.net

* blog.csdn.net/java2000_net/

*

* @version 2008.02.23

* @author 赵学庆

*/


public class ForumFolder ...{

  // 编号

  private long id;


  // 标题

  private String title;


  // 下级列表

  private ListForumFolder> children = new ArrayListForumFolder>();


  // 上级,顶层为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;

  }



  /** *//**

   * 增加一个下属。

   * 自动对应上级和兄弟结点

   *

   * @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 下拉列表的字符串。可以直接放到里面

   */


  public String getOption(long selectedId) ...{

    return "" + toStringOption("", "", selectedId);

  }



  /** *//**

   * 输出为Text的方法。

   * 应网友建议,更改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 ListForumFolder> 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 + "");

    b.append(" ");


    if (children.size() > 0) ...{


      for (int i = 0; i  children.size() - 1; i++) ...{

        b.append("" + children.get(i).getId() + "'" + (idSelected == children.get(i).getId() ? " selected" : "")

            + ">" + lftStr + children.get(i).toStringOption(lftStr + "│", "├", idSelected));

      }

      b.append("" + 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
菜单列表
├开始菜单
│├程序
││└附件
││ ├娱乐
││ └娱乐2
│└辅助工具
├My Documents
└My Documents2
娱乐
附件
原文出处:
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 ListFolder> children = new ArrayListFolder>();



    public void addChild(Folder f) ...{

        children.add(f);

    }



    public ListFolder> getChildren() ...{

        return children;

    }



    public void setChildren(ListFolder> 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(" ", ""));

  }

}



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/54409/showart_482717.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP