应网友要求,重新书写了代码,请参考使用。旧代码毅然保留,在文章的后半部 此最新代码增加了对下拉列表的输出支持,可以直接使用在<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(" ", "")); } }