我想实现一个文件夹自由伸展功能。比如我们打开资源管理器时,点击右边
的“加号”,就能伸展出来。再点就缩回去!!
没办法,无法贴图片,只能生硬的描述了!
用什么方法能够实现这个功能~~

解决方案 »

  1.   

    http://www.cnlei.org/mycode/CNLTreeMenu/Ver1.0.2/index.html
    看看这个
      

  2.   

    http://java.sun.com/docs/books/tutorial/uiswing/components/tree.html
    sun公司的关于JTree的帮助文档,不过是英文版的(目前还没有中文版),感兴趣可以看一下。
    用File类获得每个文件夹下的文件和文件夹,加入到JTree控件中就可以实现楼主所要的功能
      

  3.   

    import javax.swing.*;
    import javax.swing.tree.*;class tree extends JFrame
    {
    //DefaultTreeCellEditor dt;
    //DefaultTreeCellRenderer r = new DefaultTreeCellRenderer();

    JPanel panel = new JPanel();
    String s[][] = {{"a","s"},{"w","f","m"}};
    //String s[] = {"1","2"};
    tree()
    {
    JTree tree = new JTree();

    //tree.addSelectionInterval(1,0);
    //tree.addSelectionRow(2);
    panel.add(tree);

    this.add(panel);
    this.setSize(300,300);
    this.show();
    }

    public static void main(String s[])
    {
    new tree();
    }
    }
      

  4.   

    给你代码~~~~
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.*;public class TestJTree extends JFrame{ /**
     * @param args
     */
    private Container con  = null;
    private JTree tree = null;
    private FileNode root = null;
    private JSplitPane jsp = null;
    private JScrollPane jscroll = null,jsp2=null;
    private JTextArea jta = null;


    public TestJTree()
    {
      
     
      tree = new JTree(this.createTreeModel());//根据树模型创建树。树模型用于运行时动态增加树中结点时进行更新显示。
      tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
      
       con = this.getContentPane();
       jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
       con.add(jsp);
       
       jscroll = new JScrollPane();
       jscroll.getViewport().add(tree);
       
       jsp.add(jscroll);
       
       jsp2 = new JScrollPane();
       jta = new JTextArea(3,30);
       jsp2.getViewport().add(jta);
       jsp.add(jsp2);
       
       this.setTitle("JTree示例:文件目录浏览");
       this.setSize(800,600);
       tree.addTreeExpansionListener(new TreeExpanded());//树扩展与折叠事件,扩展时才真正增加树结点。
       tree.addTreeSelectionListener(//树结点选择事件。用于显示文件属性。
    new TreeSelectionListener()
    { public void valueChanged(TreeSelectionEvent e) {
    // TODO Auto-generated method stub
    FileNode o =(FileNode)tree.getLastSelectedPathComponent();//取所选择的结点
       
    if( o==null || o.isRoot() ) 
    {
       return;
    }
        File  file = (File)o.getUserObject();

    if( file == null ) return;
        jta.setText("");
        jta.append(""+(file.isFile()?"这是文件":"这是目录")+"\n");
        jta.append("文件大小:"+file.length()+"\n");
        jta.append("文件可读:"+(file.canRead()?"可读":"不可读"));
        
    }

    }


       );
       
       this.setVisible(true);
       
    }

    private void createRoots(FileNode f)
    {//在“我的电脑”下建立子结点如:c:\、d:\、等等。
    if(f.hasExpanded==false)
    {
    f.hasExpanded=true;
    File[] disks = File.listRoots();
    for(int i=0;i<disks.length;i++)
    {
    FileNode r = new FileNode(disks[i]);
    f.add(r);

    }//for(i)

    }//if

    }



    private DefaultTreeModel createTreeModel()
    {//建立树模型。
    root = new FileNode("我的电脑");
    createRoots(root);
    return new DefaultTreeModel(root);
    }
       
    public static void main(String[] args) {
    // TODO Auto-generated method stub
                new TestJTree();
                
    }
       private class TreeExpanded implements TreeExpansionListener
       { public void treeCollapsed(TreeExpansionEvent event) {
    // TODO Auto-generated method stub
    //树折叠事件。不用处理。
    } public void treeExpanded(TreeExpansionEvent event) {
    // TODO Auto-generated method stub
    //树扩展或展开事件。
    TreePath path = event.getPath();//取要展开的树结点
    FileNode o =(FileNode)path.getLastPathComponent();//取要展开的树结点

    if( o==null || o.hasExpanded || o.isRoot() )  return;

    DefaultTreeModel model = (DefaultTreeModel)tree.getModel();//获取树模型
    o.explore();//在该结点下真正增加下一层的树结点
    model.nodeStructureChanged(o);//由于树结构发生变化,由模型通知JTree的视图,进行显示画面上的更新。
    }


       }
    }
     import javax.swing.*;
    import javax.swing.tree.*;
    import java.io.*;public class FileNode extends DefaultMutableTreeNode{
     protected boolean hasExpanded = false;//是否已展开过?即是否已建立了子结点。 
    public FileNode()
    {//默认构造器
    super();
    }

    public FileNode(String myComputer)
    {
    this.setUserObject(myComputer);
    }

    public FileNode(File f)
    {
    this.setUserObject(f);
    }
     public boolean getAllowsChildren()
     {//重写:允许有儿子否?
    if(this.userObject == null ) 
    {
     return false;
    }
    if(this.userObject instanceof String ) 
    {//处理最顶层的"我的电脑"
    return true;
    }
    File f = (File)this.userObject;
    return f.isDirectory();//是目录,则允许有儿子。否则:没有
     }
     public boolean isLeaf()
     {//重写:是文件还是空的文件夹?只有文件才是叶子。空的文件夹不是叶子。
     
     if(this.userObject == null ) 
    {
     return true;
    }
     
     if(this.userObject instanceof String ) 
    {//处理最顶层的"我的电脑"
    return false;
    }
     
    File f = (File)this.userObject;
    return !f.isDirectory();//是文件则是叶子
     }
    public String toString()

    if( this.userObject==null )
    {
    return "";
    }
    if(this.userObject instanceof String ) 
    {//处理最顶层的"我的电脑"
    return ""+this.userObject;
    }
    File f = (File)this.userObject;
    String fileName = f.toString();
    int index = fileName.lastIndexOf("\\");
    return (index!=-1 && index != fileName.length()-1 )?
    fileName.substring(index+1)://取出文件名部分
    fileName; //完整路径名
    }

    public void explore()
    {//扩展儿子结点
    if(!hasExpanded)
    {//若还没有扩展
    hasExpanded = true;//设置已扩展过。
    File f = (File)this.userObject;
    File[] files  = f.listFiles();
    for(int i=0;i<files.length;i++)
    {
    FileNode r = new FileNode(files[i]);
    this.add(r);//此时才真正在树中添加结点。

    }//for(i)
    }//if

    }//explore
     
    }//class
      

  5.   

    Jtree我翻译了一部份,你可以到我的blog看看,里面的例子可以直接跑