下面是我写的关于继承JTree的程序,是用于显示系统文件夹import java.awt.Component;
import java.io.File;
import javax.swing.Icon;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
public class FileTree extends JTree{ static final long serialVersionUID = 0L;

private FileList theList;
private FileSystemView fsView;

public FileTree(FileList list) {
theList = list;

fsView = FileSystemView.getFileSystemView();
File root = fsView.getHomeDirectory();
FileNode node = new FileNode(root);
node.explore();
this.setModel(new DefaultTreeModel(node));

this.setCellRenderer(new FileRenderer());
}
public void fireValueChanged(TreeSelectionEvent e) {
        TreePath path = e.getNewLeadSelectionPath();
        Object nod =  path.getLastPathComponent();        theList.fireTreeSelectionChanged((FileNode) nod);
    }
}
class FileNode extends DefaultMutableTreeNode{

static final long serialVersionUID = 0l;

private FileSystemView view;
private File theFile;
private boolean explo = true;
private File[] all;

public FileNode(File file) {
theFile = file;

view = FileSystemView.getFileSystemView();

this.setUserObject(file);
}
public Icon getIcon() {
return view.getSystemIcon(theFile);
}
public boolean isExplore() {
File[] children = getFile().listFiles();
if(children.length == 0)
return false;
else
{
for(int i = 0;i < children.length;i++)
if(children[i].isDirectory())
return true;
return false;
}
}
public void explore() {
if(!isDirectory())
return;
if(isExplore() && explo)
{
//File file = getFile();
File[] children1 = getFile().listFiles();
for(int i = 0;i < children1.length;i++)
{
if(children1[i].isDirectory())
{
this.add(new FileNode(children1[i]));
}
}
}
explo = false;
}
public File getFile() {
return (File) this.getUserObject();
}
public boolean isDirectory() {
File file = getFile();
return file.isDirectory();
}
public String getString() {
File file = getFile();
String path = file.getAbsolutePath();
return path;
}
public String toString() {
        File file = getFile();
        String filename = file.toString();
        int index = filename.lastIndexOf("\\");
        return (index != -1 && index != filename.length() - 1) ? filename.substring(index + 1) : filename;
    }
public boolean isLeaf() {
        return !isExplore();
    }
public FileNode getChild(int index) {
all = getFile().listFiles();
if(all != null)
return new FileNode(all[index]);
else return null;
}
public int getChildCount() {
all = getFile().listFiles();
if(all != null)
return all.length;
else return 0;
}
}
class FileRenderer extends DefaultTreeCellRenderer {
static final long serialVersionUID = 2l;
public Component getTreeCellRendererComponent(JTree tree, Object value,            boolean sel, boolean expanded, boolean leaf, int row,            boolean hasFocus) {
   FileNode node = (FileNode) value;        Icon icon = node.getIcon();           this.setLeafIcon(icon);         this.setOpenIcon(icon);         this.setClosedIcon(icon);           return super.getTreeCellRendererComponent(tree, value, sel, expanded,               leaf, row, hasFocus);
}
}执行程序中显示的是this.add(new FileNode(children1[i]));这句越界,抛出的异常提示是
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 64 > 0
at java.util.Vector.insertElementAt(Unknown Source)
at javax.swing.tree.DefaultMutableTreeNode.insert(Unknown Source)
at javax.swing.tree.DefaultMutableTreeNode.add(Unknown Source)
at FileNode.explore(FileTree.java:80)
at FileTree.<init>(FileTree.java:26)
at GUI.<init>(FileExplorer.java:59)
at FileExplorer.<init>(FileExplorer.java:32)
at FileExplorerTester.main(FileExplorerTester.java:11)
我查了很久都没查出是什么问题,哪位高手能帮我解答一下,附件中有完整的程序代码文件

解决方案 »

  1.   

    不知为什么附件没加上去,我在这里把其他文件的代码附上import java.awt.Color;
    import java.awt.Component;import javax.swing.DefaultListModel;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.ListCellRenderer;
    public class FileList extends JList{ static final long serialVersionUID = 0L;

    private FileListModel dataModel;

    public FileList() {
    dataModel = new FileListModel();
    this.setModel(dataModel);
    this.setCellRenderer(new FileCellRenderer());
    }
     public void fireTreeSelectionChanged(FileNode node) {
            dataModel.setNode(node);
            this.updateUI();
        }
    }
    class FileListModel extends DefaultListModel {

    static final long serialVersionUID = 1l;

    private FileNode node;

    public void setNode(FileNode node) {
    this.node = node;
    }
    public Object getElementAt(int index) {
    if(node != null)
    return node.getChild(index);
    return null;
    }
    public int getSize() {
    if(node != null)
    return node.getChildCount();
    return 0;
    }
    }
    class FileCellRenderer extends JLabel implements ListCellRenderer {

    static final long serialVersionUID = 3l;

     public FileCellRenderer() {
            this.setOpaque(true);
        }

    public Component getListCellRendererComponent(
            JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
    FileNode node = (FileNode) value;

    this.setIcon(node.getIcon());
    this.setText(node.toString());
    this.setBackground(isSelected?Color.blue.darker().darker():Color.white);
    this.setForeground(isSelected ? Color.WHITE : Color.BLACK);
    return this;
    }

    }
      

  2.   

    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JSplitPane;
    import javax.swing.border.BevelBorder;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreePath;
    public class FileExplorer extends JFrame{

    static final long serialVersionUID = 0L;

    Container container;
    public FileExplorer()
    {
    container = getContentPane();

    setSize(800,600);

    double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
    double hight = Toolkit.getDefaultToolkit().getScreenSize().getHeight();

    setLocation((int) (width - (double) this.getSize().width)/2 , (int) (hight - (double) this.getSize().height)/2);

    GUI gui = new GUI();

    this.add(gui);

    this.setVisible(true);
    }
    }
    class GUI extends JPanel {

    static final long serialVersionUID = 1L;

    final int TREE_WIDTH = 200;
    final int LIST_WIDTH = 300;
    final int HIGHT = 300;

    private FileTree tree;

    public GUI()
    {
    this.setBorder(new BevelBorder(BevelBorder.RAISED));

    this.setLayout(new BorderLayout());

    FileList list = new FileList();
    JScrollPane listView = new JScrollPane(list);
    listView.setPreferredSize(new Dimension(LIST_WIDTH,HIGHT));

    tree = new FileTree(list);
    tree.addTreeExpansionListener(
    new TreeExpansionListener()
    {
    public void treeCollapsed(TreeExpansionEvent e){}
    public void treeExpanded(TreeExpansionEvent e)
    {
    TreePath path = e.getPath();
    FileNode nod = (FileNode) path.getLastPathComponent();
    if(nod.isExplore())
    {
    DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
    nod.explore();
    model.nodeStructureChanged(nod);
    }
    }
    });
    JScrollPane treeView = new JScrollPane(tree);
    treeView.setPreferredSize(new Dimension(TREE_WIDTH,HIGHT));

    JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,treeView,listView);
    split.setDividerLocation(300);
    split.setDividerSize(10);

    this.add(split);
    }
    }
      

  3.   

    import javax.swing.JFrame;
    public class FileExplorerTester { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    FileExplorer explorer = new FileExplorer();
    explorer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }}
      

  4.   

    说明下吧,这是一个简单的windows资源管理器,这些代码的功能是在于jtree的继承类FileTree是用于读取文件夹,jlist得继承类FileList是用于读取FileTree中文件夹内的文件