[Dúvida] TreeModel!

Olá, pessoal do GUJ!
Tudo bem?

Estou com uma dúvida sobre como realizar uma operação no meu TreeModel.
Estava olhando os exemplos do Vini sobre construção de um TreeModel próprio, onde ele usa a classe Livro abaixo:

public class Livro {
   
   private String strNome;
   private List<Autor> listAutores = new ArrayList<Autor>();
   //...
}

Beleza, na minha classe Livros, eu tenho uma lista dos autores dele.
Para desenhar na JTree, ele faz assim:

public Object getChild( Object parent, int index ) {
   
   if (parent == raiz) return livros.get(index);
   if (parent instanceof Livro) return ((Livro) parent).getAutores().get(index);

   throw new IllegalArgumentException("Invalid parent class"
                   + parent.getClass().getSimpleName());
}

Até aí, tudo bem, consegui realizar uma operação parecida.
Agora, suponhamos que haja uma relação N-N de duas tabelas, a qual gera uma terceira tabela.
Digamos que haja a tabela Alunos, a tabela Turmas e a tabelaAlunosTurma:

public class Aluno {
   private int id;
   private String nome;
}
public class Turma {
   private int id;
   private String nome;
}
public class AlunoTurma {
   private int id;
   private Aluno aluno;
   private Turma turma;
}

Minha dúvida está em como fazer essa separação específica no método getChild!
Suponhamos que haja a seguinte coleção listAlunosTurmas:

1, “José”, “Engenharia Elétrica”
2, “Carlos”, “Sistemas de Informação”
3, “Tereza”, “Direito”
4, “Pedro”, “Engenharia Elétrica”
5, “Maria”, “Direito”
6, “Fabiana”, “Música”

Não estou conseguindo separar bonitinho na Tree!
Quem puder me ajudar, ficarei grato!

Abraços a todos!

Bom, para exibir uma relação N-N, em forma de árvore, você certamente duplicará algum objeto nos nós filhos.

Ou vc terá os nós pais sendo Turmas, e nesse caso, um aluno irá aparecer como sub nó de mais de uma turma.
Ou vc terá os nós pais sendo alunos, e as turmas aparecerão repetidas entre vários alunos.

No caso dos livros e autores, a relação também era N-N, já que um autor poderia estar em vários livros, e um livro pode ter vários autores. Isso, em objetos, é representado por um List nos livros, sendo que um mesmo autor pode ser usado em vários livros.

Na verdade, suas classes deveriam ser:

[code]public class Aluno {
private int id;
private String nome;
}

public class Turma {
private int id;
private String nome;
private List<Aluno> alunos;
}[/code]

[quote=ViniGodoy]Bom, para exibir uma relação N-N, em forma de árvore, você certamente duplicará algum objeto nos nós filhos.

Ou vc terá os nós pais sendo Turmas, e nesse caso, um aluno irá aparecer como sub nó de mais de uma turma.
Ou vc terá os nós pais sendo alunos, e as turmas aparecerão repetidas entre vários alunos.

No caso dos livros e autores, a relação também era N-N, já que um autor poderia estar em vários livros, e um livro pode ter vários autores. Isso, em objetos, é representado por um List<Autor> nos livros, sendo que um mesmo autor pode ser usado em vários livros.
[/quote]

Olá, Viny!
Eu gostaria que minha exibição ficasse do seguinte modo:

-Turmas
   -Engenharia Elétrica
      -José
      -João
      -Carlos
   -Direito
      -Pedro
      -Maria
   -Pedagogia
      -Josefina
      -Carlitos
      -Ronaldo

No caso, os nós pais seriam as turmas, e os nós filhos seriam os alunos respectivos.

Suponhamos que eu tenha as seguintes tabelas:

[code]Alunos
ID Nome
1 José
2 Carlos
3 Maria
4 Josefina
5 Carlitos

Turmas
ID Nome
1 Eng. Elétrica
2 Direito
3 Pedagogia

AlunosTurmas
ID Aluno Turma
1 1 1
2 3 2
3 2 3
4 4 2[/code]

O que há de errado em representar cada tupla da minha tabela AlunosTurmas como sendo uma classe a qual possui um objeto do tipo Aluno e um objeto do tipo Turma? Não vi erro algum nisso…
Se eu fizer desta maneira a qual expus agora, há alguma lógica coerente para desenhar os nós da JTree?

Valeu!!

Você até pode. Mas sua classe AlunoTurma terá que ter métodos estáticos para obter todos os Alunos de uma determinada Turma, ou todas as Turmas de um determinado aluno, que é o que você quer exibir. Sem isso pode ficar bastante difícil mesmo mostrar essa informação no JTree.

Só pense com carinho se um List<Aluno> na classe turma não pode simplificar o seu modelo. Veja como seria usado:

[code]//Adicionar um aluno numa turma
turma.add(aluno);

//Listar todos os alunos de uma turma:
for (Aluno a : turma) {
System.out.println(a);
}

//Remover um aluno da turma
turma.remover(a);
[/code]

Vamos lá, então…

Criei minha classe Turma:

public class Turma {

    private int id;
    private String nome;
    private List<Aluno> listAlunos = new ArrayList<Aluno>();
    
    public Turma() {}
    public Turma( int intId, String strNome ) {
        
        this.id = intId;
        this.nome = strNome;
    }
    public Turma( int intId, String strNome, List<Aluno> listAlunos ) {

        this.id = intId;
        this.nome = strNome;
        this.listAlunos = listAlunos;
    }

    public void setAluno( Aluno objAluno ) {
        this.listAlunos.add( objAluno );
    }
   public List<Aluno> getAlunos() {
        return this.listAlunos;
    }
// Outros getters e setters omitidos

    @Override
    public String toString() {
        return nome;
    }

E fiz esse TreeModel:

[code]
public class AlunoTurmaTreeModel implements TreeModel {

private String strRaiz = "Turmas";
private List<TreeModelListener> listListeners = new ArrayList<TreeModelListener>();

private List<Turma> listTurmas;
public AlunoTurmaTreeModel( List<Turma> listTurmas ) {
    this.listTurmas = listTurmas;
}

public Object getRoot() {
    return strRaiz;
}

public Object getChild( Object parent, int index ) {

    if ( parent == strRaiz ) return listTurmas.get( index );
    if ( parent instanceof Turma ) return ( (Turma) parent ).getAlunos().get( index );

     throw new IllegalArgumentException("Invalid parent class "
                        + parent.getClass().getSimpleName());
}
public int getChildCount( Object parent ) {

    if ( parent == strRaiz )  return listTurmas.size();
    if ( parent instanceof Turma ) return ( (Turma) parent).getAlunos().size();  //<---- Aqui dá erro!

     throw new IllegalArgumentException("Invalid parent class "
                        + parent.getClass().getSimpleName());
}
public int getIndexOfChild(Object parent, Object child) {

    if ( parent == strRaiz ) return listTurmas.indexOf( child );
    if ( parent instanceof Turma ) return ( (Turma) parent ).getAlunos().indexOf( child );

    return 0;
}

}[/code]

Lá, onde tá dando erro, o parent é uma instância de turma, mas acaba lançando a exceção abaixo! :S

O main tá assim:

public class Main {

    public static void main(String[] args) {

        List<Turma> listTurmas = new ArrayList<Turma>();

        Turma objTurma;
        objTurma = new Turma();
        objTurma.setId(1);
        objTurma.setNome( "Direito" );
        objTurma.setAluno( new Aluno( 1, "João Carlos" ));
        objTurma.setAluno( new Aluno( 2, "Maria Josefina" ));
        objTurma.setAluno( new Aluno( 3, "Micalatéia" ));
        listTurmas.add( objTurma );

        objTurma = new Turma();
        objTurma.setId(1);
        objTurma.setNome( "Engenharia Civil" );
        objTurma.setAluno( new Aluno( 1, "Pedro Thiago" ));
        objTurma.setAluno( new Aluno( 2, "Tereza Sofia" ));
        objTurma.setAluno( new Aluno( 3, "Ronaldo Tenório" ));
        listTurmas.add( objTurma );

        objTurma = new Turma();
        objTurma.setId(1);
        objTurma.setNome( "Informática" );
        objTurma.setAluno( new Aluno( 1, "Carlos Eduardo" ));
        objTurma.setAluno( new Aluno( 2, "Hermanoteu" ));
        listTurmas.add( objTurma );
        
        new Tela( new AlunoTurmaTreeModel( listTurmas ) );
    }

Alguma idéia do que possa ser?
Valeu!

Faltou a exception.

Exception occurred during event dispatching:
java.lang.IllegalArgumentException: Invalid parent class Turma
        at treeview.AlunoTurmaTreeModel.getChildCount(AlunoTurmaTreeModel.java:60)
        at javax.swing.plaf.basic.BasicTreeUI.paintExpandControl(BasicTreeUI.java:1451)
        at javax.swing.plaf.basic.BasicTreeUI.paint(BasicTreeUI.java:1206)
        at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
        at javax.swing.JComponent.paintComponent(JComponent.java:763)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        ...

Estranho. Troca ali aquele parent.getClass().getSimpleName(), por parent.getClass().getCanonicalName()

Não consigo entender pq o código chegou até ali, se seu if testa o instanceof turma.

Verifique se o nome da classe Turma que aparecerá no erro depois disso tem a ver com o nome da classe Turma que vc está usando.