JTree complexa!

ViniGodoy,

li seu post sobre criar um Model para a JTree, mas a JTREE que eu queria fazer é muitoooooo complexa.

A estrutura dela será mais ou menos isso:

  • Expandido
  • Contraído
  • Arquivo

 -  Instituição de Ensino
    - Curso
      - 1 Semestre
        - Materia Exemplo
           - Minhas anotações
             * Anotação Exemplo 1
             * Anotação Exemplo 2

           - Meus lembretes
             * Lembre de prova: Disciplina Z Dia X Hora Y
             * Lembrete de trabalho: Disciplina Z Dia X Hora Y

           - Referencias Bibliograficas
             * Autor, Qualquer - Referencia aqui
             * Autor, Qualquer - Referencia aqui
        
         - Materia Exemplo 2
           + Minhas anotações
           + Meus Lembretes
           + Referencias Bibliográficas

       + 2 Semestre
       + 3 Semestre 
   

Onde eu vou ter que construir dinamicamente isso através de vários objetos…
Isso por que tenho as classes:

Instituição
[possui arrayList de Cursos]

Curso
[possui arrayList de Semestres]

Semestres
[possui arrayList de Materias]

Materias

[possui: MinhasAnotaçoes, MeusLembretes, Referencias Bibliografica]

MinhasAnotacoes
arrayList de Anotacoes

MeusLembretes
arrayList de LembretesProva
arrayList de LembretesTrabalhos

ReferenciasBibliograficas
arrayList de Referencias

e por fim:

Anotacoes: classe que vai guardar as anotacoes propriamente ditas
LembretesProva: classe que vai guardar os lembretes das provas
LembretesTrabalhos: classe que vai guardar os lembretes dos trabalhos
Referencias: classe que vai guardar as referencias bibliograficas

Nada complexo né?
Além de criar isso tudo dinamicamente vou precisar criar um JPOPUPMENU diferente dependendo de onde o cara clicar (com o botao direito né)…
Se clicar em Instituicao, aparece para criar Curso… e assim vai […]

Obrigado

Basicamente, vais usar a design pattern chamada de Composite ( http://en.wikipedia.org/wiki/Composite_pattern ).

Todas as classes que podem ser utilizadas no teu treetable implementaram uma classe em comum…

por exemplo:

public interface TreeTableItem { ArrayList<TreeTableItem> getMySons(); boolean addSon( TreeTableItem son ); }

Quando montares a tree, vais usar de forma que o método getMySons() seja quem define se ele tem, ou não, filhotes…

Já o JPopupMenu, é só tu criar um item conforme a instancia do objeto da linha selecionada… Normalmente temos algo assim

public JPopupMenu getPopup() { if ( popup == null ) { // criacao do popup } return popup; }

public JPopupMenu getPopup( Class instance ) { JPopupMenu popup = null; //criacao do popup conforme classe do instance return popup; }

Entendi,

muito obrigado…
Vou botar em prática e dou o retorno
abraços

pesquisei, mas não consegui imaginar bem como seria a aplicação. Fiquei meio perdido…
veja bem:
view plaincopy to clipboardprint?

[code]

  1. public interface TableItem{
  2.  ArrayList<TableItem> meusItens = new ArrayList<TableItem>;  
    
  3.  public void add(TableItem t);  
    
  4. } [/code]

public interface TableItem{ ArrayList meusItens = new ArrayList; public void add(TableItem t); }

agora todas as classes vao implementar essa interface?

view plaincopy to clipboardprint?

public class Instituicao{ public void add(TableItem t){ meusItens.add(t); } }

public class Instituicao{ public void add(TableItem t){ meusItens.add(t); } }

e isso a mesma coisa para Cursos, Semestres, Materias, etc ?

Não faz sentido!
Desculpa me perdi, li tanta coisa no google também
que pode ter me confundido.
Abraços

Eu expliquei mais genericamente pois eras mais experiente com java…

Vou colar um exemplo que eu fiz agora, funcionando, de um JTree… Note que ele implementa uma classe INo. Neste exemplo é inútil, mas pense que se tens várias classes, podes tratar de modo genérico (ao inves de referenciar a classe A, B, C ou D, referencias a classe I sempre)

[code]import java.awt.BorderLayout;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;

public class Try extends JFrame {

public Try() {
	init();
}

public void init() {
	
	JPanel panel = new JPanel( new BorderLayout() );
	
	this.add( panel );
	
	No no1 = new No("1.0");
	No no11 = new No("1.1");
	No no12 = new No("1.2");
	No no121 = new No("1.2.1");
	No no122 = new No("1.2.2");
	No no13 = new No("1.3");
	No no2 = new No("2");
	
	no1.addNo(no11);
	no1.addNo(no12);
	no12.addNo(no121);
	no12.addNo(no122);
	no1.addNo(no13);
	
	ArrayList<No> nos = new ArrayList<No>();
	nos.add( no1 );
	nos.add( no2 );
	
	DefaultTreeModel model = new DefaultTreeModel(getRoot(nos));
	
	JTree tree = new JTree( model );
	
	panel.add( tree, BorderLayout.CENTER );
	
	this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	this.pack();
	this.setVisible(true);
}

public DefaultMutableTreeNode getRoot( ArrayList<No> nos ) {
	DefaultMutableTreeNode root = new DefaultMutableTreeNode();
	for (No no : nos) {
		DefaultMutableTreeNode nodeChild = new DefaultMutableTreeNode( no );
		populate(nodeChild, no);
		
		root.add(nodeChild);
	}
	return root;
}

public void populate( DefaultMutableTreeNode nodeParent, No noParent ) {
	if ( noParent.getNos() != null ) {
		for( No noChild : noParent.getNos() ) {
			DefaultMutableTreeNode nodeChild = new DefaultMutableTreeNode( noChild );
			nodeParent.add(nodeChild);
			populate(nodeChild, noChild);
		}
	}
}

public static void main(String[] args) {
	new Try();
}



class No implements INo {
	
	private ArrayList<No> nos;
	private String descricao;
	
	public No(String descricao) {
		this.descricao = descricao;
	}
	
	public ArrayList<No> getNos() {
		return nos;
	}
	
	public void addNo( No no ) {
		if ( nos == null ) {
			nos = new ArrayList<No>();
		}
		nos.add( no );
	}
	
	@Override
	public String toString() {
		return this.descricao;
	}

}

interface INo {
	ArrayList<No> getNos();
	void addNo( No no );
}

}
[/code]

Agora, o popup eu deixo de desafio pra ti, afinal, qual é a graça de programar se for pra ganhar tudo na mão?
Tenta implementar e caso tenha dúvidas posta ai. Ou, quando conseguir, posta também…

Mas aí você usou o DefaultTreeModel, eu estava pensando em criar o meu próprio Model…
Mas talvez eu necessite usar o default mesmo, pois minhas classes todas vão implementas Serializable …

obrigado pelo exemplo!

[quote=d34d_d3v1l]Mas aí você usou o DefaultTreeModel, eu estava pensando em criar o meu próprio Model…
Mas talvez eu necessite usar o default mesmo, pois minhas classes todas vão implementas Serializable …

obrigado pelo exemplo![/quote]

Podes criar teu próprio model, aproveitando e fazendo com que ele seja um filho de DefaultTreeModel, ai tudo o que está ali se aplica ao teu model novo.

Com a vantagem que podes portar o método de “populate” para dentro do teu model…

Como podes perceber, o construtor do model recebe um object, podes criar o teu e fazer ele receber um INo (a tua classe interface) e fazer o populate automaticamente…

Só lembrando, podes ter múltiplas implementações.

[]'s