Colunas e dados não são apresentados no jTable

Bom dia pessoal.
Estou estudando e procurando inserir colunas e dados em um jTable mas não está dando certo. Nem as colunas e nem os dados estão sendo apresentado nem de forma estática e nem através de um DefaultTableModel. É um assunto muito visto nos fóruns e com relação as colunas todas as informações é que o jTable dev ser inserido em um ScrollPane. Mas não está dando, não só as colunas, mas as linhas com dados também não estão sendo apresentadas. Vou postar o que fiz apenas de forma estática para simplificar.
Tenhos um classe ListarContato com as seguintes rotinas de um artigo da web:
JPanel painelFundo;
JTable tabela;
JScrollPane barraRolagem;

     Object [][] dados = {
        {"Ana Monteiro", "48 9923-7898", "ana.monteiro@gmail.com"},
        {"João da Silva", "48 8890-3345", "joaosilva@hotmail.com"},
        {"Pedro Cascaes", "48 9870-5634", "pedrinho@gmail.com"}
        };
       String [] colunas = {"Nome", "Telefone", "Email"};
    
       public void criarJanela(){
                 painelFundo = new JPanel();
                 painelFundo.setLayout(new GridLayout(1, 1));
                 JTable tabela = new JTable(dados,colunas);
                 barraRolagem = new JScrollPane(tabela);
                 painelFundo.add(barraRolagem); 
     
               getContentPane().add(painelFundo);
               setDefaultCloseOperation(EXIT_ON_CLOSE);
               setSize(900, 400);
               setVisible(true);
 }

Em um botão Chamo o metodo criarJanela.
Agradeço pela ajuda.

Bom dia. Se for da forma que vc está fazendo é bem simples.

    private void BuscarNewUser() {

    String[][] dados = {
        {"Ana Monteiro", "48 9923-7898", "ana.monteiro@gmail.com"},
        {"João da Silva", "48 8890-3345", "joaosilva@hotmail.com"},
        {"Pedro Cascaes", "48 9870-5634", "pedrinho@gmail.com"}
    };

    DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
    model.setNumRows(0);
    for (int i = 0; i < dados.length; i++) {

        String[] linha = {dados[i][0], dados[i][1], dados[i][2]};
        model.addRow(linha);
    }

}

------- para meu Jtable fiz assim: ----
jTable1 = new javax.swing.JTable();
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
“Nome”, “telefone”, “email”
}
));

jScrollPane3.setViewportView(jTable1);

Gustavo obrigado pela ajuda e desculpe por demorar para responder.
Analizando o código que você postou e outros artigos da web, vai pra lá e vem prá cá, tenta assim, tenta de novo e consegui preencher o nome das colunas e preencher as linhas com dados gravados no bd, que é o que eu realmente preciso. Já é alguma coisa.Fiz através do DefaultTableModel. Mas ainda tem problema mesmo dessa forma, apesar do avanço: O registro apresentado na tabela é o último registro da tabela do bd. Esse registro é apresentado tantas vezes quanto for o número de registros gravados. O código é o abaixo:

private DefaultTableModel modelo = new DefaultTableModel();

private void criaJTable() {
tabela = new JTable(modelo);
jTable1.setModel(modelo);
modelo.addColumn(“Id”);
modelo.addColumn(“Nome”);
modelo.addColumn(“Telefone”);
modelo.addColumn(“Email”);
tabela.getColumnModel().getColumn(0).setPreferredWidth(10);
tabela.getColumnModel().getColumn(1).setPreferredWidth(120);
tabela.getColumnModel().getColumn(1).setPreferredWidth(80);
tabela.getColumnModel().getColumn(1).setPreferredWidth(120);
JScrollPane scrollpane = new JScrollPane(tabela);
getContentPane().add(scrollpane);
pesquisar(modelo);
}

public static void pesquisar(DefaultTableModel modelo) {
    modelo.setNumRows(0);
    ContatoDao dao = new ContatoDao();

    for (Contato c: dao.getContatos()) {
        modelo.addRow(new Object[]{c.getId(), c.getNome(), c.getTelefone(), c.getEmail()});
        
    }
            
} 

Sei que depois de entender DefaultTableModel é preciso dominar o AbstractTableModel. Obrigado pela atenção de todos.

O problema deve estar no método getContatos da classe ContatoDao.
Provavelmente você só está instanciando um único Contato, alterando ele a cada iteração e adicionando novamente na lista.

staroski, obrigado pela atenção e ajuda.
A recuperação dos dados no bd está sendo feitas da seguinte forma:

private final String LIST = “SELECT * FROM CONTATO”;

public List getContatos() {
Connection conn = null;
PreparedStatement pstm = null;
ResultSet rs = null;
ArrayList contatos = new ArrayList();
try {
conn = FabricaConexao.getConexao();
pstm = conn.prepareStatement(LIST);
rs = pstm.executeQuery();
while (rs.next()) {
Contato contato = new Contato();

            contato.setId(rs.getInt("id"));
            contato.setNome(rs.getString("nome"));
            contato.setTelefone(rs.getString("telefone"));
            contato.setEmail(rs.getString("email"));
            contatos.add(contato);
            JOptionPane.showMessageDialog(null, "Consulta realizada com sucesso kkkkk!");
        }
        FabricaConexao.fechaConexao(conn, pstm, rs);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Erro ao listar contatos" + e.getMessage());
    }
    return contatos;
}

Não estou conseguindo localizar o problema! Agradeço a ajuda.

Então irmãozinho… Esse treco de array bidimensional é meio treta kkkk

É um chute, pois não ando tão afiado com o basicão, mas aqui você não parece estar instanciando um array, pois você é obrigado a dizer o tamanho do seu array:

modelo.addRow(new Object[]{c.getId(), c.getNome(), c.getTelefone(), c.getEmail()});

na minha humilde opinião quando vc usa a palavra reservada “new” pra criar um array vc deve fazer desse jeito:

Object[] linha = new Object[4];
linha[0] = c.getId();
linha[1] = c.getNome();
linha[2] = c.getTelefone();
linha[3] = c.getEmail();

Um array primitivo sempre tem tamanho fixado na sua criação, ou seja, você deve passar o tamanho dele, e esse valor não muda! quando você quer um array dinâmico geralmente é usado List… Mas se vc quer ser um psicopata do primitivo nada te impede de fazer um array recursivo kkkk