Preciso de ajuda com o JTree do java, help me please

Estou tentando adicionar dados no meu JTree, sei como adicionar diretamente, mas o que eu quero é que o JTree pegue os dados da minha classe com um simples get mesmo. É possível?
Uso o a versão mais recente do eclipse. Segue o meu código do JTree.

JTree tree = new JTree();
tree.setRootVisible(false);
tree.setModel(new DefaultTreeModel(
 new DefaultMutableTreeNode("JTree") {
    { 
    DefaultMutableTreeNode node_1;
    node_1 = new DefaultMutableTreeNode("1\\\\u00BA Periodo");
        node_1.add(new DefaultMutableTreeNode("Disciplina 1"));
        node_1.add(new DefaultMutableTreeNode("Disciplina 2"));
        add(node_1);
    node_1 = new DefaultMutableTreeNode("2\\\\u00BA Periodo");
         node_1.add(new DefaultMutableTreeNode("Disciplina 3"));
         node_1.add(new DefaultMutableTreeNode("Disciplina 4"));
         add(node_1);
    node_1 = new DefaultMutableTreeNode("3\\\\u00BA Periodo");
         node_1.add(new DefaultMutableTreeNode("Disciplina 5"));
         node_1.add(new DefaultMutableTreeNode("Disciplina 6"));
         add(node_1);
    }
 }
));

Em vez de eu escrever a mão quais disciplinas vão ser, quero que o JTree pegue essas disciplinas da minha classe.

Se você consegue adicionar manualmente um por um, para isso sempre é usado o mesmo bloco de código, se são vários valores e quer simplificar, monte uma lista com os dados desejados e faça um laço de repetição para percorrer a lista e acionar a criação do JTree de acordo com sua necessidade.

1 curtida

Como ficaria o código? E como eu pego os dados da classe e jogo no JTree?

Ele te deu o caminho. Para aprender, você tem que usar o caminho para chegar no código. Se você obter um código pronto toda vez que surgir uma dúvida, você não vai aprender a programar, e sim a copiar e colar.

Tente descobrir como resolver! Vai te agregar muito, pode ter certeza.

Sim, é possível, implemente o seu próprio TreeModel para fazer isso.

Como é a estrutura da sua classe que fornece os dados?

1 curtida

Por enquanto eu tenho uma classe bem simples, no final a ideia é pega essa disciplina do banco de dados, mas aprendendo como pegar da classe já vai ajudar bastante.
Esses são os métodos da classe:

    public int getOfertaCod() {
	    return OfertaCod;
	}
	public void setOfertaCod(int ofertaCod) {
		OfertaCod = ofertaCod;
	}
	public int getOfertaAnoLetivo() {
		return OfertaAnoLetivo;
	}
	public void setOfertaAnoLetivo(int ofertaAnoLetivo) {
		OfertaAnoLetivo = ofertaAnoLetivo;
	}
	public int getOfertaSemestre() {
		return OfertaSemestre;
	}
	public void setOfertaSemestre(int ofertaSemestre) {
		OfertaSemestre = ofertaSemestre;
	}
	public String getOfertaTurno() {
		return OfertaTurno;
	}
	public void setOfertaTurno(String ofertaTurno) {
		OfertaTurno = ofertaTurno;
	}
	public int getOfertaGrupo() {
		return OfertaGrupo;
	}
	public void setOfertaGrupo(int ofertaGrupo) {
		OfertaGrupo = ofertaGrupo;
	}

Eu sei que sim, mas tô com tanta coisa pra fazer. Já tentei achar, pesquisei e tudo, mas tá complicado.
Tudo que quero é um simples comando pra pegar dados da classe e adicionar no JTree, todo programador já se deparou com algo assim e veio pro fórum pedir um help, não custa ajudar.

Supondo que você tenha uma classe Periodo com a seguinte estrutura:

import java.util.LinkedList;
import java.util.List;

public class Periodo {

    private String descricao;
    private List<Disciplina> disciplinas;

    public Periodo(String descricao) {
        this.descricao = descricao;
        this.disciplinas = new LinkedList<>();
    }

    public String getDescricao() {
        return descricao;
    }

    public List<Disciplina> getDisciplinas() {
        return disciplinas;
    }
}

E uma classe Disciplina com a seguinte estrutura:

public class Disciplina {

    private String descricao;

    public Disciplina(String descricao) {
        this.descricao = descricao;
    }

    public String getDescricao() {
        return descricao;
    }
}

Você pode implementar dois TreeNode utilizando duas inner classes:

  • uma para ser o elemento raíz e renderizar a lista de períodos
  • outra para renderizar cada período ou cada disciplina

Veja a tela de exemplo abaixo:

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.util.LinkedList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;

@SuppressWarnings("serial")
public class TelaExemplo extends JFrame {

    /**
     * Ponto de entrada do programa
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            TelaExemplo tela = new TelaExemplo();
            tela.setDefaultCloseOperation(EXIT_ON_CLOSE);
            tela.setLocationRelativeTo(null);
            tela.setVisible(true);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    /**
     * Um TreeNode raíz para a lista de períodos
     */
    private class TreeNodeRaiz extends DefaultMutableTreeNode {

        private List<Periodo> periodos;

        TreeNodeRaiz(List<Periodo> periodos) {
            super("Períodos");
            this.periodos = periodos;
        }

        @Override
        public TreeNode getChildAt(int index) {
            if (periodos.isEmpty()) {
                return null;
            }
            Periodo periodo = periodos.get(index);
            return new TreeNodeFilho(periodo);
        }

        @Override
        public int getChildCount() {
            return periodos.size();
        }

        @Override
        public boolean isLeaf() {
            return periodos.isEmpty();
        }
    }

    /**
     * Um TreeNode filho que serve tanto para cada periodo quanto para cada disciplina
     */
    private class TreeNodeFilho extends DefaultMutableTreeNode {

        TreeNodeFilho(Object conteudo) {
            super(conteudo);
        }

        @Override
        public TreeNode getChildAt(int index) {
            if (isLeaf()) {
                return null;
            }
            Periodo periodo = (Periodo) getUserObject();
            List<Disciplina> disciplinas = periodo.getDisciplinas();
            Disciplina disciplina = disciplinas.get(index);
            return new TreeNodeFilho(disciplina);
        }

        @Override
        public int getChildCount() {
            if (isLeaf()) {
                return 0;
            }
            Periodo periodo = (Periodo) getUserObject();
            List<Disciplina> disciplinas = periodo.getDisciplinas();
            return disciplinas.size();
        }

        @Override
        public boolean isLeaf() {
            Object conteudo = getUserObject();
            if (conteudo instanceof Disciplina) {
                return true;
            }
            Periodo periodo = (Periodo) conteudo;
            return periodo.getDisciplinas().isEmpty();
        }

        @Override
        public String toString() {
            Object conteudo = getUserObject();
            if (conteudo instanceof Disciplina) {
                Disciplina disciplina = (Disciplina) conteudo;
                return disciplina.getDescricao();
            }
            Periodo periodo = (Periodo) getUserObject();
            return periodo.getDescricao();
        }

    }

    /**
     * Construtor da tela
     */
    public TelaExemplo() {
        super("Tela de Exemplo");
        Dimension tamanho = new Dimension(640, 480);
        setMinimumSize(tamanho);

        List<Periodo> periodos = carregarPeriodos();
        TreeNode raiz = new TreeNodeRaiz(periodos);
        TreeModel treeModel = new DefaultTreeModel(raiz);

        JTree tree = new JTree(treeModel);
        JScrollPane scrollPane = new JScrollPane(tree);

        Container container = getContentPane();
        container.setLayout(new BorderLayout());
        container.add(scrollPane, BorderLayout.CENTER);
    }

    /**
     * Aqui você vai implementar a inicialização dos períodos e disciplinas lendo do seu banco de dados.
     */
    private List<Periodo> carregarPeriodos() {
        Periodo periodo1 = new Periodo("1\u00BA Periodo");
        periodo1.getDisciplinas().add(new Disciplina("Disciplina 1"));
        periodo1.getDisciplinas().add(new Disciplina("Disciplina 2"));

        Periodo periodo2 = new Periodo("2\u00BA Periodo");
        periodo2.getDisciplinas().add(new Disciplina("Disciplina 3"));
        periodo2.getDisciplinas().add(new Disciplina("Disciplina 4"));

        Periodo periodo3 = new Periodo("3\u00BA Periodo");
        periodo3.getDisciplinas().add(new Disciplina("Disciplina 5"));
        periodo3.getDisciplinas().add(new Disciplina("Disciplina 6"));

        List<Periodo> periodos = new LinkedList<>();
        periodos.add(periodo1);
        periodos.add(periodo2);
        periodos.add(periodo3);
        return periodos;
    }
}
1 curtida

Nossa cara valeu mesmo, ajudou bastante. Tava super preso nisso faz uns dias. Valeu mesmo

1 curtida