现在的位置: 首页 > 综合 > 正文

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

2018年04月26日 ⁄ 综合 ⁄ 共 8972字 ⁄ 字号 评论关闭

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

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

}

 

抱歉!评论已关闭.