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

Java 如何从JTree中获取所有文件/目录的列表,java,swing,listview,jtree,Java,Swing,Listview,Jtree,我有一个包含文件/目录的JTree,我想得到一个包含这个JTree的当前列表的列表 我该怎么做? menuItemZip.addActionListener(new AbstractAction() { public void actionPerformed(ActionEvent e) { boolean exist=false; File[] files = (File[]) tree.getModel().getRoot();

我有一个包含文件/目录的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();
        }
    });

您需要递归地下降到目录中(请参见
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");

最简单的方法是,很好的例子和


也考虑一个变化,讨论。优点是在需要之前不需要检查节点。

这个问题令人困惑。树包含项目的降序层次结构,在本例中为文件。你能澄清一下你的清单是什么吗。。我可能完全误解了你的要求。你能澄清一下吗?我的清单是一份文件清单。我想如果你看一下代码,你会看到
文件[]
文件。我在线程“AWT-EventQueue-1”java.lang.ClassCastException:中得到
异常:
(文件[])树.getModel().getRoot()@itro-根据你发布的代码,我假设它已经对你起作用了。参见mKorbel的解决方案,使用
TreeNode
而不是
File[]
——使用递归的相同想法,虽然我做了如下操作,但我不确定这是否是一种好方法枚举=((TreeNode)tree.getModel().getRoot()).children();字符串文件名=selectedFile.getName()+“.zip”;布尔存在=假;while(enumeration.hasMoreElements()){String file=((file)enumeration.nextElement()).getName();if(file.equals(filename)){exist=true;break;}`@itro-您似乎有一些类型不一致:
enumeration
应该包含
TreeNode
s(
TreeNode.children()
返回
TreeNode
s的枚举-请参见
TreeNode.getChildAt()
),但是您将元素强制转换到
文件
+1以使用模型,以及解决实际问题。:-)
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);
      }
    }
  }
}