您的位置:首页 > 编程语言 > Java开发

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

2008-02-17 12:33 567 查看
应网友要求,重新书写了代码,请参考使用。旧代码毅然保留,在文章的后半部

此最新代码增加了对下拉列表的输出支持,可以直接使用在<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(" ", ""));


  }


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐