TreeTable no Swing

4 respostas
java
Alyesson

Queria saber se a estrutura (abaixo) TreeTable não consegue ser colocada no Swing, porque eu tenho procurado algo relacionado mas só acho no JavaFx, até achei algumas coisas mas são de 1900 e bolinha e não serve, falaram aqui no Guj do (2007) Swinglabs, porém o site não existe mais e os código que achei estão confusos e outros não funcionaram… nem no Youtube consegui achar algo ensinando a colocar no Swing… é possível ou não?

image

4 Respostas

staroski

É possível sim, vai dar um pouco de trabalho pois você precisa definir um JTree como sendo o TableCellRenderer de sua JTable.

Se você ainda não conhece ou não domina a estrutura MVC do Swing, recomendo primeiro estudar como funciona a JTree com o TreeModel e a JTable com TableModel, TableCellRenderer, TableCellEditor.

Se já conhece, então este exemplo vai lhe ser útil, pois ele define uma classe JTreeTable que renderiza um TreeTableModel.

Então basicamente você vai implementar o seu próprio TreeTableModel para renderizar a estrutura de itens e subitens que você mostrou.
Você pode se basear na classe FileSystemModel que tem no exemplo.
Feito isso, você vai passar esse TreeTableModel como parâmetro pro construtor da JTreeTable. :smiley:

Eu copiei o sources.zip e compilei na minha máquina, alterando somente o método main para usar o Look and Feel do sistema operacional (Windows 10) e obtive o seguinte resultado:

rodriguesabner

Cara, eu queria muito ter tido aula com vc, acho q eu estaria em outro nível hoje. Parabéns

Alyesson

Olá Staroski,

Eu consegui fazer o TreeTable, está funcionando certo, ele puxa as informações do meu banco certinho, porém eu só queria deixar de um jeito, queria que ele agrupasse os grupo veja:

eu queria que ele mostrasse apenas uma folder com “Grupo A” e todos os documentos abaixo dele, eu fiz o seguinte código pra mostrar como na foto:

private void mostraTabela(){

conectaRisco = new ConexaoBD();

conectaRisco.conecta();

try{

PreparedStatement pstmt = conectaRisco.conexao.prepareStatement(Select grupoRisco,idRisco,tituloRisco,classificacaoRisco,localRisco,localEspecificoRisco,situacao,dataAbertura,dataEncerramento from sgq_crsc02);

ResultSet rs = pstmt.executeQuery();
while (rs.next()){
           
            content.add(new String[] {rs.getString("grupoRisco")});
            content.add(new String[] {"",rs.getString("idRisco"),
                rs.getString("tituloRisco"),
                rs.getString("classificacaoRisco"),
                rs.getString("localRisco"),
                rs.getString("localEspecificoRisco"),
                rs.getString("situacao"),
                dataFormato3.format(rs.getDate("dataAbertura")),
                dataFormato3.format(rs.getDate("dataEncerramento"))});   
                
	TreeTable treeTable = new TreeTable(content);

            tabelaDeRiscos.setSize(500, 500);
	tabelaDeRiscos.setLayout(new BorderLayout());
	tabelaDeRiscos.add(new JScrollPane(treeTable.getTreeTable()), BorderLayout.CENTER);
	tabelaDeRiscos.setVisible(true);
      }
    }catch(SQLException erro){
        JOptionPane.showMessageDialog(null,"Erro ao carregar itens da tabela "+erro,"",JOptionPane.ERROR_MESSAGE);
    }        
}

Acredito eu que ele teria que quebrar essa lista: content.add(new String[] {rs.getString(“grupoRisco”)});

Para poder formar do jeito que quero, mas não sei se é isso, ou se é, não consegui fazer ainda… sabe se dá pra fazer?

staroski

Sim, eu sugiro que, ao invés de usar arrays de String, crie uma estrutura de classes por exemplo uma classe Grupo que agrega uma lista de outra classe, Documento.

E na hora de montar a partir do seu select do banco, você pode utilizar um Map<String, Grupo> para guardar a instância de cada grupo utilizando como chave o nome dele.

Criado 16 de setembro de 2020
Ultima resposta 17 de set. de 2020
Respostas 4
Participantes 3