2014-11-05 2 views
0

У меня есть пользовательский Jtree, который показывает структуру данной папки. Моя проблема в том, что каким-то образом она дублирует папку.JTree дублирует папку при показе

В приведенном примере папки C: \ Пример

В примере папке есть 3 папки А, В, С

JTree Предполагается, чтобы просмотреть это следующим образом:

C: \ Пример

->A 
    some1.txt 
->B 
->C 

но он дублирует папку, так что показывает:

C: \ Пример

->A 
    ->A 
    some1.txt 
->B 
    ->B 
->C 
    ->C 

Я использую пользовательский визуализатор, чтобы показать только имя не полный путь в JTree, здесь является:

@Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
     System.out.println(value); 
     super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
     if (value instanceof DefaultMutableTreeNode) { 
      value = ((DefaultMutableTreeNode)value).getUserObject(); 
      if (value instanceof File) { 
       File file = (File) value; 
       if (file.isFile()) { 
        setText(file.getName()); 
       } else { 
        setText(file.getName()); 
       } 
      } 
     } 
     return this; 
    } 

А вот где я заселить JTree с данными:

/** 
* Add nodes from under "dir" into curTop. Highly recursive. 
*/ 
DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) { 

    DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(dir); 
    if (curTop != null) { // should only be null at root 
     curTop.add(curDir); 
    } 
    File[] tmp = dir.listFiles(); 
    Vector<File> ol = new Vector<File>(); 

    ol.addAll(Arrays.asList(tmp)); 
    Collections.sort(ol, new Comparator<File>() { 
     @Override 
     public int compare(File o1, File o2) { 

      int result = o1.getName().compareTo(o2.getName()); 

      if (o1.isDirectory() && o2.isFile()) { 
       result = -1; 
      } else if (o2.isDirectory() && o1.isFile()) { 
       result = 1; 
      } 

      return result; 
     } 
    }); 
    // Pass two: for files. 
    for (int fnum = 0; fnum < ol.size(); fnum++) { 
     File file = ol.elementAt(fnum); 
     DefaultMutableTreeNode node = new DefaultMutableTreeNode(file); 
     if (file.isDirectory()) { 
      addNodes(node, file); 
     } 
     curDir.add(node); 
    } 
    return curDir; 
} 

и здесь, где я использую это в моем коде:

 dir = new File(System.getProperty("user.dir")+"\\Example"); 
    tree = new JTree(addNodes(null, dir)); 
    tree.setCellRenderer(new MyTreeCellRenderer()); 
+0

1) Для лучшего помогите раньше, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) (минимальный полный проверенный пример). 2) Для рабочего примера см. [GUI графического браузера] (http://codereview.stackexchange.com/q/4446/7784). –

ответ

0

У вас есть проблемы с рекурсией в addNodes(..) метода, изменить его, как в следующем:

DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) { 

     File[] tmp = dir.listFiles(); 
     Vector<File> ol = new Vector<File>(); 
     ol.addAll(Arrays.asList(tmp)); 
     Collections.sort(ol, new Comparator<File>() { 
      @Override 
      public int compare(File o1, File o2) { 

       int result = o1.getName().compareTo(o2.getName()); 

       if (o1.isDirectory() && o2.isFile()) { 
        result = -1; 
       } else if (o2.isDirectory() && o1.isFile()) { 
        result = 1; 
       } 

       return result; 
      } 
     }); 
     // Pass two: for files. 
     for (int fnum = 0; fnum < ol.size(); fnum++) { 
      File file = ol.elementAt(fnum); 
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(file); 
      if (file.isDirectory()) { 
       addNodes(node, file); 
      } 
      curTop.add(node); 
     } 
     return curTop; 
    } 

Также вы need't называть его null параметром, как назвать следующий:

JTree tree = new JTree(addNodes(new DefaultMutableTreeNode(dir), dir)); 
+0

Спасибо, что это решило мою проблему :) –

+0

Добро пожаловать – alex2410