Ordenar e Incluir Imagem no Jtable [RESOLVIDO]

Segue o meu código que estou preenchendo meu JTable

Vi vários exemplos até um que o ViniGodoy passou, só que não consegui colocar no meu.

public void fnCarregaGrid(String[] vCol, Vector rData) throws SQLException, ParseException {

//Defini as colunas
//final String[] colunas = {“id”, “Código”, “Descrição”};
final String[] colunas = vCol;

final Vector rowDatas = new Vector();
rowDatas.addAll(rData);

TableModel dataModel = new AbstractTableModel() {

public int getColumnCount() {
return colunas.length;
}

public int getRowCount() {
return rowDatas.size();
}

public Object getValueAt(int row, int col) {
return ((Vector) rowDatas.elementAt(row)).elementAt(col);
}

public String getColumnName(int column) {
return colunas[column];
}

public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}

public boolean isCellEditable(int row, int col) {
//return col != 2; //Escolha a coluna que não vai ser editável
return false; //Bloquea todas as colunas
}

public void setValueAt(Object aValue, int row, int column) {
((Vector) rowDatas.elementAt(row)).setElementAt(aValue, column);
}
};

tabLista.setModel(dataModel);
tabLista.setRowHeight(20);

tabLista.getColumnModel().getColumn(0).setMinWidth(0);
tabLista.getColumnModel().getColumn(0).setMaxWidth(0);
tabLista.getColumnModel().getColumn(1).setPreferredWidth(70);
tabLista.getColumnModel().getColumn(2).setPreferredWidth(480);
tabLista.getColumnModel().getColumn(3).setPreferredWidth(80);
tabLista.getColumnModel().getColumn(4).setPreferredWidth(50);

}//fim do carrega grid

Agora estou precisando colocar a opção de ordenar o Jtable ao clicar na coluna desejada. só que se eu marcar a opção autoCreateRowSorter dar o seguinte erro java.lang.ArrayIndexOutOfBoundsException: 0 >= 0

Só funciona se eu deixar essa opção como false.

Como tenho que fazer para colocar essa ordenação no JTable?

Broder da uma olhada nisso aki… talvez pode te ajudar…

http://www.guj.com.br/java/79110-dica-jtable—ordenar-coluna-formatada-com-rowsorter

:smiley:

userguj, eu já tinha visto esse tópico… mais como sou iniciante não entendi praticamente nada… não consegui identificar nem como esta sendo carregado o Jtable com os dados.

Alguém poderia me explicar porque o pessoal fala para não usar a forma DefaultTableModel para preencher o Jtable?

Ainda não consegui entender… porque com DefaultTableModel eu uso menos código. Então qual a vantagem de usar o TableModel ou AbstractTableModel não sei qual o nome certo mesmo.

[quote=alexpassos]Alguém poderia me explicar porque o pessoal fala para não usar a forma DefaultTableModel para preencher o Jtable?

Ainda não consegui entender… porque com DefaultTableModel eu uso menos código. Então qual a vantagem de usar o TableModel ou AbstractTableModel não sei qual o nome certo mesmo.
[/quote]

Por favor, veja esse link do próprio ViniGody: http://www.guj.com.br/java/149861-recuperar-id-de-jtable/2#813171
Leia com tudo com atenção, tá muito bem explicado.

Alex, sempre que postar códigos, por favor, use a tag code.

Você já tem 79 posts no fórum, já deveria estar usando isso faz tempo:

Alex, onde está usa classe de negócios? Você deve criar algum objeto para representar seus dados, antes mesmo de começar a manipular o JTable.

Além disso, não seu mais Vector. Ele se tornou obsoleto no Java 1.2, dando lugar ao ArrayList:

Além disso, procure sempre informar o tipo de dado associado ao list ou ao vector usando < >

Existem diversas desvantagens no DefaulTableModel:

  1. É mais difícil;
  2. É mais lento (tem sincronização desnecessária em todos os métodos);
  3. Ocupa mais memória (já que dobra o número de referências para seus dados);
  4. Deixa o seu código de modelo completamente misturados com o código de sua interface gráfica (quebrando o MVC).

Finalmente, o erro que está dando deve estar indicando uma linha em uma de suas classes. Dê uma olhada em toda stack que é impressa, encontre as classes que são suas e destaque para nós que linha é essa em seu código.

ViniGodoy… eu sempre esqueço de colocar o código entre tag code… foi mal…

quanto os 79 tópicos é porque dei uma parada nos estudos e estou retornando.

Eu consegui fazer pesquisando em livro de java que comprei… só que apareceu outro problema agora não consigo inserir imagem no Jtable e antes conseguia.

Veja como ficou:

Criei uma classe clsTabela

package conexao;

import java.sql.*;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.table.AbstractTableModel;
/**
 *
 * @author Alex Passos
 */
public class clsTabela extends AbstractTableModel {

    private int rownum;

    //Nome das colunas
    private static final String[] colNames={
        "ID", "Descrição"
    };

    private ArrayList<String[]>ResultSet;

    private ResultSetMetaData metaData;

    public clsTabela(ResultSet rs) throws SQLException {
       //Chama o método setResult
        setResult(rs);
    }

    public Object getValueAt (int rowIndex, int columnIndex){
        String[] row=ResultSet.get(rowIndex);
        return row[columnIndex];
    }

    public int getRowCount(){
        return ResultSet.size();
    }

    public int getColumnCount(){
        return colNames.length;
    }

    public String getColumnName(int param){
        return colNames[param];
    }

    public void setResult(ResultSet rs) throws SQLException{

        ResultSet = new ArrayList<String[]>();

        while (rs.next()){
            //pega os registro do banco
            String[] row={
                rs.getString("id"),
                rs.getString("descricao")};
            
            //Adiciona a matriz ResultSet
            ResultSet.add(row);

            }

        //notifica JTable das alterações
        fireTableStructureChanged();

        }

    //método que exclui a linha da tabela
    public void deleteRow(int row){
        ResultSet.remove(row);
        fireTableRowsDeleted(row,row);

    }

}

Depois no jFrame criei o método

[code] private ResultSet getResults() {
ResultSet rs = null;
try {

        stm = con.createStatement();
        rs = stm.executeQuery("select * from cidades");

    } catch (SQLException e) {
    }
    return rs;
}

[/code]

Chamei assim

tabela = new clsTabela(getResults()); jTab.setModel(tabela);

Ai a ordenação funcionou perfeitamente… só que agora não consigo mais inserir uma imagem. Estou pesquisando e não estou encontrando um código que consiga encaixar nessa ai.

O ideal seria você ter uma classe chamada Cidade, com o id e Descricao. Uma classe que carregasse as cidades do banco e criasse um List<Cidade>, e então isso você forneceria ao seu model.

Até porque, não se deve tratar outros tipos de dados (como é o caso do int do id) como Strings.
Isso pode gerar comportamento estranho no seu sistema, caso você ordene por id, por exemplo (o 10 ficará na frente do 2, pois começa com 1).

Onde você quer inserir uma imagem? E que imagem você vai inserir?

Eu estou precisando fazer o seguinte:

Tem ai as duas colunas ID e Descrição

Eu queria adicionar mais duas colunas para colocar imagens de Editar e Excluir para o usuário clicar.

Então ficaria assim:

ID - Descrição - Editar - Excluir

As imagens são *.png

ViniGodoy… refiz as classes e consegui fazer seguindo o exemplo e da forma ideal que você falou.

Segue:

Classe colCidades

[code]package tabela;

/**

  • @author Alex Passos
    */
    public class colCidades {

    private String vId;
    private String vDescricao;

    public String getID(){
    return vId;
    }

    public void setID(String id){
    vId = id;
    }

    public String getDescricao(){
    return vDescricao;
    }

    public void setDescricao(String descricao){
    vDescricao = descricao;
    }

}[/code]

Classe cidadeTableModel

package tabela;

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 * @author Alex Passos
 */
public class cidadeTableModel extends AbstractTableModel{

    private List<colCidades> linhas;

    private String[] cColunas = new String[]{"ID", "Descrição"};

    public cidadeTableModel(){
        linhas = new ArrayList<colCidades>();
    }

    public cidadeTableModel(List<colCidades> listaCidades){
        linhas = new ArrayList<colCidades>(listaCidades);
    }

    @Override
    public int getColumnCount(){
        return cColunas.length;
    }

    @Override
    public int getRowCount(){
        return linhas.size();
    }

    @Override
    public String getColumnName(int columnIndex){
        return cColunas[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex){

        switch (columnIndex){
            case 0:
                return Integer.class;
            case 1:
                return String.class;
            default:
                throw new IndexOutOfBoundsException("ColumnIndex out of bounds");
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex){

        colCidades cCidades = linhas.get(rowIndex);

        switch (columnIndex){
            case 0:
                return cCidades.getID();
            case 1:
                return cCidades.getDescricao();
            default:
                throw new IndexOutOfBoundsException("Column out of bounds");
        }
    }

    public void setValutAt(Object aValue, int rowIndex, int columnIndex){};

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        return false;
    }

    public colCidades getCidades(int indiceLinha){
        return linhas.get(indiceLinha);
    }

    public void addCidades (colCidades cidades){

        linhas.add(cidades);

        int ultimoIndice = getRowCount() - 1;

        fireTableRowsInserted(ultimoIndice, ultimoIndice);

    }

    public void removeCidade(int indiceLinha){
        linhas.remove(indiceLinha);
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }

    public void addListaCidades(List<colCidades> cidades){

        int tamanhoAntigo = getRowCount();

        linhas.addAll(cidades);

        fireTableRowsInserted(tamanhoAntigo, getRowCount() -1);
        
    }

    public void limpar(){
        linhas.clear();
        fireTableDataChanged();
    }

    public boolean isEmpty(){
        return linhas.isEmpty();
    }


}

E no JFrame frmCidades eu fiz assim:

[code]package tabela;

import conexao.conexao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**

  • @author Alex Passos
    */
    public class frmCidades extends javax.swing.JFrame {

    public static Connection con = conexao.conexao;
    private Statement stm;
    private ResultSet rs;
    private cidadeTableModel modelCidade;

    public frmCidades() throws SQLException {
    initComponents();

     jTab.setModel(new cidadeTableModel());
     jTab.setAutoCreateRowSorter(true);
     jTab.getColumnModel().getColumn(0).setPreferredWidth(100);
     jTab.getColumnModel().getColumn(1).setPreferredWidth(100);
    
     try {
    
         getModel().limpar();
    
         stm = con.createStatement();
         rs = stm.executeQuery("select * from cidades");
    
         while (rs.next()) {
             addCidade(rs.getString("id"), rs.getString("descricao"));
         }
    
     } catch (SQLException erro) {
     }
    

    }

    private cidadeTableModel getModel() {
    if (modelCidade == null) {
    modelCidade = (cidadeTableModel) jTab.getModel();
    }
    return modelCidade;
    }

    private colCidades getCidade(String id, String descricao) {

     colCidades cCidades = new colCidades();
     cCidades.setID(id);
     cCidades.setDescricao(descricao);
    
     return cCidades;
    

    }

    private void addCidade(String id, String descricao) {
    getModel().addCidades(getCidade(id, descricao));
    }

    @SuppressWarnings(“unchecked”)
    //
    private void initComponents() {

     jScrollPane1 = new javax.swing.JScrollPane();
     jTab = new javax.swing.JTable();
    
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    
     jTab.setModel(new javax.swing.table.DefaultTableModel(
         new Object [][] {
             {null, null, null, null},
             {null, null, null, null},
             {null, null, null, null},
             {null, null, null, null}
         },
         new String [] {
             "Title 1", "Title 2", "Title 3", "Title 4"
         }
     ));
     jScrollPane1.setViewportView(jTab);
    
     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
     getContentPane().setLayout(layout);
     layout.setHorizontalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(layout.createSequentialGroup()
             .addContainerGap(91, Short.MAX_VALUE)
             .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addGap(84, 84, 84))
     );
     layout.setVerticalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
             .addContainerGap(110, Short.MAX_VALUE)
             .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 317, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addContainerGap())
     );
    
     pack();
    

    }//

    /**

    • @param args the command line arguments
      */
      public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {

       @Override
       public void run() {
           try {
               new frmCidades().setVisible(true);
           } catch (SQLException ex) {
               Logger.getLogger(frmCidades.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
      

      });
      }
      // Variables declaration - do not modify
      private javax.swing.JScrollPane jScrollPane1;
      private javax.swing.JTable jTab;
      // End of variables declaration
      }
      [/code]

Agora dando seguimento ao post anterior como eu faço para adicionar mais duas colunas com imagens ficando assim:

ID - Descrição - Editar - Excluir
1 - Cidade - Imagem - Imagem

Alguém poderia me ajudar

Ok. Para inserir colunas no seu JTable, você precisa agora criar um TableCellRenderer personalizado. O tablemodel terá que retornar alguns valores especiais naquelas colunas, como o nome da imagem do excluir e editar, respectivamente.

Dê uma lida:
http://download.oracle.com/javase/tutorial/uiswing/components/table.html
http://www.devx.com/getHelpOn/10MinuteSolution/20425

Cara não entendi…

Onde eu tenho que criar esse TableCellRenderer dentro da classe

public class cidadeTableModel extends AbstractTableModel{

Ou tenho que criar uma outra classe? fiquei confuso agora

Você não poderia me mostrar como fazer? Considerando que já pesquisei e consegui fazer pelo menos 90%.

Você tem que criar outra classe.

O CellRenderer é a classe responsável por “desenhar” uma célula do JTable. Na hora de desenhar a célula, o JTable faz o seguinte:

a) Procura um CellRenderer para aquela coluna, se tiver, usa;
b) Se não tiver, pergunta o TableModel qual é a classe da célula;
c) Procura um CellRenderer default para aquela classe,se tiver, usa;
d) Se não tiver, usa o Default.

Você deve registrar o CellRenderer usando o método
JTable.setDefaultRenderer(Class, TableCellRenderer);

No segundo link que te passei, há um exemplo de CellRenderer para botões.

Mais nesse exemplo ai esta totalmente diferente do que você me pediu que eu mudasse o que seria o ideal segundo você.

Que são as últimas classes crias e postadas anteriormente.

Eu criei uma classe assim:

[code]
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;

/**

  • @author Alex Passos
    */
    public class JTableRenderer extends DefaultTableCellRenderer {

    protected void setValue(Object value){

     if (value instanceof ImageIcon){
    
         if (value != null){
             ImageIcon d = (ImageIcon) value;
             setIcon(d);
         } else{
             setText("");
             setIcon(null);
         }
         
     } else {
         super.setValue(value);
     }
    

    }// fim da função

}[/code]

E chamei assim:

[code] jTab.setModel(new cidadeTableModel());
jTab.setAutoCreateRowSorter(true);

    TableColumnModel ColumnModel =jTab.getColumnModel();
    JTableRenderer renderer = new JTableRenderer();
     TableColumn column = jTab.getColumnModel().getColumn(0);
    column.setCellRenderer(renderer);[/code]

E carreguei os dados assim:

[code]try {

         URL editar = this.getClass().getResource("D:/Imagens/Ícones/agenda.png");

// new ImageIcon(editar)

        getModel().limpar();

        stm = con.createStatement();
        rs = stm.executeQuery("select * from cidades");

        while (rs.next()) {
            addCidade(rs.getString("id"), rs.getString("descricao"));
        }

    } catch (SQLException erro) {
    }[/code]

Só que a imagem não aparece… continua aparecendo o texto

Se eu adiciono essa variável editar em qualquer coluna ai fica dando erro

UUUFFFFFAAAA… depois de 3 dias quebrando a cabeça consegui fazer do jeito que estou querendo…

Muito obrigado ViniGodoy pela atenção.

Vou postar as classes aqui pra que se outra pessoa precisar não ficar tanto tempo pra resolver o problema… porque hoje em dia tempo é dinheiro.

Segue a classe JTableRenderer (imagem)

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author Alex Passos
 */
public class JTableRenderer extends DefaultTableCellRenderer  {

    protected void setValue(Object value){

        if (value instanceof ImageIcon){

            if (value != null){
                ImageIcon d = (ImageIcon) value;
                setIcon(d);
            } else{
                setText("");
                setIcon(null);
            }
            
        } else {
            super.setValue(value);
        }
        
    }// fim da função
    
}

Classe colCidades

[code]
import javax.swing.Icon;

/**

  • @author Alex Passos
    */
    public class colCidades {

    private String vId;
    private String vDescricao;
    private Icon vEditar;
    private Icon vExcluir;

    public String getID(){
    return vId;
    }

    public void setID(String id){
    vId = id;
    }

    public String getDescricao(){
    return vDescricao;
    }

    public void setDescricao(String descricao){
    vDescricao = descricao;
    }

    public Icon getEditar(){
    return vEditar;
    }

    public void setEditar(Icon editar){
    vEditar = editar;
    }

    public Icon getExcluir(){
    return vExcluir;
    }

    public void setExcluir(Icon excluir){
    vExcluir = excluir;
    }

}[/code]

Classe cidadeTableModel

import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import javax.swing.table.*;

/**
 * @author Alex Passos
 */

 
public class cidadeTableModel extends AbstractTableModel{

    private List<colCidades> linhas;

    private String[] cColunas = new String[]{"ID", "Descrição", "Editar", "Excluir"};

    public cidadeTableModel(){
        linhas = new ArrayList<colCidades>();
    }

    public cidadeTableModel(List<colCidades> listaCidades){
        linhas = new ArrayList<colCidades>(listaCidades);
    }

    @Override
    public int getColumnCount(){
        return cColunas.length;
    }

    @Override
    public int getRowCount(){
        return linhas.size();
    }

    @Override
    public String getColumnName(int columnIndex){
        return cColunas[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex){

        switch (columnIndex){
            case 0:
                return String.class;
            case 1:
                return String.class;
            case 2:
                return Image.class;
            case 3:
                return Image.class;
            default:
                throw new IndexOutOfBoundsException("ColumnIndex out of bounds");
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex){

        colCidades cCidades = linhas.get(rowIndex);

        switch (columnIndex){
            case 0:
                return cCidades.getID();
            case 1:
                return cCidades.getDescricao();
            case 2:
                return cCidades.getEditar();
            case 3:
                return cCidades.getExcluir();
            default:
                throw new IndexOutOfBoundsException("Column out of bounds");
        }
    }

    public void setValutAt(Object aValue, int rowIndex, int columnIndex){};

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        return false;
    }

    public colCidades getCidades(int indiceLinha){
        return linhas.get(indiceLinha);
    }

    public void addCidades (colCidades cidades){

        linhas.add(cidades);

        int ultimoIndice = getRowCount() - 1;

        fireTableRowsInserted(ultimoIndice, ultimoIndice);

    }

    public void removeCidade(int indiceLinha){
        linhas.remove(indiceLinha);
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }

    public void addListaCidades(List<colCidades> cidades){

        int tamanhoAntigo = getRowCount();

        linhas.addAll(cidades);

        fireTableRowsInserted(tamanhoAntigo, getRowCount() -1);
        
    }

    public void limpar(){
        linhas.clear();
        fireTableDataChanged();
    }

    public boolean isEmpty(){
        return linhas.isEmpty();
    }


}

Classe de utilização JFrame ( frmCidades )

[code]
import conexao.conexao;
import java.net.URL;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;

/**

  • @author Alex Passos
    */
    public class frmCidades extends javax.swing.JFrame {

    public static Connection con = conexao.conexao;
    private Statement stm;
    private ResultSet rs;
    private cidadeTableModel modelCidade;

    public frmCidades() throws SQLException {
    initComponents();

     jTab.setModel(new cidadeTableModel());
     jTab.setAutoCreateRowSorter(true);
     jTab.setRowHeight(30);
    
     TableColumnModel ColumnModel = jTab.getColumnModel();
     JTableRenderer renderer = new JTableRenderer();
     ColumnModel.getColumn(2).setCellRenderer(renderer);
     ColumnModel.getColumn(3).setCellRenderer(renderer);
    
     jTab.getColumnModel().getColumn(0).setPreferredWidth(10);
     jTab.getColumnModel().getColumn(1).setPreferredWidth(250);
     jTab.getColumnModel().getColumn(2).setPreferredWidth(20);
     jTab.getColumnModel().getColumn(3).setPreferredWidth(20);
    
     try {
    
         Icon editar = new ImageIcon("D:/Imagens/Ícones/table_edit24.png");
         Icon excluir = new ImageIcon("D:/Imagens/Ícones/table_delete24.png");
    
         getModel().limpar();
    
         stm = con.createStatement();
         rs = stm.executeQuery("select * from cidades");
    
         while (rs.next()) {
             addCidade(rs.getString("id"), rs.getString("descricao"), editar, excluir);
         }
    
     } catch (SQLException erro) {
     }
    

    }

    private cidadeTableModel getModel() {
    if (modelCidade == null) {
    modelCidade = (cidadeTableModel) jTab.getModel();
    }
    return modelCidade;
    }

    private colCidades getCidade(String id, String descricao, Icon editar, Icon excluir) {

     colCidades cCidades = new colCidades();
     cCidades.setID(id);
     cCidades.setDescricao(descricao);
     cCidades.setEditar(editar);
     cCidades.setExcluir(excluir);
    
     return cCidades;
    

    }

    private void addCidade(String id, String descricao, Icon editar, Icon excluir) {
    getModel().addCidades(getCidade(id, descricao, editar, excluir));
    }

    @SuppressWarnings(“unchecked”)
    //
    private void initComponents() {

     jScrollPane1 = new javax.swing.JScrollPane();
     jTab = new javax.swing.JTable();
    
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     setTitle("Cidade");
     getContentPane().setLayout(new java.awt.FlowLayout());
    
     jTab.setModel(new javax.swing.table.DefaultTableModel(
         new Object [][] {
             {null, null, null, null},
             {null, null, null, null},
             {null, null, null, null},
             {null, null, null, null}
         },
         new String [] {
             "Title 1", "Title 2", "Title 3", "Title 4"
         }
     ));
     jScrollPane1.setViewportView(jTab);
    
     getContentPane().add(jScrollPane1);
    
     pack();
    

    }//

    /**

    • @param args the command line arguments
      */
      public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {

       @Override
       public void run() {
           try {
               new frmCidades().setVisible(true);
           } catch (SQLException ex) {
               Logger.getLogger(frmCidades.class.getName()).log(Level.SEVERE, null, ex);
           }
       }
      

      });
      }
      // Variables declaration - do not modify
      private javax.swing.JScrollPane jScrollPane1;
      private javax.swing.JTable jTab;
      // End of variables declaration
      }[/code]

Até mais… que Deus abençoe

Imagem do resultado final