Então irmão,
consegui acertar a parada aqui, porém o código ficou meio sujo, queria ver se consigo melhorar para deixar mais dinâmico, e com mais possibilidades de níveis, segue a Classe CategoriasTreeModel com as alterações feitas, porém está meio tosco o negócio, to tentando bolar um jeito de melhorar, se tiver alguma dica agradeço, eu criei um método getPai para quando um filho possuir um pai passar o path completo para o fireLastPathComponentInserted (vide método adicionarAutor), to pensando em adicionar um campo path na classe das categorias e na classe itens, dessa forma teria em cada classe qual o seu path completo podendo assim fazer os tratamentos necessários.
package treeSample;
import java.util.ArrayList;
import java.util.List;
public class CategoriaTreeModel extends AbstractTreeModel {
// Raiz da nossa árvore, vamos exibir uma lista de livros.
private List<Categorias> categorias;
private String fakeRoot = "Categorias";
public CategoriaTreeModel(List<Categorias> categorias) {
this.categorias = categorias;
}
/**
* 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 do Livro, o próprio livro.
* @param index
* Índice do filho. No caso do livro, o índice corresponde aos
* autores.
*/
@Override
public Object getChild(Object parent, int index) {
if (parent == fakeRoot) // É o nó principal?
return categorias.get(index); // Pegamos da lista de livro
if (parent instanceof Categorias) // O pai é uma categoria?
{
//List<Categorias> cat = categorias;
if (index < ((Categorias) parent).getNumSubCategorias()) {
return ((Categorias) parent).getSubCategorias().get(index);
}
return ((Categorias) parent).getItens().get(index - ((Categorias) parent).getNumSubCategorias()); // Se não lista os itens(filhos)
}
return null;
}
/**
* Retornamos quantos filhos um pai tem. No caso de um livro, é a contagem
* de autores. No caso da lista de livros, é a quantidade de livros.
*/
@Override
public int getChildCount(Object parent) {
// Mesma lógica.
if (parent == fakeRoot)
return categorias.size();
if (parent instanceof Categorias) {
Categorias cat = (Categorias) parent;
return cat.getSubCategorias().size() + cat.getItens().size();
}
return 0;
}
/**
* Dado um pai, indicamos qual é o índice do filho correspondente.
*/
public int getIndexOfChild(Object parent, Object child) {
if (parent == fakeRoot)
return categorias.indexOf(child);
if (parent instanceof Categorias) {
if (child instanceof Categorias)
return ((Categorias) parent).getSubCategorias().indexOf(child);
return ((Categorias) parent).getSubCategorias().size() +
((Categorias) parent).getItens().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 fakeRoot;
}
/**
* 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 Itens;
}
public void adicionarLivro(Categorias livro)
{
categorias.add(livro);
fireLastPathComponentInserted(fakeRoot, livro);
}
public void adicionarSubLivro(Categorias livroPai, Categorias livro)
{
for (int i = 0; i < categorias.size(); i++)
{
if (categorias.get(i).getNome().equals(livroPai.getNome()))
{
livro.setPai(livroPai.getNome());
categorias.get(i).addSubCategoria(livro);
}
}
//livros.get(livroPai.get).addSubCategoria(livro);
fireLastPathComponentInserted(fakeRoot, livroPai, livro);
}
public void adicionarAutor(Categorias livro, Itens autor)
{
livro.addItem(autor);
if(livro.getPai() != null)
{
fireLastPathComponentInserted(fakeRoot,getPai(livro),livro, autor);
}else
fireLastPathComponentInserted(fakeRoot,livro, autor);
}
public Categorias getPai(Categorias filho){
for (int i = 0; i < categorias.size(); i++)
{
if (categorias.get(i).getNome() == filho.getPai())
return categorias.get(i);
}
return null;
}
public void removerLivro(Categorias livro)
{
if (categorias.remove(livro))
{
fireLastPathComponentRemoved(fakeRoot, livro);
}
}
}