O primeiro passo é alterar o método alterarContato para trabalhar com o contato dentro do JTable:
public void alterarContato(Contato cont,String nome,String idade,String telefone) throws SQLException{
cont.setNome(nome);
cont.setIdade(idade);
cont.setTelefone(telefone);
new contatoDAO().altera(cont);
}
Note que tirei fora a necessidade de passar o parâmetro id, já que ele já está dentro do objeto contato e geralmente ele nunca é alterado.
Ok, agora altere o seu evento de botão para usar esse método, e avisar a tabela que a linha daquele contato mudou:
private void bt_alterarActionPerformed(java.awt.event.ActionEvent evt) {
int row = tabela.getSelectedRow();
ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
Contato contato = modelo.get(row);//Obtém o contato de dentro do modelo
try {
//Altera o contato da linha selecionada.
new ContatoNegocio().alterarContato(contato, tf_nome.getText(), tf_idade.getText(), tf_telefone.getText());
modelo.fireTableRowsUpdated(row, row); //Avisa que os dados da linha mudaram, para serem repintados
JOptionPane.showMessageDialog(null,"Alterado com Sucesso!!");
} catch (SQLException ex) {
Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
}
}
Outra coisa. Seu evento de mouseClick tem um sério problema. Se você alterar a ordem dos campos da tabela, ele para de funcionar. Por isso, é melhor sempre se basear na sua classe de negócio:
private void tabelaMouseClicked(java.awt.event.MouseEvent evt) {
ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
Contato contato = modelo.get(row);//Obtém o contato da linha selecionada
tf_nome.setText(contato.getNome());
tf_idade.setText(Integer.toString(contato.getIdade()));
tf_telefone.setText(contato.getTelefone());
}
Assim as colunas podem alterar de ordem livremente, sem que você tenha que alterar essa função. Ainda volto a insistir para que você crie uma função:
public ContatoTableModel getModel() {
return (ContatoTableModel)tabela.getModel();
}
Isso evita a criação dessa variável:
ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
Já que você pode simplesmente chamar getModel() no lugar dela. E com a vantagem de que se o nome da classe ou da tabela mudarem, você só precisará alterar isso em 1 único ponto do seu código.