我要做类似于我的电脑的资源管理器,但是不我展开节点的时候都不发生变化,高手教教我怎么弄啊。
tree.addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) {
TreePath path = e.getPath();
File[] f;

File temp = new File(path.getLastPathComponent().toString());
f=temp.listFiles();
DefaultMutableTreeNode tempnode = new DefaultMutableTreeNode(temp);
getFileDirs(tempnode,path.toString());
tree.updateUI();
}
});public void getFileDirs(DefaultMutableTreeNode par_node, String par_file) {
//JOptionPane.showMessageDialog(jf, "OK");
File[] parentdir;
File parentfile = new File(par_file);
parentdir = parentfile.listFiles();
try {
if (parentfile.isDirectory()) {
for (int j = 0; j < parentdir.length; j++) {
if (parentdir[j].isDirectory()) {
DefaultMutableTreeNode parentnode = new DefaultMutableTreeNode(
parentdir[j].getName().toString());
par_node.add(parentnode);
File[] subdir;
File subfile = new File(parentdir[j].getAbsolutePath());
subdir = subfile.listFiles();
for (int k = 0; k < subdir.length; k++) {
if (subdir[k].isDirectory()) {
DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(
subdir[k].getName().toString());
parentnode.add(subnode);
//找出全部,递归调用
//getFileDirs(subnode,subdir[k].toString());
}
}
} else {

}
} } else {
// 在list中显示出文件的列表,显示的是第一级的文件
}
} catch (NullPointerException e) { }
}
如果我递归的话就能全部找出来,但是我在数展开的时候调用的函数就没用。帮帮忙啊。我急啊

解决方案 »

  1.   

    哦,你采用的事动态添加子节点,也就是分级添加的方式。那么,有以下几个问题:
    第一,你采用的是 向节点添加子节点的方式。那么,当你添加完毕之后,要通知树进行刷新。你不刷新,这时候尽管后台数据已经更新,但是你的前台是看不到效果的。
    第二,我建议你使用TreeModel。添加节点也不要使用直接添加,而要使用model提供的方法。这样不必你强制刷新。jdk的文档上描述如下:
    public void insertNodeInto(MutableTreeNode newChild,
                               MutableTreeNode parent,
                               int index)对它进行调用,以便在父节点的子节点中的 index 位置插入 newChild。然后,通知 nodesWereInserted 创建适当的事件。这是添加子节点的首选方法,因为它将创建适当的事件。 
    尽量采用这样的方式。
    第三,如果你要做资源管理器的分级展开,那么强烈建议使用model。model本身所实现的就是一种动态的分级展开。而且不必你自己处理监听。当然,我不是说不可以。最后,你的代码不全,我无法运行得到你所说的问题。以上意见仅仅针对读你的代码提出。
      

  2.   

    哇,太感谢楼上给我提的意见和建议了。你可不可以给我一个大概的思路和框架,因为我是刚从C#转JAVA,对这个语言还有很多的不了解,谢谢
      

  3.   

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.tree.*;
    import javax.swing.event.*;
    import javax.swing.JFrame;
    import java.io.File;
    import java.io.IOException;public class SimpleJTree {
    private JFrame jf;
    private JPanel treepanel, listpanel;
    private JTree tree;
    private JList list;
    private static String filepath;
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("My Computer",
    true);

    public SimpleJTree() {
    jf = new JFrame("资源管理器");
    String[] data = { "1", "2", "3" };
    list = new JList(data); treepanel = new JPanel();
    listpanel = new JPanel();
    treepanel.setLayout(new BoxLayout(treepanel, BoxLayout.X_AXIS));
    treepanel.setPreferredSize(new Dimension(200, 300));
    listpanel.setLayout(new BoxLayout(listpanel, BoxLayout.X_AXIS));
    listpanel.setPreferredSize(new Dimension(300, 300)); // 显示本地磁盘驱动器
    getLocalDrivers();

    tree = new JTree(root);
    tree.addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) {
    TreePath path = e.getPath();
    File[] f;
    File temp = new File(path.getLastPathComponent().toString());
    f=temp.listFiles();
    DefaultMutableTreeNode tempnode = new DefaultMutableTreeNode(temp.getAbsolutePath());
    //JOptionPane.showMessageDialog(jf,temp.getAbsoluteFile().toString());
    getFileDirs(tempnode,temp.getAbsoluteFile().toString());
    tree.updateUI();
    }
    });


    showMe(); } public void showMe(){

    treepanel.add(new JScrollPane(tree));
    listpanel.add(new JScrollPane(list));
    jf.setLayout(new FlowLayout());
    jf.add(treepanel);
    jf.add(listpanel);
    jf.setLayout(new FlowLayout());
    jf.setName("资源管理器");
    jf.setSize(520, 340);
    jf.setVisible(true);
    jf.setDefaultCloseOperation(jf.EXIT_ON_CLOSE);

    }

    public void getLocalDrivers() {
    File[] localDrivers;
    File driverfile = new File("");
    localDrivers = driverfile.listRoots();
    for (int i = 0; i < localDrivers.length; i++) {
    DefaultMutableTreeNode rootnode = new DefaultMutableTreeNode(
    localDrivers[i].toString());
    root.add(rootnode);
    //JOptionPane.showMessageDialog(jf, localDrivers[i].toString());
    getFileDirs(rootnode, localDrivers[i].toString());
    } } public void getFileDirs(DefaultMutableTreeNode par_node, String par_file) {
    //JOptionPane.showMessageDialog(jf, "OK");
    File[] parentdir;
    File parentfile = new File(par_file);
    parentdir = parentfile.listFiles();
    try {
    if (parentfile.isDirectory()) {
    for (int j = 0; j < parentdir.length; j++) {
    if (parentdir[j].isDirectory()) {
    DefaultMutableTreeNode parentnode = new DefaultMutableTreeNode(
    parentdir[j].getName().toString());
    par_node.add(parentnode);
    File[] subdir;
    File subfile = new File(parentdir[j].getAbsolutePath());
    subdir = subfile.listFiles();
    for (int k = 0; k < subdir.length; k++) {
    if (subdir[k].isDirectory()) {
    DefaultMutableTreeNode subnode = new DefaultMutableTreeNode(
    subdir[k].getName().toString());
    parentnode.add(subnode);
    //找出全部,递归调用
    //getFileDirs(subnode,subdir[k].toString());
    }
    }
    } else {
    // 第二级只是多找的目录,而不是文件

    }
    } } else {
    // 在list中显示出文件的列表,显示的是第一级的文件
    }
    } catch (NullPointerException e) { }
    } /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new SimpleJTree();
    }}
      

  4.   

    天~~看来我说错了……
    你是想要一次全部读出啊?这样的话,启动速度可以说相当迟缓,且占用了大量的资源。这是大忌!!
    而且你的getFileDirs做了什么?你为何要几处调用?且自身还要放到一个嵌套的循环里面递归调用?
    getFileDirs这个函数本身就有很大的问题,而你的调用更是存在相当大的逻辑问题。你的思路实在是有很大的问题。你的程序,我几乎没办法更改。与其更改不如我重新写一遍。也许你对swing里面的机制还不是非常的熟悉。那么,这样我给你一段代码,也许你能明白一些。import java.awt.Component;
    import java.io.File;
    import java.io.FileFilter;
    import java.util.HashMap;
    import java.util.Map;import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.event.TreeModelListener;
    import javax.swing.filechooser.FileSystemView;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeCellRenderer;
    import javax.swing.tree.TreeModel;
    import javax.swing.tree.TreePath;public class FileTree extends JTree {
    static class FileTreeCellRenderer extends DefaultTreeCellRenderer {
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value,
    boolean sel, boolean expanded, boolean leaf, int row,
    boolean hasFocus) {
    Component comp = super.getTreeCellRendererComponent(tree, value,
    sel, expanded, leaf, row, hasFocus);
    setIcon(FileSystemView.getFileSystemView().getSystemIcon(
    (File) value));
    String name = value.toString();
    if (name.equals("我的电脑")) {
    name = "My Computer";
    }
    if (!name.endsWith(File.separator)) {
    int index = name.lastIndexOf(File.separator);
    if (index > -1) {
    name = name.substring(index + 1);
    } }
    setText(name);
    return comp;
    }
    } static class FileTableModel implements TreeModel {
    private Map<Object, File[]> buffer = new HashMap<Object, File[]>(); private File root; public FileTableModel(File dir) {
    this.root = dir;
    } @Override
    public void addTreeModelListener(TreeModelListener l) {
    } private File toFile(Object obj) {
    return (File) obj;
    } private File[] getFiles(File parent) {
    File[] files = buffer.get(parent);
    if (files == null) {
    System.out.println("create");
    files = parent.listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
    return pathname.isDirectory();
    }
    }); buffer.put(parent, files);
    } else {
    System.out.println("从buffer取");
    }
    return files;
    } @Override
    public Object getChild(Object parent, int index) {
    return getFiles(toFile(parent))[index];
    } @Override
    public int getChildCount(Object parent) {
    return getFiles(toFile(parent)).length;
    } @Override
    public int getIndexOfChild(Object parent, Object child) {
    return 0;
    } @Override
    public Object getRoot() {
    return root;
    } @Override
    public boolean isLeaf(Object node) {
    // return toFile(node).isFile();
    File[] files = getFiles(toFile(node));
    int iCount = files == null ? 0 : files.length;
    return iCount == 0;
    } @Override
    public void removeTreeModelListener(TreeModelListener l) {
    } @Override
    public void valueForPathChanged(TreePath path, Object newValue) {
    } } public FileTree(File directory) {
    setModel(new FileTableModel(directory));
    setCellRenderer(new FileTreeCellRenderer());
    } public static void main(String[] args) throws Exception {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    SwingUtilities.invokeLater(new Runnable() {
    @Override
    public void run() {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("根");
    DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(
    "node1");
    root.add(node1);
    node1.add(new DefaultMutableTreeNode("node3"));
    root.add(new DefaultMutableTreeNode("node2"));
    root.add(new DefaultMutableTreeNode("node3"));
    root.add(new DefaultMutableTreeNode("node3"));
    root.add(new DefaultMutableTreeNode("node5"));
    root.add(new DefaultMutableTreeNode("node6")); JFrame frame = new JFrame("frame");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(640, 480);
    frame.setLocationRelativeTo(null);
    FileTree tree = new FileTree(new File("C:/")); tree.setCellRenderer(new FileTreeCellRenderer());
    frame.getContentPane().add(new JScrollPane(tree));
    frame.setVisible(true);
    }
    });
    }
    }