TreeTable no Swing

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

É 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:

1 curtida

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

1 curtida

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?

1 curtida

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.