Ajuda com jTable e ArrayList

Eu criei uma GUI com alguns campos para inserir informações, um botão para cadastrar as informações na ArrayList e uma jTable para visualizar as informações da ArrayList. O código está funcionando até certo ponto. Eu insiro as informações no campo, gravo as informações na ArrayList ao pressionar o botão e elas aparecem na jTable. O problema é que elas estão aparecendo com informações repetidas a cada linha.
Por exemplo: eu insiro 3 informações em 3 campos diferentes, “nome”, “cpf” e “rg”. E na jTable é repetidas essas informações 3 vezes, ou seja, existem 3 linhas com as mesmas informações. E após inserir essas primeiras informações, caso eu queria inserir novas, ao digitar outros valores nos campos, vai alterar os 3 valores já listados e adicionar mais 3, ficando assim com 6 linhas repetidas.

Scanner scan = new Scanner(System.in);
Funcionario func = new Funcionario();
ArrayList funcionario = new ArrayList();

private void btn_cadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                              
    funcionario.add(c_nome);
    funcionario.add(c_data);
    funcionario.add(c_cargo);
    funcionario.add(c_cpf);
    funcionario.add(c_rg);
    funcionario.add(c_salario);
    funcionario.add(c_rua);
    funcionario.add(c_bairro);
    funcionario.add(c_casa);
    JOptionPane.showMessageDialog(rootPane, "Funcionário Cadastrado com sucesso.");

    DefaultTableModel tabela = (DefaultTableModel) tbFuncionarios.getModel();
    tabela.setNumRows(0);
    
    for(Object f1 : funcionario){
        tabela.addRow(new Object[]{
        this.c_nome.getText(), c_data.getText(), this.c_cargo.getText(), this.c_cpf.getText(), 
        this.c_rg.getText(), this.c_salario.getText(), this.c_rua.getText(), this.c_bairro.getText(), this.c_casa.getText()}); 
    }
}

Ajusta essa linha:

ArrayList funcionario = new ArrayList();

Pra ficar assim:

List<Funcionario> funcionarios = new ArrayList<>();

Depois cria o seu próprio TableModelUsuario estendendo a classe AbstractTableModel, aí é só renderizar os elementos da sua lista de funcionários.

Aí implemente seu cadastro assim:

private void btn_cadastrarActionPerformed(java.awt.event.ActionEvent evt) {
    Funcionario novo = new Funcionario();
    novo.setNome(c_nome.getText());
    novo.setData(c_data.getText());
    novo.setCargo(c_cargo.getText());
    novo.setCpf(c_cpf.getText());
    novo.setRg(c_rg.getText());
    novo.setSalario(c_salario.getText());
    novo.setRua(c_rua.getText());
    novo.setBairro(c_bairro.getText());
    novo.setCasa(c_casa.getText());

    TableModelUsuario tableModel = (TableModelUsuario) tbFuncionarios.getModel();
    tableModel.addFuncionario(novo);
    
    JOptionPane.showMessageDialog(rootPane, "Funcionário Cadastrado com sucesso.");
}

Sou iniciante, não teria um jeito de fazer isso com o DefaultTableModel?

De tudo, o “tableModel.addFuncionario(novo)” deu erro no “addFuncionario”. Fica pedindo pra criar um método

Sim, você precisa criar ele, nada é automágico. :slight_smile:

Se é iniciante, é uma ótima oportunidade para criar seu próprio TableModel e fazer do jeito certo.
Você já está se incomodando com o DefaultTableModel e quer continuar com ele?
Ele só é prático para conteúdo estático.

Então, eu fiz aqui como você falou, e antes de rodar, não apresentou nenhum erro. Ao rodar, ele apresentou esse erro:

“Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException: projeto.pkg01.Cadastrar$2 cannot be cast to projeto.pkg01.TableModelFuncionario”

Você está fazendo cast de uma classe anônima para TableModelFuncionario, não vai funcionar.

Posta o codigo da sua tela.

Scanner scan = new Scanner(System.in);
// Funcionario func = new Funcionario();
List funcionarios = new ArrayList<>();

private void btn_cadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                              
    Funcionario novo = new Funcionario();
    novo.setNome(c_nome.getText());
    novo.setData(c_data.getText());
    novo.setCargo(c_cargo.getText());
    novo.setCpf(Long.parseLong(c_cpf.getText()));
    novo.setRg(Long.parseLong(c_rg.getText()));
    novo.setSalario(Double.parseDouble(c_salario.getText()));
    novo.setRua(c_rua.getText());
    novo.setBairro(c_bairro.getText());
    novo.setCasa(Integer.parseInt(c_casa.getText()));

    TableModelFuncionario tabela = (TableModelFuncionario) tbFuncionarios.getModel();
    tabela.addFuncionarios(novo);


    JOptionPane.showMessageDialog(rootPane, "Funcionário Cadastrado com sucesso.");

Não amiguinho… O código completo da tela, você postou somente o método btn_cadastrarActionPerformed.

Cadê o código onde você iniciiza a JTable e seta o TableModel dela?

Cadê o fonte do TableModelUsuario?

package projeto.pkg01;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.JTable;

/**
*

  • @author lucas
    */
    public class Cadastrar extends javax.swing.JFrame {

    JTable tbFuncionario = new JTable();
    TableModelFuncionario tableModel = new TableModelFuncionario();

    public Cadastrar() {
    initComponents();
    tbFuncionarios.setModel(tableModel);
    }

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

     jPanel1 = new javax.swing.JPanel();
     jLabel1 = new javax.swing.JLabel();
     jLabel2 = new javax.swing.JLabel();
     c_nome = new javax.swing.JTextField();
     jLabel3 = new javax.swing.JLabel();
     c_data = new javax.swing.JTextField();
     jLabel4 = new javax.swing.JLabel();
     c_cargo = new javax.swing.JTextField();
     jLabel5 = new javax.swing.JLabel();
     c_cpf = new javax.swing.JTextField();
     jLabel6 = new javax.swing.JLabel();
     c_rg = new javax.swing.JTextField();
     jLabel7 = new javax.swing.JLabel();
     c_salario = new javax.swing.JTextField();
     jLabel9 = new javax.swing.JLabel();
     jLabel10 = new javax.swing.JLabel();
     jLabel11 = new javax.swing.JLabel();
     c_rua = new javax.swing.JTextField();
     c_bairro = new javax.swing.JTextField();
     c_casa = new javax.swing.JTextField();
     btn_cadastrar = new javax.swing.JButton();
     btn_cancelar = new javax.swing.JButton();
     jPanel4 = new javax.swing.JPanel();
     jScrollPane1 = new javax.swing.JScrollPane();
     tbFuncionarios = new javax.swing.JTable();
     jLabel8 = new javax.swing.JLabel();
     btn_deletar1 = new javax.swing.JButton();
     btn_deletar2 = new javax.swing.JButton();
    
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
     setResizable(false);
    
     jLabel1.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
     jLabel1.setText("Cadastrar Funcionário");
    
     jLabel2.setText("Nome:");
    
     jLabel3.setText("Data de Nascimento: ");
    
     jLabel4.setText("Cargo:");
    
     jLabel5.setText("CPF:");
    
     jLabel6.setText("RG:");
    
     jLabel7.setText("Salário:");
    
     jLabel9.setText("Rua:");
    
     jLabel10.setText("Bairro:");
    
     jLabel11.setText("nº da Casa:");
    
     btn_cadastrar.setText("Cadastrar");
     btn_cadastrar.addActionListener(new java.awt.event.ActionListener() {
         public void actionPerformed(java.awt.event.ActionEvent evt) {
             btn_cadastrarActionPerformed(evt);
         }
     });
    
     btn_cancelar.setText("Cancelar");
    
     javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
     jPanel1.setLayout(jPanel1Layout);
     jPanel1Layout.setHorizontalGroup(
         jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(jPanel1Layout.createSequentialGroup()
             .addContainerGap()
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                 .addGroup(jPanel1Layout.createSequentialGroup()
                     .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                         .addGroup(jPanel1Layout.createSequentialGroup()
                             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                 .addComponent(jLabel2)
                                 .addComponent(jLabel3)
                                 .addComponent(jLabel4))
                             .addGap(28, 28, 28)
                             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                 .addComponent(c_cargo)
                                 .addComponent(c_data)
                                 .addComponent(c_nome)))
                         .addGroup(jPanel1Layout.createSequentialGroup()
                             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                 .addComponent(jLabel5)
                                 .addComponent(jLabel6)
                                 .addComponent(jLabel7)
                                 .addComponent(jLabel9)
                                 .addComponent(jLabel10)
                                 .addComponent(jLabel11))
                             .addGap(74, 74, 74)
                             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                 .addGroup(jPanel1Layout.createSequentialGroup()
                                     .addGap(0, 0, Short.MAX_VALUE)
                                     .addComponent(btn_cadastrar, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                                     .addGap(31, 31, 31)
                                     .addComponent(btn_cancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                                     .addGap(74, 74, 74))
                                 .addComponent(c_rg, javax.swing.GroupLayout.Alignment.TRAILING)
                                 .addComponent(c_cpf)
                                 .addComponent(c_salario)
                                 .addComponent(c_rua)
                                 .addComponent(c_bairro)
                                 .addComponent(c_casa))))
                     .addContainerGap())
                 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                     .addGap(0, 210, Short.MAX_VALUE)
                     .addComponent(jLabel1)
                     .addGap(212, 212, 212))))
     );
     jPanel1Layout.setVerticalGroup(
         jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(jPanel1Layout.createSequentialGroup()
             .addContainerGap()
             .addComponent(jLabel1)
             .addGap(27, 27, 27)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel2)
                 .addComponent(c_nome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(14, 14, 14)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel3)
                 .addComponent(c_data, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel4)
                 .addComponent(c_cargo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel5)
                 .addComponent(c_cpf, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel6)
                 .addComponent(c_rg, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel7)
                 .addComponent(c_salario, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel9)
                 .addComponent(c_rua, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel10)
                 .addComponent(c_bairro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addGap(18, 18, 18)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(jLabel11)
                 .addComponent(c_casa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
             .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                 .addComponent(btn_cadastrar, javax.swing.GroupLayout.PREFERRED_SIZE, 41, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addComponent(btn_cancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE))
             .addContainerGap())
     );
    
     tbFuncionarios.setModel(new javax.swing.table.DefaultTableModel(
         new Object [][] {
             {null, null, null, null, null, null, null, null, null}
         },
         new String [] {
             "Nome", "Data de Nascimento", "Cargo", "CPF", "RG", "Salário", "Rua", "Bairro", "Casa"
         }
     ) {
         boolean[] canEdit = new boolean [] {
             true, false, false, false, false, false, false, false, false
         };
    
         public boolean isCellEditable(int rowIndex, int columnIndex) {
             return canEdit [columnIndex];
         }
     });
     jScrollPane1.setViewportView(tbFuncionarios);
    
     jLabel8.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
     jLabel8.setText("Funcionários");
    
     btn_deletar1.setText("Deletar");
    
     btn_deletar2.setText("Editar");
    
     javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
     jPanel4.setLayout(jPanel4Layout);
     jPanel4Layout.setHorizontalGroup(
         jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(jPanel4Layout.createSequentialGroup()
             .addContainerGap()
             .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                 .addGroup(jPanel4Layout.createSequentialGroup()
                     .addComponent(jScrollPane1)
                     .addContainerGap())
                 .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
                     .addGap(0, 0, Short.MAX_VALUE)
                     .addComponent(jLabel8)
                     .addGap(319, 319, 319))))
         .addGroup(jPanel4Layout.createSequentialGroup()
             .addGap(459, 459, 459)
             .addComponent(btn_deletar1, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addGap(0, 171, Short.MAX_VALUE))
         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(jPanel4Layout.createSequentialGroup()
                 .addGap(308, 308, 308)
                 .addComponent(btn_deletar2, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addContainerGap(322, Short.MAX_VALUE)))
     );
     jPanel4Layout.setVerticalGroup(
         jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(jPanel4Layout.createSequentialGroup()
             .addContainerGap()
             .addComponent(jLabel8)
             .addGap(27, 27, 27)
             .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 322, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 50, Short.MAX_VALUE)
             .addComponent(btn_deletar1, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addContainerGap())
         .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
             .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
                 .addContainerGap(428, Short.MAX_VALUE)
                 .addComponent(btn_deletar2, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                 .addGap(10, 10, 10)))
     );
    
     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()
             .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
             .addGap(18, 18, 18)
             .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
             .addContainerGap())
     );
     layout.setVerticalGroup(
         layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
         .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
             .addContainerGap()
             .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                 .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                 .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
             .addContainerGap())
     );
    
     pack();
     setLocationRelativeTo(null);
    

    }//

     Scanner scan = new Scanner(System.in);
     List<Funcionario> funcionarios = new ArrayList<>();
    

    private void btn_cadastrarActionPerformed(java.awt.event.ActionEvent evt) {
    Funcionario novo = new Funcionario();
    novo.setNome(c_nome.getText());
    novo.setData(c_data.getText());
    novo.setCargo(c_cargo.getText());
    novo.setCpf(Long.parseLong(c_cpf.getText()));
    novo.setRg(Long.parseLong(c_rg.getText()));
    novo.setSalario(Double.parseDouble(c_salario.getText()));
    novo.setRua(c_rua.getText());
    novo.setBairro(c_bairro.getText());
    novo.setCasa(Integer.parseInt(c_casa.getText()));

     TableModelFuncionario tabela = (TableModelFuncionario) tbFuncionarios.getModel();
     tabela.addFuncionarios(novo);
    
    
     JOptionPane.showMessageDialog(rootPane, "Funcionário Cadastrado com sucesso.");
    

    }

    public static void main(String args[]) {
    /* Set the Nimbus look and feel /
    //
    /
    If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
    */
    try {
    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
    if (“Nimbus”.equals(info.getName())) {
    javax.swing.UIManager.setLookAndFeel(info.getClassName());
    break;
    }
    }
    } catch (ClassNotFoundException ex) {
    java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
    java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
    java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
    java.util.logging.Logger.getLogger(Cadastrar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }
    //

     /* Create and display the form */
     java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
             new Cadastrar().setVisible(true);
         }
     });
    

    }

    // Variables declaration - do not modify
    private javax.swing.JButton btn_cadastrar;
    private javax.swing.JButton btn_cancelar;
    private javax.swing.JButton btn_deletar1;
    private javax.swing.JButton btn_deletar2;
    private javax.swing.JTextField c_bairro;
    private javax.swing.JTextField c_cargo;
    private javax.swing.JTextField c_casa;
    private javax.swing.JTextField c_cpf;
    private javax.swing.JTextField c_data;
    private javax.swing.JTextField c_nome;
    private javax.swing.JTextField c_rg;
    private javax.swing.JTextField c_rua;
    private javax.swing.JTextField c_salario;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tbFuncionarios;
    // End of variables declaration
    }

No seu construtor você está instanciando uma JTable e setando corretamente o modelo dela, entretanto essa é só uma variável local e você não faz nada mais com ela.

A JTable que você realmente utiliza está sendo instanciadas dentro do método initComponents e está recebendo o TableModel errado.

Um tempo antes de você responder, eu consegui resolver. O problema é, se por acaso eu deixar um campo em branco e clicar em cadastrar, ele vai apresentar erro. Tem algum jeito de o botão só ficar “clicável” se todos os campos forem preenchidos?