有以下问题:
1、tree没有生成一个实例
//NullPointerExecption Error Message
 tree.addMouseListener(m1);
至少需要:tree=new JTree()
但这样也不对
修改了一下:
 ////////////////////////////////////
 tree=new JTree(treeModel);
 tree.addMouseListener(m1);
 tree.setFont(new Font("Dialog",Font.BOLD,12)); //从init中移过来
 c.add(tree,BorderLayout.CENTER);
 /////////////////////////////////////
即现在init中生成treeModel
然后生成tree
最后加入到frame中2、在init中生成treeModel的问题
同样treeModel没有生成实例
在private void buildTree(File f,DefaultMutableTreeNode parent,int where)
方法中加入一下判断treeModel是否为空对象:
  DefaultMutableTreeNode n=new DefaultMutableTreeNode(f.toString());
  if(treeModel==null)
   treeModel=new DefaultTreeModel(n);
  else
  treeModel.insertNodeInto(n,parent,where);
3、多个驱动器问题
原代码为:
File[] list=File.listRoots();
但有问题,而且读所有文件时间实在是..............
所以暂时改成仅读f盘(俺机器此盘文件最少了,所以时间不算长)
File[] list= new File[1];//File.listRoots();
list[0]=new File("f:\\");
经过以上修改,可以生成f盘的树了至于遍历所有驱动器么,等高人把import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.tree.*;
import java.io.*;
//*Programe Body
class DirectTree extends JFrame implements ActionListener
{//* Definition variable 
private JCheckBox box;
private JTree tree;
private DefaultMutableTreeNode root;
private DefaultTreeModel treeModel;
private JPanel controls;
private String file;
private static final String closeString="close";
private static final String showString="Show Details";//*programe`s body:
public DirectTree()
{
  super("DirectTree Assistance");
Container c=super.getContentPane();
root=new DefaultMutableTreeNode("Disks");
//for example what`s means:
MouseListener m1=new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
if(box.isSelected())
showDetails(tree.getPathForLocation(e.getX(),e.getY()));
    }

    }; //NullPointerExecption Error Message
 buildTree();
 controls=new JPanel();
 box=new JCheckBox(showString);
 init();
 c.add(controls,BorderLayout.NORTH); ////////////////////////////////////
 tree=new JTree(treeModel);
 tree.addMouseListener(m1);
 tree.setFont(new Font("Dialog",Font.BOLD,12));  //´ÓinitÖÐÒƹýÀ´
 c.add(tree,BorderLayout.CENTER);
 /////////////////////////////////////
 setVisible(true);
 
 }
 public void actionPerformed(ActionEvent e)
 {
  if(e.getActionCommand().equals(closeString))
   //System.exit(0);
   this.dispose();
  }
  private void init()
  {
  
   controls.add(box);
   addButton(closeString);
   controls.setBackground(Color.LIGHT_GRAY);
   controls.setLayout(new FlowLayout());
   setSize(400,400);
  }
  private void addButton(String n)
  {
   Button bt=new Button(n);
   bt.setFont(new Font("Dialog",Font.BOLD,12));
   bt.addActionListener(this);
   controls.add(bt);
  }
  private void buildTree()
  {
  
   File[] list= new File[1];//File.listRoots();
   list[0]=new File("f:\\");
   //System.out.println(list.length);
   for(int i=0;i<list.length;i++)
    if(list[i].exists())
       buildTree(list[i],root,i);
  }
  
 private void buildTree(File f,DefaultMutableTreeNode parent,int where)
 {
  DefaultMutableTreeNode n=new DefaultMutableTreeNode(f.toString());
  //////////////////////////
  if(treeModel==null)
   treeModel=new DefaultTreeModel(n);
  else
  treeModel.insertNodeInto(n,parent,where);
  /////////////////////////
 
  //System.out.println(f.toString());
  if(f.isDirectory())
  {
  String[] list=f.list();
  for(int i=0;i<list.length;i++)
  buildTree(new File(f,list[i]),n,i);
  }
 }
  private void showDetails(TreePath p)
  {
  if(p==null)
  return;
  File f=new File(p.getLastPathComponent().toString());
  JOptionPane.showMessageDialog(this,f.getPath()+"\n "+getAttributes(f));
 
  }
  private String getAttributes(File f)
  {
   String t="";
   if(f.isDirectory())
    t+="Directory";
   else
    t+="Nondirectory file";
   t+="\n ";
   if(!f.canRead())
      t+="not ";
      t+="Readable\n";
    if(!f.canWrite())
      t+="not ";
      t+="Writeable\n";
    if(!f.isDirectory())
      t+="Size in bytes:"+f.length()+"\n ";
    else
    { t+=" Contains files: \n  ";
     String[] contents=f.list();
     for(int i=0;i<contents.length;i++)
       t+=contents[i]+",";
       t+="\n"; 
    }
    return t; 
   }
  }
  

解决方案 »

  1.   

    1、
    private void buildTree()
    {
      
       File[] list=File.listRoots();
       for(int i=0;i<list.length;i++)
        if(list[i].exists()){
                 //将buildTree(list[i],root,i); 改为,即根磁盘应该加在0位置
           buildTree(list[i],root,0);  
    }
    }2、加一句
     private void buildTree(File f,DefaultMutableTreeNode parent,int where)
     {
      DefaultMutableTreeNode n=new DefaultMutableTreeNode(f.toString());
      //////////////////////////
      if(treeModel==null){
       treeModel=new DefaultTreeModel(parent);
       treeModel.insertNodeInto(n,parent,where); //加一句
      }
      else
      treeModel.insertNodeInto(n,parent,where);
             ........
    }经过以上修改,磁盘树可以出来,至于其他功能没有验证
    此外,如果你的硬盘文件多的话,注意你的内存是否能承受住
    (我硬盘上有50G内容,机器没死也差不多了,我试验代码如下:
      private void buildTree()
      {
      
       File[] list= new File[2];//File.listRoots();
       list[0]=new File("c:\\");
       list[1]=new File("f:\\");
       //System.out.println(list.length);
       for(int i=0;i<list.length;i++)
        if(list[i].exists()){
           buildTree(list[i],root,0);
      }
      即仅测试c和f盘
      应该考虑优化,点击后再动态生成子树,可能楼主本意如此,再改改吧