jTable1; // End of variables declarationE o que fizemos aqui ? Teste o programa.Figura 28 - Teste do Programa , veja o Log do seu NBQuando o usuario selecionar alguma linha , sera executado a funcao jTable1MouseClicked tratado peloListener criado em jTable1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jTable1MouseClicked(evt); } });E com isso colocamos o objeto Contato na memoria e podemos utiliza-lo para mais coisa se for preciso e o botao edit le o contatoAtivo.Opa... e se clicar direto no botao editar, sem selecionar uma linha ??Figura 29 - Erro causado por clicar no botao editar sem selecionar um contato, perceba o java.lang.NullPointerExceptionYes... ErroEm vez de colocar isso dentro de um Try/catch , nesse caso prefiro evitar que o erro aconteca da seguinte maneira :II) Vamos modificar a funcao abreFrameEdit que precisa de um contato valido private void abreFrameEdit(Contato C) { if (C==null){ JOptionPane.showMessageDialog(null,"Selecione um Contato"); }else { frameEditaContato fec = new frameEditaContato(); fec.carregaContato(C); fec.setVisible(true); } }e.. Teste o programa.Figura 30 - Prevenindo o erro da funcao abreFrameEdit9) Vamos modificar um pouco como isso esta escrito: , Refactor>>Encapsulate FieldsFigura 31- Refatorando e Encapsulando : Apos selecionar e aplicar , selecione as 5 que utilizeipublic final class frameListaContatos extends javax.swing.JFrame { private ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-definitions.xml"); private ContatoDAO dao = (ContatoDAO) ctx.getBean("contatoDao"); private ContatoTableModel tableModel = new ContatoTableModel(dao.listar()); private Contato contatoAtivo; public frameListaContatos() { initComponents(); carregaTabela(); } private void jBtSairActionPerformed(java.awt.event.ActionEvent evt) { sair(); } private void jBtEditarActionPerformed(java.awt.event.ActionEvent evt) { abreFrameEdit(this.getContatoAtivo()); } private void jTable1MouseClicked(java.awt.event.MouseEvent evt) { carregaContato(); }//NB CODE// End of variables declaration public ApplicationContext getCtx() { return ctx; } public ContatoDAO getDao() { return dao; } public ContatoTableModel getTableModel() { return tableModel; } public Contato getContatoAtivo() { return contatoAtivo; } public void setContatoAtivo(Contato contatoAtivo) { this.contatoAtivo = contatoAtivo; } private void carregaTabela() { jTable1.setModel(this.getTableModel()); jLbTotal.setText(this.getTableModel().getRowCount() + ""); } private void carregaContato() { Contato C = this.getTableModel().getObjectAtRow(jTable1.getSelectedRow()); this.setContatoAtivo(C); System.out.println("Contato Ativo na memoria: " + C.getNome()); } private void abreFrameEdit(Contato C) { if (C == null) { JOptionPane.showMessageDialog(null, "Selecione um Contato"); } else { frameEditaContato fec = new frameEditaContato(); fec.carregaContato(C); fec.setVisible(true); } } private void sair() { System.out.println("Encerrando programa "); System.exit(0); }e.. Teste o programa.10) O lance de abrir varias janelas:Nao sou muito fa disso, pois sujeito o usuario abrir varias janelas sem perceber e fazer uma bagunca com os dados.I) mais uma modificacao : se fechar a janela de edicao fecha o programa, e nao apenas a janela.Para resolver isso abra o frameEditaContato , selecione o frame e nas propriedades altere a propriedade defaultCloseOperation para DISPOSE . Figura 32 - Fechando apenas a janela filhaII) Permitindo apenas uma janela de edicao de Contato.Vamos modificar a classe frameEditaContato p/ receber como construtor o frame pai.public class frameEditaContato extends javax.swing.JFrame { /** * Creates new form frameEditaContato */ frameListaContatos flC; // public frameEditaContato() {// initComponents();// } //novo construtor public frameEditaContato(frameListaContatos flC) { initComponents(); this.flC = flC; } // metoodo obrigatorio private frameEditaContato() {// throw new UnsupportedOperationException("Not yet implemented"); } public void carregaContato(Contato C){ jTFId.setText(C.getId()+""); jTFNome.setText(C.getNome()); jTFTelefone.setText(C.getTelefone()); }//... etcE para chamar esse frame em nossa Lista criamos uma variavel de classse privada do tipo