ViniGodoy:
E como são as classes que representam essa informação?
Então, antes de mais nada quero agradecer sua prontificação em ajudar-me.
As classes eu copiei das suas para compreender o funcionamento da coisa toda, aí fiz as alterações seguintes alterações:
A sua classe Livros alterei para Categorias:
public class Categorias {
private String nome;
private List<Categorias> subcategorias = new ArrayList<>();
private List<Itens> itens = new ArrayList<>();
public Categorias(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
@Override
public String toString() {
return getNome();
}
public void addItem(Itens item) {
itens.add(item);
}
public void addSubCategoria(Categorias subCategorias){
subcategorias.add(subCategorias);
}
public List<Categorias> getSubCategorias() {
return Collections.unmodifiableList(subcategorias);
}
public List<Itens> getItens() {
return Collections.unmodifiableList(itens);
}
public int getNumSubCategorias(){
return subcategorias.size();
}
}
A Classe Autores Alterei para Itens:
public class Itens {
private String nome;
public Itens(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
@Override
public String toString() {
return getNome();
}
}
A idéia é Adicionar uma Categoria, dentro desta categoria posso adicionar um item ou uma categoria e assim sucetivamente, não sei se minha lógica esta errada...
Fiz algumas alterações na sua Model para tentar monter isso mas não estou conseguindo ir pra frente..
A model modificada:
public class LivroTreeModel extends AbstractTreeModel {
// Raiz da nossa árvore, vamos exibir uma lista de livros.
private List<Categorias> livros;
private String fakeRoot = "Livros";
public LivroTreeModel(List<Categorias> livros) {
this.livros = livros;
}
/**
* 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.
*/
public Object getChild(Object parent, int index) {
if (parent == fakeRoot) // É o nó principal?
return livros.get(index); // Pegamos da lista de livro
if (parent instanceof Categorias) // O pai é uma categoria?
{
if (((Categorias) parent).getNumSubCategorias() > 0) //O pai possui alguma subcategoria?
{
return ((Categorias) parent).getSubCategorias().get(index);
}else{
// Devolvemos um Item
return ((Categorias) parent).getItens().get(index); // Se não lista os itens(filhos)
}
}
// 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 livros, é a quantidade de livros.
*/
public int getChildCount(Object parent) {
// Mesma lógica.
if (parent == fakeRoot)
return livros.size();
if (parent instanceof Categorias) // O pai é um livro?
return ((Categorias) parent).getItens().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 == fakeRoot)
return livros.indexOf(child);
if (parent instanceof Categorias)
return ((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)
{
livros.add(livro);
fireLastPathComponentInserted(fakeRoot, livro);
}
public void adicionarSubLivro(Categorias livroPai, Categorias livro)
{
for (int i = 0; i < livros.size(); i++)
{
if (livros.get(i).getNome().equals(livroPai.getNome()))
{
livros.get(i).addSubCategoria(livro);
}
}
//livros.get(livroPai.get).addSubCategoria(livro);
fireLastPathComponentInserted(fakeRoot, livroPai);
}
public void adicionarAutor(Categorias livro, Itens autor)
{
livro.addItem(autor);
fireLastPathComponentInserted(fakeRoot, livro, autor);
}
public void removerLivro(Categorias livro)
{
if (livros.remove(livro))
{
fireLastPathComponentRemoved(fakeRoot, livro);
}
}
}