下面是我写的关于继承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)
我查了很久都没查出是什么问题,哪位高手能帮我解答一下,附件中有完整的程序代码文件
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)
我查了很久都没查出是什么问题,哪位高手能帮我解答一下,附件中有完整的程序代码文件
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;
}
}
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);
}
}
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);
}}