[Resolvido]Evento no jtable... isso ta estranho!

Seguinte… Tenho minha aplicaçãozinha para cadastro de cliente, por exemplo… eis a tela:

ai beleza… Quando eu clico em “Novo” eu habilito os campos [chamo o método Visivel()], habilito o botão Salvar… Ai quando ele clica em Salvar, ele adiciona o valor para a Jtable, normalmente…

Ai eu coloquei um evento no Jtable (mouseClicked) que é o seguinte código:

   private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     

        Cliente f12;
        f12 = modelo.getCliente(jTable1.getSelectedRow());

        campo_End.setText(f12.getEndereco());
        campo_Nome.setText(f12.getNome());
        campo_Tel.setText(f12.getTel());

        Visivel();

        bAtualizar.setEnabled(true);
        bSalvar.setEnabled(false);
       
    }                   

lindo é ? Traduzindo isso ai… quando o cara clicar em uma linha da tabela, ele vai buscar o objeto do Cliente correspondente , e depois vai setar nos campos os dados desses objetos… vai deixar os campos “editaveis” [visivel()] e vai habilitar o botão de Atualizar, e desabilitar o botao de salvar… tudo lindo né? … Ai eu vou por exemplo e modifico algum dado do Cliente e clico em atualizar, que irá chamar o seguinte código:



    private void bAtualizarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        if (campo_End.getText().equals("") || campo_Nome.getText().equals("") || campo_Tel.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Todos os campos são obrigatórios!", "Atenção!",JOptionPane.ERROR_MESSAGE);
        } else {

            int lugar = EncontrarCliente(); //procurar no meu "bd" onde esta o cliente
      
            //Modificar no "bd"
            bd.clientes[lugar].setEndereco(campo_End.getText()); 
            bd.clientes[lugar].setNome(campo_Nome.getText());
            bd.clientes[lugar].setTel(campo_Tel.getText());

            //pegar qual linha o cara selecionou
            int i = jTable1.getSelectedRow();

            //Modificar o valor dessa linha
           //OBS: eu criei este método (vou mostrar o código daqui a pouco)

            modelo.setValueAt(bd.clientes[lugar], i);

            JOptionPane.showMessageDialog(null, "Atualizado com sucesso");
            Invisivel();
            Zerar();
            bAtualizar.setEnabled(false);
        }
    }                                          

beleza… agora veja o código que eu criei lá no meu TabelModel para ficar bem claro:

 public void setValueAt(Cliente aValue, int rowIndex) {
        Cliente Cliente = linhas.get(rowIndex); // Carrega o item da linha que deve ser modificado
        Cliente.setNome(aValue.getNome());
        Cliente.setEndereco(aValue.getEndereco());
        Cliente.setTel(aValue.getTel());

        fireTableRowsUpdated(rowIndex, rowIndex);
    }
    ;

Tenho só uma duvida quanto ao código acima…
fireTableRowsUpdated(rowIndex, rowIndex); está correto?

Funciona normal, mas acho que esse trecho pode estar causando o erro que vou descrever aseguir…

O PROBLEMA:

Adicionei um novo cliente (beleza)… Vou clicar no 1 cliente da lista (habilitou o atualizar para mim)… modifiquei o que eu quis e cliquei em “Atualizar” … tranquilo, ele atualizou a jtable com as mudanças que eu fiz…

O ERRO:

agora decidi clicar em outro cliente da jtable para modificar seus dados também … EEEEEEEEEERRROOO !! O que acontece?
Ele pega o valor que eu acabei de alterar do “cliente passado” e muda na Jtable (e no objeto) o cliente que eu acabei de clicar!!!??

por queeee deus?
ajudem por favor!!!

um amigo me ajudou e disse:

[quote]’ Maycon - Hack’n Roll [ ɹǝǝuıƃuǝ ǝsɹǝʌǝɹ ] diz:
então é porque ele está atualizando os dois …
só que você só avisa pra das refresh em um deles …
[/quote]

fiz os testes e é verdade… estou modificando os dois !! Mas como ??? era para modificar só 1 !

ajudem

O nome setValueAt me confundiu, me lembra o método do TableModel que edita uma célula. Poderia chamá-lo de setCliente. Mas enfim, isto é apenas uma sugestão.

Não entendi direito o problema descrito no final, se puder explicar melhor.

Quanto ao setValue, tem um método de List chamado “set”, que recebe o índice que deve ser alterado e o novo objeto (cliente, no seu caso), ele é mais adequado, assim não precisa atualizar campo por campo:

[code] public void setValueAt(Cliente aValue, int rowIndex) {
linhas.set(rowIndex, aValue);

    fireTableRowsUpdated(rowIndex, rowIndex);
};[/code]

O fireTableRowsUpdated está correto, e imagino que não seja o causador do problema, pois sua função é notificar os TableModelListener que a linha foi atualizada, assim a JTable pode redesenhar as células necessárias.

Eric Yuzo o erro é muito doido cara…
acredito que o erro esteja neste método:

[code]
public int EncontrarCliente() {
int enc;
boolean encontrou = false;

    for (enc = 0; bd.clientes[enc] != null && encontrou == false; enc++) {
        if (bd.clientes[enc].getNome().equals(campo_Nome.getText())) {
            encontrou = true;
        }
    }
    return enc - 1;
}[/code]

porem, ele funcionava antes de eu implementar esse negocio da tabela !

Esse método está retonando o índice do array que possui o mesmo nome do text field? Acho que isso não afetaria em atualizar duas vezes a tabela. E ficou um pouco bagunçado, sugestão que deve funcionar (não testei):

[code] public int EncontrarCliente(String nome) {
int index = 0;

    for (Cliente cliente : bd.clientes) {
        if (cliente.getNome().equalsIgnoreCase(nome.trim())) {
            break;
        }
        index++;
    }
    return index;
}[/code]

Já debugou o código que chama o método de atualizar?

ACHO que resolvi o problema! já posto a soluçaõ…

vou consertar… mas o erro ta no encontrarCliente msmo…

vlw pela ajuda

ahh
descobri o erro

Seguinte… quando eu seleciono o item na tabela ele vai setar os campos com tudo que eu digitei lá certo ?
Ai os campos ficam habilitados para eu poder “Sobre escrever” o que ja estava lá, e depois eu clico em “Atualizar”…

só que o Atualizar, precisa saber qual que era o valor ANTERIOR do campo… só que ele tava pegando o atual,
depois de mudado… um que não existe :stuck_out_tongue:
por isso o erro

eita vontade de me enforcar viu
adsuhadsuhasduh

vou tentar resolver

Solução:

Criei uma variavel “proc” (String)…

NO evento da jtable (mouseClicked), fiz o seguinte:

 proc = f12.getNome();

modifiquei o código que nem Eric falou… e fiz:

pronto…
problema resolvido…
eitaaaa que coisa !

Legal que conseguiu resolver. :thumbup:

Não tem a ver com sua dúvida, mas percebi que seus option panes estão recebendo null no primeiro parâmetro. Este parâmetro recebe a janela pai, como ele está sendo chamado de um JFrame, o ideal é que o passe usando NomeDoFrame.this no parâmetro, assim seu option pane não ficará órfão.

[quote=Eric Yuzo]Legal que conseguiu resolver. :thumbup:

Não tem a ver com sua dúvida, mas percebi que seus option panes estão recebendo null no primeiro parâmetro. Este parâmetro recebe a janela pai, como ele está sendo chamado de um JFrame, o ideal é que o passe usando NomeDoFrame.this no parâmetro, assim seu option pane não ficará órfão.[/quote]

existe alguma “diferença” na prática?

Existe sim.

Se for passado o parâmetro, o option pane fica centralizado na área do JFrame pai, caso contrário fica centralizado na tela.

E dependendo da forma que o foco da janela for alterado (com alt + tab, por exemplo), o option pane pode acabar se perdendo por trás da janela, caso tenha passado null. Se passar a janela no parâmetro, ele ficará sempre na frente.

Na verdade o option pane fornece uma espécie de implementação pronta de um JDialog, e este parâmetro é o mesmo que owner do JDialog.

obrigado pela dica…

vou começar a mudar…
funciona se eu passar simplesmente:

“this” ?

abraços

[quote=d34d_d3v1l]funciona se eu passar simplesmente:

“this” ?

Funciona sim.

É preciso passar NomeDoFrame.this quando se está dentro de uma classe interna. Mas no caso do seu evento, a implementação está em um método comum da classe, então pode passar apenas this, que terá o efeito desejado.

obrigado por tudo!
abraços

Olá pessoal…
Implementei meu própio TableModel seguindo os exemplos do fórum…
Estou com um probleminha, com relação a GUI ou ao TableModel, não sei.
O meu problema é parecido com o deste tópico.
Vou descrever um cenário do que está acontecendo comigo aqui:
Estou desenvolvendo um sistema básico, pequeno, o mesmo deve gerar determinados relatórios por ‘Bairros’, construi um Form para o cadastro desses bairros (para padronizá-los), cadastra, atualiza e deleta normalmente, porém está ocorrendo uma pequena peculiaridade:

1 - Quando cadastro um novo registro o mesmo é inserido com sucesso na base de dados e a minha JTable é atualizada corretamente com o novo registro inserido;
2 - Quando atualizo um registro o mesmo é atualizado com sucesso na base de dados e também no meu TableModel, com a minha JTable sendo redesenhada corretamente;
3 - Quando seleciono um registro na JTable e clico no botão ‘Excluir’ a deleção é feita com sucesso tanto no DB quando no TableModel e a JTable é renderizada normalmente;

O problema está acontecendo quando executo o passo 2 antes do passo 1, por exemplo, inicializo a janela de cadastro, clico em um registro na tabela, dai eu atualizo (Passo 2), ok… atualiza normalmente no DB e JTable, PORÉM, se eu resolver INCLUIR (Passo 1) um novo registro, ele insere normalmente no DB, insere uma última linha na JTable com os dados do novo registro MAS também AUTUALIZA (apenas na JTable, no DB continua normal) aquele registro anterior que eu havia atualizado.
Eu não sei porque mistérios ele faz isso…
Alguém tem idéia do que pode ser?
Posto aqui também o código do meu TableModel para vocês verificarem se há algo errado

BairrosTableModel:

[code]package br.view;

import br.model.vo.BairroVO;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
*

  • @author Leandro
    */
    public class BairrosTableModel extends AbstractTableModel {
    private List linhas;
    private String colunas[] = new String[] {“Código”, “Nome”, “Descrição”};

    public BairrosTableModel() {
    this.linhas = new ArrayList<>();
    }

    public BairrosTableModel(List lista) {
    this.linhas = new ArrayList<>(lista);
    }

    @Override
    public int getRowCount() {
    return linhas.size();
    }

    @Override
    public int getColumnCount() {
    return colunas.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
    return colunas[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
    switch(columnIndex) {
    case 0: //ID
    return Integer.class;
    case 1: //Nome
    return String.class;
    case 2: //Descrição
    return String.class;
    default:
    throw new IndexOutOfBoundsException(“Índice informado fora dos limites.”);
    }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    BairroVO vo = linhas.get(rowIndex);
    switch(columnIndex) {
    case 0: //ID
    return vo.getID();
    case 1: //Nome
    return vo.getNome();
    case 2: //Descrição
    return vo.getDescricao();
    default:
    throw new IndexOutOfBoundsException(“Índice informado fora dos limites.”);
    }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    // BairroVO vo = linhas.get(rowIndex);
    // switch(columnIndex) {
    // case 0: //ID
    // vo.setID(Integer.parseInt(aValue.toString()));
    // case 1: //Nome
    // vo.setNome(aValue.toString());
    // case 2: //Descrição
    // vo.setDescricao(aValue.toString());
    // }
    // fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
    }

    /*

    • Implementações particulares:
      */

    public BairroVO getBairro(int rowIndex) {
    return linhas.get(rowIndex);
    }

    public void addBairro(BairroVO vo) {
    linhas.add(vo);
    int lastIndex = getRowCount()-1;
    fireTableRowsInserted(lastIndex, lastIndex);
    }

    public void removeBairro(int rowIndex) {
    linhas.remove(rowIndex);
    fireTableRowsDeleted(rowIndex, rowIndex);
    }

    public void addListaBairros(List lista) {
    int tamanhoAntigo = getRowCount();
    linhas.addAll(lista);
    fireTableRowsInserted(tamanhoAntigo, getRowCount()-1);
    }

    public void limpar() {
    if(!linhas.isEmpty()) {
    linhas.clear();
    fireTableDataChanged();
    }
    }

    public boolean isEmpty() {
    return linhas.isEmpty();
    }

    public void ordenarPorID() {
    Collections.sort(linhas, new Comparator(){

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getID()-o2.getID();
         }
     });
     fireTableDataChanged();
    

    }

    public void ordenarPorNome() {
    Collections.sort(linhas, new Comparator() {

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getNome().compareTo(o2.getNome());
         }
     });
     fireTableDataChanged();
    

    }

    public void ordenarPorDescricao() {
    Collections.sort(linhas, new Comparator() {

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getDescricao().compareTo(o2.getDescricao());
         }
     });
     fireTableDataChanged();
    

    }
    }
    [/code]

Vai o código do meu presenter para a o Form de cadastro, não está completo ainda, me corrijam se estiver fazendo errado :slight_smile: :
CadastroBairrosPresenter:

[code]package br.presenter;

import br.model.dao.BairroDAO;
import br.model.vo.BairroVO;
import br.presenter.listeners.CadBairrosMouseListeners;
import br.presenter.listeners.CadBairrosWindowListeners;
import br.view.BairrosTableModel;
import br.view.CadastroBairrosView;
import java.awt.Component;
import java.util.List;
import javax.swing.JOptionPane;

/**
*

  • @author Leandro
    */
    public class CadastroBairrosPresenter {
    private BairroVO vo;
    private BairroDAO dao;
    private CadastroBairrosView view;
    private BairrosTableModel tableModel;

    public CadastroBairrosPresenter(BairroDAO dao, CadastroBairrosView view) {
    this.vo = new BairroVO();
    this.dao = dao; //Recebe por uma Factory de DAOS
    this.view = view;
    //Popula o modelo de tabela na sua inicialização:
    this.tableModel = new BairrosTableModel(this.dao.listarTodos());

     /*
      * Seta o TableModel da JTable, sem isso teremos uma'java.lang.ClassCastException', 
      * pois o modelo pradrão do JTable que é 'DefaultTableModel' não implementa
      * a interface 'TableModel', porém o modelo 'BairrosTableModel'
      * (extends AbstractTableModel) implementa 'TableModel', permitindo
      * assim o casting no momento em que formos recuperar o modelo da View.
     */
     view.setBairrosTableModel(tableModel);
    

    }

    public void criarJanela() {
    this.setUpViewListeners();
    this.ativarEdicao(true);
    this.view.ativarBtnAtualizar(false);
    this.view.ativatBtnExcluir(false);
    this.view.packAndShow();
    }

    public void ocultarJanela() {
    fechar();
    }

    public CadastroBairrosView getView() {
    return this.view;
    }

    //Atualiza o modelo a partir da visão:
    public void updateModelFromView() {
    this.vo.setNome(view.getNome());
    this.vo.setDescricao(view.getDescricao());
    }

    //Atualiza o modelo a partir da tabela na visão:
    public void updateModelFromTable() {
    this.tableModel = view.getBairrosTableModel();
    this.vo = tableModel.getBairro(view.getLinhaSelecionadaTabela());
    //Renderiza a view:
    view.ativarNomeTextField(true);
    view.ativarDescricaoTextArea(true);
    view.ativarBtnLimpar(true);
    view.ativatBtnExcluir(true);
    view.ativarBtnCancelar(true);
    view.ativarBtnSalvar(false);
    view.ativarBtnAtualizar(true);

    }

    //Atualiza a visão a partir do modelo:
    public void updateViewFromModel() {
    if(vo != null) {
    this.view.setNome(vo.getNome());
    this.view.setDescricao(vo.getDescricao());
    }
    else {
    view.limparCampos();
    }
    }

    public void ativarEdicao(boolean b) {
    view.ativarNomeTextField(b);
    view.ativarDescricaoTextArea(b);
    view.ativarBtnSalvar(b);
    view.ativarBtnAtualizar(b);
    view.ativarBtnLimpar(b);
    view.ativatBtnExcluir(b);
    view.ativarBtnCancelar(b);
    }

    public void limparCamposView() {
    this.view.limparCampos();
    this.view.limparSelecaoTabela();
    this.view.ativatBtnExcluir(false);
    this.view.ativarBtnAtualizar(false);
    this.view.ativarBtnSalvar(true);
    }

    public void repopularTabela() {
    List lista = dao.listarTodos();
    view.setBairrosTableModel(new BairrosTableModel(lista));
    view.atualizarTabelaBairros();
    }

    //Atualiza na JTable valores inseridos ou deletados:
    public void updateTableModel(int op) {
    //Inserir
    if(op == 0) {
    vo.setID(dao.listarUltimoID());
    view.getBairrosTableModel().addBairro((BairroVO)vo.clone());
    }
    //Deletar
    else if(op == 1) {
    view.getBairrosTableModel().removeBairro(view.getLinhaSelecionadaTabela());
    }
    }

    //Chama ‘updateTableModel’ para renderizar a JTable:
    public void inserirBairro() {
    this.updateModelFromView();
    this.dao.inserir(vo);
    //Atualiza na JTable:
    this.updateTableModel(0);
    view.atualizarTabelaBairros();
    }

    //Não coloquei nada para atualizar no TableModel (pelo menos penso isso), mas mesmo assim atualiza sozinho (não sei porque):
    public void atualizarBairro() {
    this.updateModelFromView();
    this.dao.atualizar(vo);
    //Renderiza a view:
    view.atualizarTabelaBairros();
    limparCamposView();
    }
    //Chama ‘updateTableModel’ para renderizar a JTable:
    public void deletarBairro() {
    //Se não selecionou nenhum registro:
    if(view.getLinhaSelecionadaTabela() == -1) {
    JOptionPane.showMessageDialog((Component)getView(), “Selecione um registro para excluir!”,
    “Excluir registro”, JOptionPane.WARNING_MESSAGE);
    }
    else {
    this.updateModelFromTable();
    deletar();
    //Atualiza na JTable:
    this.updateTableModel(1);
    view.atualizarTabelaBairros();
    }
    }

    /**

    • Método para encerrar a aplicação.
    • Pergunta ao usuário se realmente deseja sair,
    • caso contrário a execução do aplicativo continua.
      /
      private void fechar () {
      // TODO add your handling code here:
      //Modifica o texto dos botões.
      Object [] options = {“Sim”,
      “Não”};
      //Variável ´n´ recebe o valor da opção clicada.
      int n = JOptionPane.showOptionDialog ((Component)getView(),
      “Deseja realmente sair da aplicação?”,
      “Encerrar aplicação”,
      JOptionPane.YES_NO_CANCEL_OPTION,
      JOptionPane.QUESTION_MESSAGE,
      null,
      options,
      options [1]);
      //Se Clicou para sair.
      if (n==0) {
      /

      * Torna a janela invisível em seguida
      * termina a execução do objeto.
      */
      view.ocultar();
      view.destruir();
      }
      }

    private void deletar() {
    // TODO add your handling code here:
    //Modifica o texto dos botões.
    Object [] options = {“Sim”,
    “Não”};
    //Variável ´n´ recebe o valor da opção clicada.
    int n = JOptionPane.showOptionDialog ((Component)getView(),
    “Deseja realmente excluir o registro?”,
    “Exclusão de registro”,
    JOptionPane.YES_NO_CANCEL_OPTION,
    JOptionPane.QUESTION_MESSAGE,
    null,
    options,
    options [1]);
    //Se Clicou para sair.
    if (n==0) {
    /*
    * Torna a janela invisível em seguida
    * termina a execução do objeto.
    */
    this.dao.deletar(vo);
    }
    }

    public void setUpViewListeners() {
    view.setSalvarActionListener(new CadBairrosWindowListeners.SalvarActionListener(this));
    view.setAtualizarActionListener(new CadBairrosWindowListeners.AtualizarActionListener(this));
    view.setLimparActionListener(new CadBairrosWindowListeners.LimparActionListener(this));
    view.setExcluirActionListener(new CadBairrosWindowListeners.ExcluirActionListener(this));
    view.setCancelarActionListener(new CadBairrosWindowListeners.CancelarActionListener(this));
    view.setFormularioWindowAdpter(new CadBairrosWindowListeners.FormularioWindowAdapter(this));
    view.setFieldNomeFocusListener(new CadBairrosWindowListeners.FieldNomeFocusListener(this));
    view.setFieldDescricaoFocusListener(new CadBairrosWindowListeners.FieldDescricaoFocusListener(this));
    view.setTableBairrosMouseListener(new CadBairrosMouseListeners.TabelaBairrosMouseListener(this));
    }
    }
    [/code]

Aguardo uma ajuda pra resolver este mistério… haha :oops:
Muito obrigado pessoal… :slight_smile:

Lembrando que implementei o ‘repopularTabela()’ (linhas 106 a 110 de CadastroBairrosPresenter), mas nem estou utilizando nem quero utilizá-lo, porque não é legal ficar fazendo um SELECT de todos os registros a cada atualização e perder desempenho, aumentar tráfego na rede etc… :?

Então amigos, estou no aguardo… :roll:
Obrigado :smiley:

[quote=Leandro Rocha]Olá pessoal…
Implementei meu própio TableModel seguindo os exemplos do fórum…
Estou com um probleminha, com relação a GUI ou ao TableModel, não sei.
O meu problema é parecido com o deste tópico.
Vou descrever um cenário do que está acontecendo comigo aqui:
Estou desenvolvendo um sistema básico, pequeno, o mesmo deve gerar determinados relatórios por ‘Bairros’, construi um Form para o cadastro desses bairros (para padronizá-los), cadastra, atualiza e deleta normalmente, porém está ocorrendo uma pequena peculiaridade:

1 - Quando cadastro um novo registro o mesmo é inserido com sucesso na base de dados e a minha JTable é atualizada corretamente com o novo registro inserido;
2 - Quando atualizo um registro o mesmo é atualizado com sucesso na base de dados e também no meu TableModel, com a minha JTable sendo redesenhada corretamente;
3 - Quando seleciono um registro na JTable e clico no botão ‘Excluir’ a deleção é feita com sucesso tanto no DB quando no TableModel e a JTable é renderizada normalmente;

O problema está acontecendo quando executo o passo 2 antes do passo 1, por exemplo, inicializo a janela de cadastro, clico em um registro na tabela, dai eu atualizo (Passo 2), ok… atualiza normalmente no DB e JTable, PORÉM, se eu resolver INCLUIR (Passo 1) um novo registro, ele insere normalmente no DB, insere uma última linha na JTable com os dados do novo registro MAS também AUTUALIZA (apenas na JTable, no DB continua normal) aquele registro anterior que eu havia atualizado.
Eu não sei porque mistérios ele faz isso…
Alguém tem idéia do que pode ser?
Posto aqui também o código do meu TableModel para vocês verificarem se há algo errado

BairrosTableModel:

[code]package br.view;

import br.model.vo.BairroVO;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
*

  • @author Leandro
    */
    public class BairrosTableModel extends AbstractTableModel {
    private List linhas;
    private String colunas[] = new String[] {“Código”, “Nome”, “Descrição”};

    public BairrosTableModel() {
    this.linhas = new ArrayList<>();
    }

    public BairrosTableModel(List lista) {
    this.linhas = new ArrayList<>(lista);
    }

    @Override
    public int getRowCount() {
    return linhas.size();
    }

    @Override
    public int getColumnCount() {
    return colunas.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
    return colunas[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
    switch(columnIndex) {
    case 0: //ID
    return Integer.class;
    case 1: //Nome
    return String.class;
    case 2: //Descrição
    return String.class;
    default:
    throw new IndexOutOfBoundsException(“Índice informado fora dos limites.”);
    }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    BairroVO vo = linhas.get(rowIndex);
    switch(columnIndex) {
    case 0: //ID
    return vo.getID();
    case 1: //Nome
    return vo.getNome();
    case 2: //Descrição
    return vo.getDescricao();
    default:
    throw new IndexOutOfBoundsException(“Índice informado fora dos limites.”);
    }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    // BairroVO vo = linhas.get(rowIndex);
    // switch(columnIndex) {
    // case 0: //ID
    // vo.setID(Integer.parseInt(aValue.toString()));
    // case 1: //Nome
    // vo.setNome(aValue.toString());
    // case 2: //Descrição
    // vo.setDescricao(aValue.toString());
    // }
    // fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
    }

    /*

    • Implementações particulares:
      */

    public BairroVO getBairro(int rowIndex) {
    return linhas.get(rowIndex);
    }

    public void addBairro(BairroVO vo) {
    linhas.add(vo);
    int lastIndex = getRowCount()-1;
    fireTableRowsInserted(lastIndex, lastIndex);
    }

    public void removeBairro(int rowIndex) {
    linhas.remove(rowIndex);
    fireTableRowsDeleted(rowIndex, rowIndex);
    }

    public void addListaBairros(List lista) {
    int tamanhoAntigo = getRowCount();
    linhas.addAll(lista);
    fireTableRowsInserted(tamanhoAntigo, getRowCount()-1);
    }

    public void limpar() {
    if(!linhas.isEmpty()) {
    linhas.clear();
    fireTableDataChanged();
    }
    }

    public boolean isEmpty() {
    return linhas.isEmpty();
    }

    public void ordenarPorID() {
    Collections.sort(linhas, new Comparator(){

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getID()-o2.getID();
         }
     });
     fireTableDataChanged();
    

    }

    public void ordenarPorNome() {
    Collections.sort(linhas, new Comparator() {

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getNome().compareTo(o2.getNome());
         }
     });
     fireTableDataChanged();
    

    }

    public void ordenarPorDescricao() {
    Collections.sort(linhas, new Comparator() {

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getDescricao().compareTo(o2.getDescricao());
         }
     });
     fireTableDataChanged();
    

    }
    }
    [/code]

Vai o código do meu presenter para a o Form de cadastro, não está completo ainda, me corrijam se estiver fazendo errado :slight_smile: :
CadastroBairrosPresenter:

[code]package br.presenter;

import br.model.dao.BairroDAO;
import br.model.vo.BairroVO;
import br.presenter.listeners.CadBairrosMouseListeners;
import br.presenter.listeners.CadBairrosWindowListeners;
import br.view.BairrosTableModel;
import br.view.CadastroBairrosView;
import java.awt.Component;
import java.util.List;
import javax.swing.JOptionPane;

/**
*

  • @author Leandro
    */
    public class CadastroBairrosPresenter {
    private BairroVO vo;
    private BairroDAO dao;
    private CadastroBairrosView view;
    private BairrosTableModel tableModel;

    public CadastroBairrosPresenter(BairroDAO dao, CadastroBairrosView view) {
    this.vo = new BairroVO();
    this.dao = dao; //Recebe por uma Factory de DAOS
    this.view = view;
    //Popula o modelo de tabela na sua inicialização:
    this.tableModel = new BairrosTableModel(this.dao.listarTodos());

     /*
      * Seta o TableModel da JTable, sem isso teremos uma'java.lang.ClassCastException', 
      * pois o modelo pradrão do JTable que é 'DefaultTableModel' não implementa
      * a interface 'TableModel', porém o modelo 'BairrosTableModel'
      * (extends AbstractTableModel) implementa 'TableModel', permitindo
      * assim o casting no momento em que formos recuperar o modelo da View.
     */
     view.setBairrosTableModel(tableModel);
    

    }

    public void criarJanela() {
    this.setUpViewListeners();
    this.ativarEdicao(true);
    this.view.ativarBtnAtualizar(false);
    this.view.ativatBtnExcluir(false);
    this.view.packAndShow();
    }

    public void ocultarJanela() {
    fechar();
    }

    public CadastroBairrosView getView() {
    return this.view;
    }

    //Atualiza o modelo a partir da visão:
    public void updateModelFromView() {
    this.vo.setNome(view.getNome());
    this.vo.setDescricao(view.getDescricao());
    }

    //Atualiza o modelo a partir da tabela na visão:
    public void updateModelFromTable() {
    this.tableModel = view.getBairrosTableModel();
    this.vo = tableModel.getBairro(view.getLinhaSelecionadaTabela());
    //Renderiza a view:
    view.ativarNomeTextField(true);
    view.ativarDescricaoTextArea(true);
    view.ativarBtnLimpar(true);
    view.ativatBtnExcluir(true);
    view.ativarBtnCancelar(true);
    view.ativarBtnSalvar(false);
    view.ativarBtnAtualizar(true);

    }

    //Atualiza a visão a partir do modelo:
    public void updateViewFromModel() {
    if(vo != null) {
    this.view.setNome(vo.getNome());
    this.view.setDescricao(vo.getDescricao());
    }
    else {
    view.limparCampos();
    }
    }

    public void ativarEdicao(boolean b) {
    view.ativarNomeTextField(b);
    view.ativarDescricaoTextArea(b);
    view.ativarBtnSalvar(b);
    view.ativarBtnAtualizar(b);
    view.ativarBtnLimpar(b);
    view.ativatBtnExcluir(b);
    view.ativarBtnCancelar(b);
    }

    public void limparCamposView() {
    this.view.limparCampos();
    this.view.limparSelecaoTabela();
    this.view.ativatBtnExcluir(false);
    this.view.ativarBtnAtualizar(false);
    this.view.ativarBtnSalvar(true);
    }

    public void repopularTabela() {
    List lista = dao.listarTodos();
    view.setBairrosTableModel(new BairrosTableModel(lista));
    view.atualizarTabelaBairros();
    }

    //Atualiza na JTable valores inseridos ou deletados:
    public void updateTableModel(int op) {
    //Inserir
    if(op == 0) {
    vo.setID(dao.listarUltimoID());
    view.getBairrosTableModel().addBairro((BairroVO)vo.clone());
    }
    //Deletar
    else if(op == 1) {
    view.getBairrosTableModel().removeBairro(view.getLinhaSelecionadaTabela());
    }
    }

    //Chama ‘updateTableModel’ para renderizar a JTable:
    public void inserirBairro() {
    this.updateModelFromView();
    this.dao.inserir(vo);
    //Atualiza na JTable:
    this.updateTableModel(0);
    view.atualizarTabelaBairros();
    }

    //Não coloquei nada para atualizar no TableModel (pelo menos penso isso), mas mesmo assim atualiza sozinho (não sei porque):
    public void atualizarBairro() {
    this.updateModelFromView();
    this.dao.atualizar(vo);
    //Renderiza a view:
    view.atualizarTabelaBairros();
    limparCamposView();
    }
    //Chama ‘updateTableModel’ para renderizar a JTable:
    public void deletarBairro() {
    //Se não selecionou nenhum registro:
    if(view.getLinhaSelecionadaTabela() == -1) {
    JOptionPane.showMessageDialog((Component)getView(), “Selecione um registro para excluir!”,
    “Excluir registro”, JOptionPane.WARNING_MESSAGE);
    }
    else {
    this.updateModelFromTable();
    deletar();
    //Atualiza na JTable:
    this.updateTableModel(1);
    view.atualizarTabelaBairros();
    }
    }

    /**

    • Método para encerrar a aplicação.
    • Pergunta ao usuário se realmente deseja sair,
    • caso contrário a execução do aplicativo continua.
      /
      private void fechar () {
      // TODO add your handling code here:
      //Modifica o texto dos botões.
      Object [] options = {“Sim”,
      “Não”};
      //Variável ´n´ recebe o valor da opção clicada.
      int n = JOptionPane.showOptionDialog ((Component)getView(),
      “Deseja realmente sair da aplicação?”,
      “Encerrar aplicação”,
      JOptionPane.YES_NO_CANCEL_OPTION,
      JOptionPane.QUESTION_MESSAGE,
      null,
      options,
      options [1]);
      //Se Clicou para sair.
      if (n==0) {
      /

      * Torna a janela invisível em seguida
      * termina a execução do objeto.
      */
      view.ocultar();
      view.destruir();
      }
      }

    private void deletar() {
    // TODO add your handling code here:
    //Modifica o texto dos botões.
    Object [] options = {“Sim”,
    “Não”};
    //Variável ´n´ recebe o valor da opção clicada.
    int n = JOptionPane.showOptionDialog ((Component)getView(),
    “Deseja realmente excluir o registro?”,
    “Exclusão de registro”,
    JOptionPane.YES_NO_CANCEL_OPTION,
    JOptionPane.QUESTION_MESSAGE,
    null,
    options,
    options [1]);
    //Se Clicou para sair.
    if (n==0) {
    /*
    * Torna a janela invisível em seguida
    * termina a execução do objeto.
    */
    this.dao.deletar(vo);
    }
    }

    public void setUpViewListeners() {
    view.setSalvarActionListener(new CadBairrosWindowListeners.SalvarActionListener(this));
    view.setAtualizarActionListener(new CadBairrosWindowListeners.AtualizarActionListener(this));
    view.setLimparActionListener(new CadBairrosWindowListeners.LimparActionListener(this));
    view.setExcluirActionListener(new CadBairrosWindowListeners.ExcluirActionListener(this));
    view.setCancelarActionListener(new CadBairrosWindowListeners.CancelarActionListener(this));
    view.setFormularioWindowAdpter(new CadBairrosWindowListeners.FormularioWindowAdapter(this));
    view.setFieldNomeFocusListener(new CadBairrosWindowListeners.FieldNomeFocusListener(this));
    view.setFieldDescricaoFocusListener(new CadBairrosWindowListeners.FieldDescricaoFocusListener(this));
    view.setTableBairrosMouseListener(new CadBairrosMouseListeners.TabelaBairrosMouseListener(this));
    }
    }
    [/code]

Aguardo uma ajuda pra resolver este mistério… haha :oops:
Muito obrigado pessoal… :slight_smile: [/quote]

Com a ajuda do andbecker consegui resolver o problema
Vou explicar o que estava acontecendo aqui, bom me corrijam se eu estiver errado. :roll:
O que acontecia no erro de inserir/atualizar registros no TableModel era o seguinte:
Eu estava trabalhando com atributos/objetos mutáveis (objetos que instanciei de BairroVO), então quanto eu utilizava o operador de atribuição “=” no método abaixo por exemplo:

/** * Método que atualiza o Modelo a partir da tabela na Visão. */ public void updateModelFromTable() { //Se foi selecionada alguma linha: if(view.getLinhaSelecionadaTabela() != -1) { this.tableModel = view.getBairrosTableModel(); //Aqui óh, recebendo mesma referência: this.vo = tableModel.getBairro(view.getLinhaSelecionadaTabela()); //Renderiza a View: view.ativarNomeTextField(true); view.ativarDescricaoTextArea(true); view.ativarBtnLimpar(true); view.ativatBtnExcluir(true); view.ativarBtnCancelar(true); view.ativarBtnSalvar(false); view.ativarBtnAtualizar(true); } //Se não foi selecionada nenhuma linha objeto 'vo' é nulo: else { this.vo = null; } }
Acabava tendo dois objetos que apontavam para o mesmo endereço na memória (mesma referência), ou seja, se eu alterasse um o outro (“cópia”) também enxergava as mudanças, a solução foi fazer o que o andbecker me sugeriu, “limpar” o objeto, para isso fiz umas modificações no código, para verificar se o usuário desistiu da uma atualização de um registro e/ou se acabou de fazer a atualização de um registro, caso as condições sejam satisfeitas, um método que chamei de ‘verifyModelToInsert()’, (não reparem o nome, mas é que estou procurando deixar meus métodos/atributos/classes etc com nomes em inglês hahaha lol :idea: ) ele faz com que seja inserida uma nova instância (o que é o correto) na lista do TableModel, evitando esse efeito (espécie de espelho), muito conhecido quando se tenta clonar um atributo mutável, ou clonar/copiar um objeto para outro utilizando o operador “=” diretamente.
Estou colocando o código modificado para maiores esclarecimentos, correções, críticas etc.
E indico também esses tópicos, neles tirei essa dúvida, pensei que era algo muito complicado, mas foi mais mesmo uma ignorância minha do funcionamento das coisas: :00ps:

http://www.guj.com.br/java/217944-alguem-usa-clone-metodo-de-object
http://www.guj.com.br/java/275123-clonar-objetosresolvido#1446341
http://www.guj.com.br/java/250021-resolvido-clonar-objeto

http://javafree.uol.com.br/topic-13081-Passagem-de-Parametros.html
http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html
http://javafree.uol.com.br/topic-5850-Java-por-valor-ou-por-referencia.html
http://javafree.uol.com.br/topic-875651-Melhor-forma-para-duplicar-um-objeto.html

BairrosTableModel:

[code]package br.view;

import br.model.vo.BairroVO;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
*

  • @author Leandro
    */
    public class BairrosTableModel extends AbstractTableModel {
    private List linhas;
    private String colunas[] = new String[] {“Código”, “Nome”, “Descrição”};

    public BairrosTableModel() {
    this.linhas = new ArrayList<>();
    }

    public BairrosTableModel(List lista) {
    this.linhas = new ArrayList<>(lista);
    }

    @Override
    public int getRowCount() {
    return linhas.size();
    }

    @Override
    public int getColumnCount() {
    return colunas.length;
    }

    @Override
    public String getColumnName(int columnIndex) {
    return colunas[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
    switch(columnIndex) {
    case 0: //ID
    return Integer.class;
    case 1: //Nome
    return String.class;
    case 2: //Descrição
    return String.class;
    default:
    throw new IndexOutOfBoundsException(“Índice informado fora dos limites.”);
    }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    BairroVO vo = linhas.get(rowIndex);
    switch(columnIndex) {
    case 0: //ID
    return vo.getID();
    case 1: //Nome
    return vo.getNome();
    case 2: //Descrição
    return vo.getDescricao();
    default:
    throw new IndexOutOfBoundsException(“Índice informado fora dos limites.”);
    }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    // BairroVO vo = linhas.get(rowIndex);
    // switch(columnIndex) {
    // case 0: //ID
    // vo.setID(Integer.parseInt(aValue.toString()));
    // case 1: //Nome
    // vo.setNome(aValue.toString());
    // case 2: //Descrição
    // vo.setDescricao(aValue.toString());
    // }
    // fireTableCellUpdated(rowIndex, columnIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
    }

    /*

    • Implementações particulares:
      */

    public BairroVO getBairro(int rowIndex) {
    return linhas.get(rowIndex);
    }

    public void addBairro(BairroVO vo) {
    linhas.add(vo);
    int lastIndex = getRowCount()-1;
    fireTableRowsInserted(lastIndex, lastIndex);
    }

    public void updateBairro(BairroVO vo, int index) {
    linhas.set(index, vo);
    fireTableRowsUpdated(linhas.indexOf(vo), linhas.indexOf(vo));
    }

    public void removeBairro(int rowIndex) {
    linhas.remove(rowIndex);
    fireTableRowsDeleted(rowIndex, rowIndex);
    }

    public void removeBairro(BairroVO vo) {
    linhas.remove(vo);
    fireTableRowsDeleted(linhas.indexOf(vo), linhas.indexOf(vo));
    }

    public void removeBairro(List lista) {
    int indice = 0;
    for(BairroVO v : lista) {
    indice = linhas.indexOf(v);
    linhas.remove(v);
    fireTableRowsDeleted(indice, indice);
    }
    }

    public void addListaBairros(List lista) {
    int tamanhoAntigo = getRowCount();
    linhas.addAll(lista);
    fireTableRowsInserted(tamanhoAntigo, getRowCount()-1);
    }

    public void limpar() {
    if(!linhas.isEmpty()) {
    linhas.clear();
    fireTableDataChanged();
    }
    }

    public boolean isEmpty() {
    return linhas.isEmpty();
    }

    public void ordenarPorID() {
    Collections.sort(linhas, new Comparator(){

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getID()-o2.getID();
         }
     });
     fireTableDataChanged();
    

    }

    public void ordenarPorNome() {
    Collections.sort(linhas, new Comparator() {

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getNome().compareTo(o2.getNome());
         }
     });
     fireTableDataChanged();
    

    }

    public void ordenarPorDescricao() {
    Collections.sort(linhas, new Comparator() {

         @Override
         public int compare(BairroVO o1, BairroVO o2) {
             return o1.getDescricao().compareTo(o2.getDescricao());
         }
     });
     fireTableDataChanged();
    

    }
    }
    [/code]

CadastroBairrosPresenter:

[code]package br.presenter;

import br.model.dao.BairroDAO;
import br.model.vo.BairroVO;
import br.presenter.listeners.CadastroBairrosMouseListeners;
import br.presenter.listeners.CadastroBairrosWindowListeners;
import br.view.BairrosTableModel;
import br.view.CadastroBairrosView;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
*

  • @author Leandro
    */
    public class CadastroBairrosPresenter {
    private BairroVO vo;
    private BairroDAO dao;
    private CadastroBairrosView view;
    private BairrosTableModel tableModel;

    public CadastroBairrosPresenter(BairroDAO dao, CadastroBairrosView view) {
    this.vo = new BairroVO();
    this.dao = dao; //Recebe por uma factory de DAOS.
    this.view = view;
    //Popula o modelo de tabela na sua inicialização:
    this.tableModel = new BairrosTableModel(this.dao.listarTodos());

     /*
      * Seta o TableModel da JTable, sem isso teremos uma 'java.lang.ClassCastException', 
      * ao tentar recuperar o modelo de tabela da Visão, pois o modelo pradrão do JTable 
      * que é 'DefaultTableModel' não implementa a interface 'TableModel', porém o modelo 
      * 'BairrosTableModel' (extends AbstractTableModel) implementa 'TableModel', 
      * permitindo assim o casting no momento em que formos recuperar o modelo da Visão.
     */
     view.setBairrosTableModel(tableModel);
    

    }

    /**

    • Método para criação da janela de cadastro.
    • Este método adiciona os ouvintes, habilita a ediçao e exibe a janela.
      */
      public void criarJanela() {
      this.setUpViewListeners();
      this.ativarEdicao(true);
      this.view.ativarBtnAtualizar(false);
      this.view.ativatBtnExcluir(false);
      this.view.packAndShow();
      }

    /**

    • Chame este método para ocultar a janela.
    • @see Método ‘exibirDialogoFechar()’.
      */
      public void ocultarJanela() {
      exibirDialogoFechar();
      }

    /**

    • Chame este método para retornar a Visão utilizada atualmente.
      */
      public CadastroBairrosView getView() {
      return this.view;
      }

    /**

    • Verifica se o objeto ‘vo’ recebeu uma referência da lista do TableModel,
    • e caso tenha recebido, o objeto ‘vo’ recebe uma nova instância para que
    • seja incluida na lista a fim de evitar que existam dois ou mais objetos com
    • a mesma referência na lista e assim causar o “efeito espelho”.
    • Se: VO igual a nulo = Desistiu de atualização;
    • Se: VO.getID diferente de 0 = Selecionou registro para atualizar.
      */
      public void verifyModelToInsert() {
      if(this.vo == null || this.vo.getID() != 0) {
      this.vo = new BairroVO();
      }
      }

    /**

    • Método que atualiza o Modelo a partir da Visão.
      */
      public void updateModelFromView() {
      this.vo.setNome(view.getNome());
      this.vo.setDescricao(view.getDescricao());
      }

    /**

    • Método que atualiza o Modelo a partir da tabela na Visão.
      */
      public void updateModelFromTable() {
      //Se foi selecionada alguma linha:
      if(view.getLinhaSelecionadaTabela() != -1) {
      this.tableModel = view.getBairrosTableModel();
      this.vo = tableModel.getBairro(view.getLinhaSelecionadaTabela());
      //Renderiza a View:
      view.ativarNomeTextField(true);
      view.ativarDescricaoTextArea(true);
      view.ativarBtnLimpar(true);
      view.ativatBtnExcluir(true);
      view.ativarBtnCancelar(true);
      view.ativarBtnSalvar(false);
      view.ativarBtnAtualizar(true);
      }
      //Se não foi selecionada nenhuma linha objeto ‘vo’ é nulo:
      else {
      this.vo = null;
      }
      }

    /**

    • Método que atualiza a Visão a partir do Modelo.
      */
      public void updateViewFromModel() {
      if(vo != null) {
      this.view.setNome(vo.getNome());
      this.view.setDescricao(vo.getDescricao());
      }
      else {
      verifyModelToInsert();
      restaurarEdicaoInicial();
      }
      }

    /**

    • Método que retorna uma lista com os itens a excluir conforme a seleção
    • do usuário na tabela.
      */
      public List getListaExcluir() {
      int selecionados [] = view.getLinhasSelecionadasTabela();
      List excluidos = new ArrayList<>();
      if(selecionados.length > 0) {
      for(int i = 0; i < selecionados.length; i++) {
      excluidos.add(tableModel.getBairro(selecionados[i]));
      }
      }
      return excluidos;
      }

    /**

    • Método para repopular o TableModel a partir de uma listagem dos registros
    • no Banco de Dados.
      */
      public void repopularTabela() {
      List lista = dao.listarTodos();
      view.getBairrosTableModel().limpar();
      view.setBairrosTableModel(new BairrosTableModel(lista));
      view.atualizarTabelaBairros();
      }

    /**

    • Este método ativa todos os campos e botões disponíveis na Visão.
    • @param b A opção de ativar ou desativar os campos e botões na Visão.
      */
      public void ativarEdicao(boolean b) {
      view.ativarNomeTextField(b);
      view.ativarDescricaoTextArea(b);
      view.ativarBtnSalvar(b);
      view.ativarBtnAtualizar(b);
      view.ativarBtnLimpar(b);
      view.ativatBtnExcluir(b);
      view.ativarBtnCancelar(b);
      }

    /**

    • Método para restaurar a edição inicial na janela, limpando os campos,
    • desativando os botões de Excluir e Atualizar.
    • Este método também “limpa” o objeto ‘vo’ por ser um atributo mutável,
    • para evitar erros de atualização nas listas de registros da tabela.
      */
      public void restaurarEdicaoInicial() {
      this.view.limparCampos();
      this.view.limparSelecaoTabela();
      this.view.ativatBtnExcluir(false);
      this.view.ativarBtnAtualizar(false);
      this.view.ativarBtnSalvar(true);
      }

    /**

    • Método para atualizar o TableModel conforme a operação executada.
    • @param operacao A operação realizada.
    • Informe: 0 para inserção.
    • Informe: 1 para deleção.
    • Informe: 2 para atualização.
      */
      public void updateTableModel(int operacao) {
      //Inserir:
      if(operacao == 0) {
      vo.setID(dao.listarUltimoID());
      view.getBairrosTableModel().addBairro((BairroVO)vo.clone());
      }
      //Deletar:
      else if(operacao == 1) {
      view.getBairrosTableModel().removeBairro(getListaExcluir());
      }
      //Atualizar:
      else if(operacao == 2) {
      view.getBairrosTableModel().updateBairro(vo, view.getLinhaSelecionadaTabela());
      }
      }

    /**

    • Este método permite inserir um novo registro no Modelo da Tabela e no
    • Banco de Dados chamando os métodos de outros objetos para realizar a
    • persistência dos dados inseridos na Visão.
      */
      public void inserirBairro() {
      verifyModelToInsert();
      this.updateModelFromView();
      this.dao.inserir(vo);
      //Chama ‘updateTableModel()’ para atualizar o TableModel:
      this.updateTableModel(0);
      //Renderiza a tabela:
      view.atualizarTabelaBairros();
      }

    /**

    • Este método permite atualizar um registro no Modelo de Tabela e no Banco de Dados
    • com os dados que foram alterados na Visão chamando os métodos de outros objetos
    • para realizar a persistência.
      */
      public void atualizarBairro() {
      this.updateModelFromView();
      this.dao.atualizar(vo);
      //Chama ‘updateTableModel()’ para atualizar o TableModel:
      updateTableModel(2);
      //Renderiza a tabela:
      view.atualizarTabelaBairros();
      //Restaura a edição inicial para inserir ou atualizar um registro:
      restaurarEdicaoInicial();
      }

    /**

    • Este método permite deletar um registro no Modelo de Tabela e no Banco de Dados
    • através da seleção de um ou mais registros na JTable pelo usuário.
    • @see Método ‘exibirDialogoFechar()’.
      */
      public void deletarBairro() {
      //Se não selecionou nenhum registro:
      if(view.getLinhaSelecionadaTabela() == -1) {
      JOptionPane.showMessageDialog((Component)getView(), “Selecione um ou mais registros para excluir!”,
      “Excluir registros”, JOptionPane.WARNING_MESSAGE);
      }
      //Se selecionou algum registro:
      else {
      //Atualiza o modelo com os dados vindos da seleção na tabela:
      this.updateModelFromTable();
      //Chama a exibição de um diálogo de confirmação:
      exibirDialogoDeletar();
      }
      }

    /**

    • Método para ocultar a janela de cadastro.
    • Pergunta ao usuário se realmente deseja sair,
    • caso contrário a execução da janela de cadastro continua.
      /
      private void exibirDialogoFechar () {
      // TODO add your handling code here:
      //Modifica o texto dos botões.
      Object [] options = {“Sim”,
      “Não”};
      //Variável ‘n’ recebe o valor da opção clicada.
      int n = JOptionPane.showOptionDialog ((Component)getView(),
      “Deseja realmente sair da aplicação?”,
      “Encerrar aplicação”,
      JOptionPane.YES_NO_CANCEL_OPTION,
      JOptionPane.QUESTION_MESSAGE,
      null,
      options,
      options [1]);
      //Se Clicou para sair.
      if (n==0) {
      /

      * Torna a janela invisível em seguida
      * termina a execução do objeto.
      */
      view.ocultar();
      view.destruir();
      }
      }

    /**

    • Este método exibe uma caixa de confirmação para a exclusão de registros.
      */
      private void exibirDialogoDeletar() {
      // TODO add your handling code here:
      //Modifica o texto dos botões.
      Object [] options = {“Sim”,
      “Não”};
      //Variável ´n´ recebe o valor da opção clicada.
      int n = JOptionPane.showOptionDialog ((Component)getView(),
      “Deseja realmente excluir o(s) registro(s)?”,
      “Exclusão de registros”,
      JOptionPane.YES_NO_CANCEL_OPTION,
      JOptionPane.QUESTION_MESSAGE,
      null,
      options,
      options [1]);
      if (n==0) {
      //Manda uma lista com itens para o DAO realizar a exclusão do Banco de Dados:
      this.dao.deletar(getListaExcluir());
      //Chama ‘updateTableModel()’ para atualizar o TableModel:
      this.updateTableModel(1);
      //Renderiza a tabela:
      view.atualizarTabelaBairros();
      //Restaura a edição inicial para inserir, deletar ou atualizar um registro:
      restaurarEdicaoInicial();
      }
      }

    /**

    • Chame este método no momento de construir a janela, este método adiciona
    • os ouvintes nos componentes.
      */
      public void setUpViewListeners() {
      view.setSalvarActionListener(new CadastroBairrosWindowListeners.SalvarActionListener(this));
      view.setAtualizarActionListener(new CadastroBairrosWindowListeners.AtualizarActionListener(this));
      view.setLimparActionListener(new CadastroBairrosWindowListeners.LimparActionListener(this));
      view.setExcluirActionListener(new CadastroBairrosWindowListeners.ExcluirActionListener(this));
      view.setCancelarActionListener(new CadastroBairrosWindowListeners.CancelarActionListener(this));
      view.setFormularioWindowAdpter(new CadastroBairrosWindowListeners.FormularioWindowAdapter(this));
      view.setFieldNomeFocusListener(new CadastroBairrosWindowListeners.FieldNomeFocusListener(this));
      view.setFieldDescricaoFocusListener(new CadastroBairrosWindowListeners.FieldDescricaoFocusListener(this));
      view.setTableBairrosMouseListener(new CadastroBairrosMouseListeners.TabelaBairrosMouseListener(this));
      }
      }
      [/code]

Obrigado. :smile: