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?
É 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
.
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:
Cara, eu queria muito ter tido aula com vc, acho q eu estaria em outro nível hoje. Parabéns
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?
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.