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.