[RESOLVIDO] [JTree] Problema com pastas vazias

Boa Tarde, pessoal!

Estou fazendo uma aplicação e pretendo usar JTree para fazer um menu como o Windows Explorer. Está tudo funcionando certinho, exceto por um pequeno problema de visualização das pastas vazias. O que acontece é que quando o código encontra uma pasta vazia ele não o exibe como uma pasta, mas sim como um arquivo.

Abaixo seque o código que estou utilizando:

[code]import javax.swing.;
import javax.swing.tree.
;

import java.awt.Color;
import java.awt.Container;
import java.io.*;

public class Explorador extends JFrame{
public Explorador() {
JFrame frame = new JFrame(“Explorador”);
Container cp = frame.getContentPane();

	DefaultMutableTreeNode master = new DefaultMutableTreeNode("ROOT");
	JTree tree = new JTree(master);
	JScrollPane scroll = new JScrollPane(tree);
	frame.setSize(400,400);
	cp.add(scroll);
	// chama o método para popular o JTree
	listAllFiles("C:\\temp",  master, true);

	frame.pack();
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

/*
 * @params: String directory ~ o diretório a trabalhar
 * @params: DefaultMutableTreeNode parent ~ o node pai
 * @params: Boolean recursive ~ determina se vai trabalhar com as subpastas, ou só o pai
 */
public static void listAllFiles(String directory, DefaultMutableTreeNode parent, Boolean recursive) {
	// Lista todos os arquivos no diretório "String directory" no array "children"
	File [] children = new File(directory).listFiles();

	for(int i = 0; i < children.length; i++) {

		// Pega o nome de cada Pasta ou Arquivo
		DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
		// Só mostra o Node se ele é uma pasta e se esta é uma chamada recursiva
		if(children[i].isDirectory() && recursive) { 
			parent.add(node); // adiciona como filho
			listAllFiles(children[i].getPath(), node, recursive); // chamada recursiva para trabalhar com o filho
		}else if(!children[i].isDirectory()){ // senão caso não seja um diretório
			parent.add(node); // adiciona como um arquivo
		}
	}
}
public static void main(String []args){
	Explorador app = new Explorador();
}

}[/code]

Ja pesquisei e não encontrei solução e agora resolvi perguntar, como faço para as pastas vazias serem reconhecidas como pastas? O que deixei faltando para não englobar isso? Nota-se que a pasta vazia não entra no for pois quando listFiles() a avalia, children fica vazio, ou seja, com length = 0 sendo assim não atende a condição do for (i < children.length).

Teria como alguém me ajudar com essa parte? Teria como eu fazer isso sem usar DefaultTreeCellRenderer?

Em anexo segue uma imagem do resultado atual, onde todos nodes com uma marca vermelha ao lado são pastas vazias que caem nesse problema.

Nossa, tava na experança de chegar em casa e alguém ter me dado uma luz, tenho certeza que alguém ja teve esse problema resolvido…

Conto com a ajuda de vocês…

Abraço!

Boa Noite, Pessoal!!!

Será que isso é tão complicado assim? Pensei que eu ia passar vergonha pois a solução viria rápido, uma pena, eu continuo quebrando a cabeça, mas nada até agora.

Ainda conto com vocês, abraço!

Boa Noite, Pessoal!

Agradeço a todos que ao menos tentaram imaginar alguma solução e aos amigos que divulgaram esse link e meu problema para os javeiros de plantão.

Acabei conseguindo resolver fazendo um extends de TreeModel e fazendo override de um método de JTree. Agora ficou legal, parece que está do jeito que eu queria.

Obrigado!

Ola, também estou usando o Jtree para mostrar pastas, e me interessei pela tua solução.
Teria como postar o codigo final?

Desde ja agradeço.

Tive este mesmo problema.
Para quem se interessar pela resposta.

Deve ser criado uma classe que herda de “DefaultTreeCellRenderer”. Devemos utilizar o método “setCellRenderer” da JTree para adicionar o renderer ao seu Componente.
Meus Itens da JTree são implementados com DefaultMutableTreeNode, ele contém um objeto JTreeItem.

No caso mais comum o JTreeItem será substituído por um Objeto File.
A solução está abaixo:

public class FileTreeCellRenderer extends DefaultTreeCellRenderer {

    public Component getTreeCellRendererComponent(JTree tree,
            Object value, boolean sel, boolean expanded, boolean leaf,
            int row, boolean hasFocus) {
        JLabel renderer = (JLabel) super.getTreeCellRendererComponent(
                tree, value, sel, expanded, leaf, row, hasFocus);

        DefaultMutableTreeNode currentItem = (DefaultMutableTreeNode) value;

        JTreeItem item = (JTreeItem) currentItem.getUserObject();

        if (item.isDirectory()) {
            if (expanded) {
                renderer.setIcon(openIcon);
            } else {
                renderer.setIcon(closedIcon);
            }
        } else {
            renderer.setIcon(leafIcon);
        }
        
        return renderer;
    }
}