前两个类用来返回一颗目录树,代码可以不管,主类实现在JFrame上显示C盘目录树,但是出来只有前两级目录,大牛帮忙解决~import javax.swing.*;
import java.io.*;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.tree.*;
import java.util.logging.Level;
import java.util.logging.Logger;class MyNode extends DefaultMutableTreeNode{
    private boolean explored = false;
    public MyNode(File file){
        setUserObject(file);
    }    public boolean getAllowChildren(){
        return isDirectory();
    }    public boolean isLeaf(){
        return !isDirectory();
    }    public File getFile(){
        return (File)getUserObject();
    }    public boolean isExplored(){
        return explored;
    }    public boolean isDirectory(){
        File file = getFile();
        return file.isDirectory();
    }    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 String getString(){
        File file = getFile();
        String filename = file.getAbsolutePath();
        return filename;
    }    public void explore(){
        if(!isDirectory()){
            return;
        }
        if(!isExplored()){
            File file = getFile();
            File child[] = file.listFiles();
            for(int i=0;i<child.length;i++){
                add(new MyNode(child[i]));
                /*if(children[i].isDirectory()){
                    add(new MyNode(children[i]));
                }*/
            }
            explored = true;
        }
    }
}
class GetFileTree implements Serializable{
    public JTree jtree;
    public JTree getTree(File file){
        MyNode filenod = new MyNode(file);
        filenod.explore();
        jtree = new JTree(new DefaultTreeModel(filenod));
        jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        jtree.setShowsRootHandles(true);
        jtree.addTreeExpansionListener(new TreeExpansionListener(){            public void treeExpanded(TreeExpansionEvent e) {
                TreePath treePath = e.getPath();
                MyNode node = (MyNode)treePath.getLastPathComponent();
                if(!node.isExplored()){
                    DefaultTreeModel model = (DefaultTreeModel)jtree.getModel();
                    node.explore();
                    model.nodeStructureChanged(node);
                }
            }
            public void treeCollapsed(TreeExpansionEvent event) {}
        });
        return jtree;
    }
    
    GetFileTree(){}    public GetFileTree(String filename){
        jtree = getTree(new File(filename));
    }
}
public class Main extends JFrame{
    public void writeTree(String f){
        GetFileTree tree = new GetFileTree("C:");
        FileOutputStream fout = null;
        try {
            fout = new FileOutputStream(f);
        } catch (FileNotFoundException ex) {}
        ObjectOutputStream out = null;
        try {
            out = new ObjectOutputStream(fout);
        } catch (IOException ex) {}
        try {
            out.writeObject(tree);
        } catch (IOException ex) {}
        try {
            out.close();
        } catch (IOException ex) {}
    }    public GetFileTree readTree(){
        GetFileTree tree = null;
        FileInputStream fin=null;
        ObjectInputStream in = null;
        try {
            fin = new FileInputStream("C:/b.ser");
            try {
                in = new ObjectInputStream(fin);
                try {
                    tree = (GetFileTree) in.readObject();
                    in.close();
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        return tree;
    }    Main(){
        writeTree("C:/b.ser");
        GetFileTree filetree = readTree();
        
        this.add(filetree.jtree);
        this.setSize(200, 200);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args) throws FileNotFoundException, IOException {
        // TODO code application logic here
        new Main();
    }}

解决方案 »

  1.   

    你用Listener构建的树结构,Listener是不会被序列化,需要重新注册代码如下:
    package testSeri;import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.Point;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeExpansionEvent;
    import javax.swing.event.TreeExpansionListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeSelectionModel;class MyNode extends DefaultMutableTreeNode {
    private static final long serialVersionUID = -8434141668243898120L; private boolean explored = false; public MyNode(File file) {
    setUserObject(file);
    } public boolean getAllowChildren() {
    return isDirectory();
    } public boolean isLeaf() {
    return !isDirectory();
    } public File getFile() {
    return (File) getUserObject();
    } public boolean isExplored() {
    return explored;
    } public boolean isDirectory() {
    File file = getFile();
    return file.isDirectory();
    } 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 String getString() {
    File file = getFile();
    String filename = file.getAbsolutePath();
    return filename;
    } public void explore() {
    if (!isDirectory()) {
    return;
    }
    if (!isExplored()) {
    File file = getFile();
    File child[] = file.listFiles();
    if (child != null) {
    for (int i = 0; i < child.length; i++) {
    add(new MyNode(child[i]));
    /*
     * if(children[i].isDirectory()){ add(new
     * MyNode(children[i])); }
     */
    }
    }
    explored = true;
    }
    }
    }class GetFileTree implements Serializable {
    private static final long serialVersionUID = 8170640449283675414L; public JTree jtree; public JTree getTree(File file) {
    MyNode filenod = new MyNode(file);
    filenod.explore();
    jtree = new JTree(new DefaultTreeModel(filenod));
    jtree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
    jtree.setShowsRootHandles(true);
    jtree.addTreeExpansionListener(new TreeExpansionListener() { public void treeExpanded(TreeExpansionEvent e) {
    TreePath treePath = e.getPath();
    MyNode node = (MyNode) treePath.getLastPathComponent();
    if (!node.isExplored()) {
    DefaultTreeModel model = (DefaultTreeModel) jtree.getModel();
    node.explore();
    model.nodeStructureChanged(node);
    }
    } public void treeCollapsed(TreeExpansionEvent event) {
    }
    });
    return jtree;
    } public GetFileTree() {
    } public GetFileTree(String filename) {
    jtree = getTree(new File(filename));
    }
    }public class Main extends JFrame {
    private static final long serialVersionUID = 8175264375113141915L; public void writeTree(String f) {
    GetFileTree tree = new GetFileTree("C:\\3\\");
    FileOutputStream fout = null;
    ObjectOutputStream out = null;
    try {
    fout = new FileOutputStream(f);
    out = new ObjectOutputStream(fout);
    out.writeObject(tree);
    out.flush();
    } catch (IOException ex) {
    ex.printStackTrace();
    } finally {
    try {
    out.close();
    fout.close();
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
    } public GetFileTree readTree() {
    FileInputStream fin = null;
    ObjectInputStream in = null;
    try {
    fin = new FileInputStream("C:/b.ser");
    in = new ObjectInputStream(fin);
    final GetFileTree tree = (GetFileTree) in.readObject();
    tree.jtree.addTreeExpansionListener(new TreeExpansionListener() { public void treeExpanded(TreeExpansionEvent e) {
    TreePath treePath = e.getPath();
    MyNode node = (MyNode) treePath.getLastPathComponent();
    if (!node.isExplored()) {
    DefaultTreeModel model = (DefaultTreeModel) tree.jtree.getModel();
    node.explore();
    model.nodeStructureChanged(node);
    }
    } public void treeCollapsed(TreeExpansionEvent event) {
    }
    });
    return tree;
    } catch (Exception ex) {
    ex.printStackTrace();
    } finally {
    try {
    in.close();
    fin.close();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    return null;
    } public Main() {
    writeTree("C:/b.ser");
    GetFileTree filetree1 = readTree();
    GetFileTree filetree2 = new GetFileTree("C:\\3\\");
    this.getContentPane().setLayout(new GridLayout(2, 1));
    this.getContentPane().add(new JScrollPane(filetree1.jtree));
    this.getContentPane().add(new JScrollPane(filetree2.jtree));
    this.setLocation(new Point(350, 200));
    this.setSize(new Dimension(500, 500));
    this.setVisible(true);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } public static void main(String[] args) throws FileNotFoundException, IOException {
    new Main();
    }}
      

  2.   

    真的可以了,太强了,我都不知问了多少人了,太谢谢了!我给怎么给你分呢?对了,我是Java初学者,能交个朋友吗?希望能像你多多学习。我的QQ是879320401
      

  3.   

    不过你说的我还是不大懂,你说“你用Listener构建的树结构,Listener是不会被序列化,需要重新注册 
    ”中用Listener构建是什么意思?还有为啥Listener不会被序列化?而且JTree不是本身就已经实现序列化接口了嘛?
      

  4.   

    建树的方法很多种,你以node建树的,在Listener里你call了explore方法将树建成而TreeExpansionListener是个EventListener,是没有继承Serializable的,可能是因为java觉得事件监听有时效性,不应当被序列化你结帖我就有分了
      

  5.   

    方法还是挺多的
    import java.io.File;
    import java.util.Iterator;
    import java.util.Vector;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.TreeModelEvent;
    import javax.swing.event.TreeModelListener;
    import javax.swing.event.TreeSelectionEvent;
    import javax.swing.event.TreeSelectionListener;
    import javax.swing.tree.TreeModel;
    import javax.swing.tree.TreePath;public class FileTree extends JFrame { private JTree fileTree; private FileSystemModel fileSystemModel; public FileTree(String directory) {
    super("JTree FileSystem Viewer");
    fileSystemModel = new FileSystemModel(new File(directory));
    fileTree = new JTree(fileSystemModel);
    fileTree.setEditable(true);
    fileTree.addTreeSelectionListener(new TreeSelectionListener() {
    public void valueChanged(TreeSelectionEvent event) {
    File file = (File) fileTree.getLastSelectedPathComponent();
    }
    });
    add(new JScrollPane(fileTree));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(640, 480);
    setVisible(true);
    } public static void main(String args[]) {
    new FileTree("c:/");
    }}class FileSystemModel implements TreeModel {
    private File root; private Vector listeners = new Vector(); public FileSystemModel(File rootDirectory) {
    root = rootDirectory;
    } public Object getRoot() {
    return root;
    } public Object getChild(Object parent, int index) {
    File directory = (File) parent;
    String[] children = directory.list();
    return new TreeFile(directory, children[index]);
    } public int getChildCount(Object parent) {
    File file = (File) parent;
    if (file.isDirectory()) {
    String[] fileList = file.list();
    if (fileList != null)
    return file.list().length;
    }
    return 0;
    } public boolean isLeaf(Object node) {
    File file = (File) node;
    return file.isFile();
    } public int getIndexOfChild(Object parent, Object child) {
    File directory = (File) parent;
    File file = (File) child;
    String[] children = directory.list();
    for (int i = 0; i < children.length; i++) {
    if (file.getName().equals(children[i])) {
    return i;
    }
    }
    return -1; } public void valueForPathChanged(TreePath path, Object value) {
    File oldFile = (File) path.getLastPathComponent();
    String fileParentPath = oldFile.getParent();
    String newFileName = (String) value;
    File targetFile = new File(fileParentPath, newFileName);
    oldFile.renameTo(targetFile);
    File parent = new File(fileParentPath);
    int[] changedChildrenIndices = { getIndexOfChild(parent, targetFile) };
    Object[] changedChildren = { targetFile };
    fireTreeNodesChanged(path.getParentPath(), changedChildrenIndices,
    changedChildren); } private void fireTreeNodesChanged(TreePath parentPath, int[] indices,
    Object[] children) {
    TreeModelEvent event = new TreeModelEvent(this, parentPath, indices,
    children);
    Iterator iterator = listeners.iterator();
    TreeModelListener listener = null;
    while (iterator.hasNext()) {
    listener = (TreeModelListener) iterator.next();
    listener.treeNodesChanged(event);
    }
    } public void addTreeModelListener(TreeModelListener listener) {
    listeners.add(listener);
    } public void removeTreeModelListener(TreeModelListener listener) {
    listeners.remove(listener);
    } private class TreeFile extends File {
    public TreeFile(File parent, String child) {
    super(parent, child);
    } public String toString() {
    return getName();
    }
    }
    }
      

  6.   

    这个方法也看不大懂,我还属于菜鸟级别。现在又遇到一个问题,用socket传送jtree时,在本地上,就是ip为127.0.0.1的时候客户端可以得到服务器传过来的树,但是当客户端和服务器不是在同一台机器上的时候就得不到树,这是为啥?望两位大侠继续指导,感激不尽!
      

  7.   


    socket连接和传送的代码?代码问题或者网络问题