如何从JTree获取所有文件/目录的列表

时间:2012-06-22 13:52:50

标签: java swing listview jtree

我有一个包含文件/目录的JTree,我想获得一个包含此JTree当前列表的列表。

我该怎么做?

menuItemZip.addActionListener(new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            boolean exist=false;
            File[] files = (File[]) tree.getModel().getRoot();
            for (File file : files) {
                if (file.getName().equals(selectedFile.getName()+".zip"))
                    exist = true;
                break;
            }
            if(exist ==true)
            new ZipWorkers(selectedFile,WORKING,status).execute();
            btnRefresh.doClick();
        }
    });

编辑为新解决方案:我不知道这是不是一个好的解决方案?

menuItemZip.addActionListener(new AbstractAction() {
        public void actionPerformed(ActionEvent e) {     
           Enumeration enumeration =  ((TreeNode) tree.getModel().getRoot()).children();
            String filename = selectedFile.getName()+".zip";
            boolean exist=false;
            while (enumeration.hasMoreElements()){
                String file = ((File) enumeration.nextElement()).getName();
                   if(file.equals(filename)){
                       exist=true;
                       break;
                   }
            }
         if(exist ==true)
            new ZipWorkers(selectedFile,WORKING,status).execute();
            btnRefresh.doClick();
        }
    });

3 个答案:

答案 0 :(得分:3)

您需要以递归方式下降到目录中(请参阅File.isDirectory()以确定它是否存在)。可以通过编写迭代文件数组的函数来实现递归,并使用目录的子项调用自身

boolean doesExist(File[] files, String searchFileName) {
  boolean exists = false;
  for (File f : files) {
    if (f.getName().equals(searchFileName)) {
      exist = true;
    } else if (f.isDirectory()) {
      exist = doesExist(f.listFiles(), searchFileName);
    }
    if (exist) {
      break; // no need to proceed further
    }
  }
  return exist;
}

然后用

调用它
doesExist((File[]) tree.getModel().getRoot(), selectedFile.getName()+".zip");

答案 1 :(得分:3)

最简单的方法是,很好的示例herehere

import java.util.Enumeration;   
import javax.swing.JTree;
import javax.swing.tree.TreeNode;

public class Main {
  public static void main(String[] argv) throws Exception {
    JTree tree = new JTree();
    visitAllNodes(tree);
  }
  public static void visitAllNodes(JTree tree) {
    TreeNode root = (TreeNode) tree.getModel().getRoot();
    visitAllNodes(root);
  }

  public static void visitAllNodes(TreeNode node) {
    System.out.println(node);
    if (node.getChildCount() >= 0) {
      for (Enumeration e = node.children(); e.hasMoreElements();) {
        TreeNode n = (TreeNode) e.nextElement();
        visitAllNodes(n);
      }
    }
  }
}

答案 2 :(得分:2)

还要考虑FileTreeModel的变体,讨论here。优点是您无需在需要之前检查节点。