Adicionar CheckBox em uma JTree

Aew galera estou tentando criar uma JTree com checkBox mas nao estou conseguindo fiz um modelo baseado em um exemplo aqui do GUJ meu modelo ficou assim

[code]
package Modelos;

import Classes.Arquivo;
import Classes.Pasta;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;

public class FTPTreeModel implements TreeModel {
// Escrevam depois AbstractTreeModel para lidar com os listeners.

private List<TreeModelListener> listeners = new ArrayList<TreeModelListener>();
// Raiz da nossa árvore, vamos exibir uma lista de Pastas.
private List<Pasta> pastas;

public FTPTreeModel(List<Pasta> pastas) {
    this.pastas = pastas;
}

/**
 * Com esse método, o Java quem é o objeto que está num determinado índice
 * do pai. Cada nó de uma árvore pode ser encarado como uma lista. Sendo o
 * pai a lista e o índice um dos filhos.
 *
 * @param parent
 *            É o pai, que tem os filhos. No caso da Pasta, a própria Pasta.
 * @param index
 *            Índice do filho. No caso do pasta, o índice corresponde aos
 *            arquivo.
 */
public Object getChild(Object parent, int index) {




    if (parent == pastas) // É o nó principal?
    {
        return pastas.get(index); // Pegamos da lista de Pasta
    }
    if (parent instanceof Pasta) // O pai é uma pasta?
    {
        // Devolvemos um arquivo
        return ((Pasta) parent).getArquivos().get(index);
    }

    // Se o pai não é nenhum desses. Melhor dar erro.
    throw new IllegalArgumentException("Invalid parent class" + parent.getClass().getSimpleName());
}

/**
 * Retornamos quantos filhos um pai tem. No caso de um livro, é a contagem
 * de autores. No caso da lista de pastas, é a quantidade de pastas.
 */
public int getChildCount(Object parent) {
    // Mesma lógica.
    if (parent == pastas) {
        return pastas.size();
    }

    if (parent instanceof Pasta) // O pai é uma Pasta?
    {
        return ((Pasta) parent).getArquivos().size();
    }

    // Se o pai não é nenhum desses. Melhor dar erro.
    throw new IllegalArgumentException("Invalid parent class" + parent.getClass().getSimpleName());
}

/**
 * Dado um pai, indicamos qual é o índice do filho correspondente.
 */
public int getIndexOfChild(Object parent, Object child) {
    if (parent == pastas) {
        return pastas.indexOf(child);
    }
    if (parent instanceof Pasta) {
        return ((Pasta) parent).getArquivos().indexOf(child);
    }

    return 0;
}

/**
 * Devemos retornar quem é o nó raiz da árvore. Afinal, a árvore tem que
 * começar em algum lugar.
 */
public Object getRoot() {
    return pastas;
}

/**
 * Indicamos se um nó é ou não uma folha. Isso é, se ele não tem filhos. No
 * nosso caso, os autores são as folhas da árvore.
 */
public boolean isLeaf(Object node) {
    return node instanceof Arquivo;
}

public void valueForPathChanged(TreePath path, Object newValue) {
    // Com esse método, a tree avisa que um objeto mudou.
    // Editem se quiserem que um nó seja editável
}

// Esses dois métodos abaixo poderiam ir para classe abstrata
public void removeTreeModelListener(TreeModelListener l) {
    listeners.remove(l);
}

public void addTreeModelListener(TreeModelListener l) {
    listeners.add(l);
}

}[/code]

O Render que estou tendando implementar para acrescentar os checkbox na JTree

[code]
package Render;

import Classes.Arquivo;
import Classes.Pasta;
import java.awt.Color;
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.TreeCellRenderer;

public class CheckboxCellRenderer implements TreeCellRenderer {

private Color selectionForeground;
private Color selectionBackground;
private Color textForeground;
private Color textBackground;
private JCheckBox checkbox = new JCheckBox();

public CheckboxCellRenderer() {
    selectionForeground = UIManager.getColor("Tree.selectionForeground");
    selectionBackground = UIManager.getColor("Tree.selectionBackground");
    textForeground = UIManager.getColor("Tree.textForeground");
    textBackground = UIManager.getColor("Tree.textBackground");
}

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,
        boolean expanded, boolean leaf, int row, boolean hasFocus) {
    /*Pasta pasta = (Pasta) value;
    checkbox.setText(pasta.toString());*/
    checkbox.setText("Teste");
    //checkbox.setSelected(arq.isChecked());
   /*if (folder == FilesystemFolderModel.ROOT) {
        checkbox.setIcon(UIManager.getIcon("FileView.hardDriveIcon"));
    } else {
        checkbox.setIcon(null);
    }*/
    sel =true;

    if (sel) {
        checkbox.setForeground(selectionForeground);
        checkbox.setBackground(selectionBackground);
    } else {
        checkbox.setForeground(textForeground);
        checkbox.setBackground(textBackground);
    }

    checkbox.setEnabled(tree.isEnabled());

    return checkbox;
}

}[/code]

O que eu preciso fazer pra fazer funcionar corretamente, os checkbox aparecem mas nao consigo fazer selecionar e nao tenho ideia de como pegar o isChecked de cada um para depois saber quais estao selecionados pra mim salvar

a arvore estou conseguindo montar normalmente de acordo com minha necessidade, mas agora preciso deixar o usuario selecionar os nodes filhos e depois de selecionar ele baixa os itens selecionados, tentei por Listeners mas não entendo muito bem e parei pra pensar acho que fica melhor com CheckBox em cada node filho, mas alguem teria algum exemplo simples de implementacao de CheckBox em uma JTree??

Obrigado.

Cara, isso eh uma mao fazer

Dah uma olhada nestas classes ai eu sei que funciona…

http://code.assembla.com/origy/subversion/nodes/src/btArquivos