[RESOLVIDO] JTable não adiciona novas linhas na tabela

Olá!
Estou fazendo um projeto para a faculdade que inclui uma tabela simples, só para ficar organizado visualmente. A ideia é a seguinte: ao clicar no botão, passar os conteúdos dos jTextFields de um pequeno formulário, para uma jTable, tudo na mesma tela. Até aí, ele funciona normalmente. O problema é quando preciso adicionar outra linha na tabela, com novos dados dos jTextFields, ele não adiciona uma nova linha na tabela, em vez disso, ele atualiza a linha que já está lá.

Meu código está assim:

Um método que cria a tabela

public final DefaultTableModel criatabela(){
    
     jtbProcessos.setModel(new javax.swing.table.DefaultTableModel(
            new Object[][]{},
            new String[]{"PID", "Chegada", "Duracao", "I/O", "Operação I/O"}) {
    });
    
    javax.swing.table.DefaultTableModel dtm = (javax.swing.table.DefaultTableModel) 
            jtbProcessos.getModel();
     return dtm;
 }

E o evento do botão:

private void btnCriarProcessoActionPerformed(java.awt.event.ActionEvent evt) {
    DefaultTableModel dtm = this.criatabela();
    dtm.addRow(new Object[]{txtPid.getText(), txtChegada.getText(), txtDuracao.getText(), txtIo.getText(), txtOperacaoIO.getText()});
}

Coloquei o método de criar tabelas embaixo do initComponent() para quando a tela executar, a tabela estar com os nomes nas colunas certinho:

public EntradaProcessos() {
    initComponents();
    criatabela();

}

Obrigado!

Antes de adicionar uma nova linha, você deve verificar se na sua jTable já existe alguma linha inserida, caso tenha alguma linha inserida, você deve pegar o total de linhas existentes naquele momento na jTable e incrementar o valor em +1.
Logo se você tem a linha 1 já inclusa, somando +1 ele adicionará a segunda linha, e assim sucessivamente!

Obrigado pela resposta!
Então devo fazer um if dentro do event d botão e colocar o número total de linhas dentro de uma variável int? Por exemplo:

    int totalLinhas;
    if(dtm.getRowCount()>0){
        totalLinhas = dtm.getRowCount() + 1;
        dtm.addRow(new Object[]{txtPid.getText(), txtChegada.getText(), txtDuracao.getText(), txtIo.getText(), txtOperacaoIO.getText()});
    }

Ele continua atualizando os valores da linha já existente em vez de adicionar outra linha.

Tenta fazer desta meneira:

int totalLinhas = dtm.getRowCount();
dtm.setNumRows(totalLinhas + 1);
dtm.setValueAt(txtPid.getText(), totalLinhas, 0);//ordem dos valores, (valor da coluna, n° da linha atual, coluna da tabela)
dtm.setValueAt(txtChegada.getText(), totalLinhas, 1);
dtm.setValueAt(txtDuracao.getText(), totalLinhas, 3);

Ainda não adiciona uma nova linha. O evento do botão ficou assim:

    DefaultTableModel dtm = this.criatabela();
    
    if(dtm.getRowCount()>0){
    int totalLinhas = dtm.getRowCount();
    dtm.setNumRows(totalLinhas + 1);
    dtm.setValueAt(txtPid.getText(), totalLinhas, 0);
    dtm.setValueAt(txtChegada.getText(), totalLinhas, 1);
    dtm.setValueAt(txtDuracao.getText(), totalLinhas, 2);
    dtm.setValueAt(txtIo.getText(), totalLinhas, 3);
    dtm.setValueAt(txtOperacaoIO.getText(), totalLinhas, 4);
     }
     else {
    dtm.addRow(new Object[]{txtPid.getText(), txtChegada.getText(), txtDuracao.getText(), io, txtOperacaoIO.getText()});
     }

Eu tenho um projeto bem antigo em que eu fazia da seguinte maneira, tinha um objeto do tipo jTable declarado na classe de modelo:

public class MeuModelo {
    private JTable tabela;

    public JTable getTabela() {
        return tabela;
    }

    public void setTabela(JTable tabela) {
        this.tabela = tabela;
    }
}

Antes de chamar o método era feito o seguinte código:

MeuModelo meumodelo = new MeuModelo();//instanciando o modelo
meumodelo.setTabela(MinhajTable);//setando a jtable na classe de modelo

Feito isso eu chamava o método abaixo da seguinte forma:

//chamada do método passando a classe de modelo por parâmetro
incluirItemTable(meumodelo); 


//Método de inclusão
    public void incluirItemTable(MeuModelo classe) {
        DefaultTableModel Tabela = (DefaultTableModel) classe.getTabela().getModel();

        int totlinha = classe.getTabela().getRowCount();

        Tabela .setNumRows(totlinha + 1);
        Tabela .setValueAt(valor0.getText(), totlinha, 0);
        Tabela .setValueAt(valor1.getText(), totlinha, 1);
        Tabela .setValueAt(valor2.getText(), totlinha, 2);
        Tabela .setValueAt(valor3.getText(), totlinha, 3);
    }

Kevin,

O problema é que você esta chamando o metodo criatabela ao inserir um novo registro, que por consequência cria um novo defaultTableModel sempre que é chamado com o código abaixo:

 jtbProcessos.setModel(new javax.swing.table.DefaultTableModel(
            new Object[][]{},
            new String[]{"PID", "Chegada", "Duracao", "I/O", "Operação I/O"}) {
    });

Para resolver esse problema, você pode deixar esse somente para criação da table, dessa forma:

public final void criatabela(){
     jtbProcessos.setModel(new javax.swing.table.DefaultTableModel(
            new Object[][]{},
            new String[]{"PID", "Chegada", "Duracao", "I/O", "Operação I/O"}) {
    });
}

E criar outro somente para atualização com o novo registro:

public void updateTable(){
		DefaultTableModel dtm = (DefaultTableModel) jtbProcessos.getModel();
    dtm.addRow(new Object[]{txtPid.getText(), txtChegada.getText(), txtDuracao.getText(), txtIo.getText(), txtOperacaoIO.getText()});
	}
1 curtida

Obrigado cara te amo :heart_eyes:
Resolveu tudo aqui!