[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
:
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…
[/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: :smile:](//www.guj.com.br/images/emoji/twitter/smile.png?v=5)