Olá pessoal, tenho um form que carrega a jtable certinho com os dados bancos.
Sem utilizar o filtro na lista consigo realizar as operações de excluir e atualizar normalmente.
Porém ao acionar o evento KeyReleased no jtextField filtrando a tabela (Filtra corretamente) acontece a seguinte situação:
Editar: ao selecionar a linha desejado para editar o campo preenche uma jtextField e ao alterar a informação ao invés de alterar a linha selecionada é criado uma outra linha com a atualização.
Excluir: ao selecionar a linha desejado não exclui.
Isso acontece apenas com o filtro ativado!
Segui minhas classes relevantes para analise:
O FORMULÁRIO
package View.Forms;
import Controller.ArroladoPorController;
import java.awt.Color;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
/**
*
* @author Usuario
*/
public final class FrmArroladoPor extends javax.swing.JDialog {
private final ArroladoPorController controller;
private String estado;
/**
* Creates new form frmArroladoPor
*
* @param owner
* @param modal
* @throws java.sql.SQLException
*/
public FrmArroladoPor(java.awt.Frame owner, boolean modal) throws SQLException {
super(owner, modal);
initComponents();
controller = new ArroladoPorController(this);
startScreen();
}
private void initComponents() {
(...)
private void btnNovoActionPerformed(java.awt.event.ActionEvent evt) {
estado = "salvar";
controller.setarEstadoComponentes(4);
controller.limparCampos();
}
private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {
try {
controller.inserir(estado);
controller.setarEstadoComponentes(1);
} catch (SQLException ex) {
Logger.getLogger(FrmArroladoPor.class.getName()).log(Level.SEVERE, null, ex);
}
controller.limparCampos();
}
private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {
try {
controller.excluir();
controller.limparCampos();
controller.setarEstadoComponentes(1);
} catch (SQLException ex) {
Logger.getLogger(FrmArroladoPor.class.getName()).log(Level.SEVERE, null, ex);
}
}
private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) {
controller.setarEstadoComponentes(6);
estado = "editar";
}
private void btnSelecionarActionPerformed(java.awt.event.ActionEvent evt) {
}
private void txtPesquisarKeyReleased(java.awt.event.KeyEvent evt) {
// estado = "editar";
controller.filtrar();
controller.setarEstadoComponentes(2);
}
private void tabelaKeyPressed(java.awt.event.KeyEvent evt) {
estado = "editar";
controller.selecionarLinha();
controller.setarEstadoComponentes(3);
}
private void txtDescricaoKeyReleased(java.awt.event.KeyEvent evt) {
getTxtDescricao().setBackground(Color.WHITE);
}
public void startScreen() throws SQLException {
controller.iniciaTela();
controller.carregaTabela();
controller.setarEstadoComponentes(1);
}
public JButton getBtnEditar() {
return btnEditar;
}
public void setBtnEditar(JButton btnEditar) {
this.btnEditar = btnEditar;
}
public JButton getBtnExcluir() {
return btnExcluir;
}
public void setBtnExcluir(JButton btnExcluir) {
this.btnExcluir = btnExcluir;
}
public JButton getBtnNovo() {
return btnNovo;
}
public void setBtnNovo(JButton btnNovo) {
this.btnNovo = btnNovo;
}
public JButton getBtnSalvar() {
return btnSalvar;
}
public void setBtnSalvar(JButton btnSalvar) {
this.btnSalvar = btnSalvar;
}
public JButton getBtnSelecionar() {
return btnSelecionar;
}
public void setBtnSelecionar(JButton btnSelecionar) {
this.btnSelecionar = btnSelecionar;
}
public JTable getTabela() {
return tabela;
}
public void setTabela(JTable tabela) {
this.tabela = tabela;
}
public JTextField getTxtPesquisar() {
return txtPesquisar;
}
public void setTxtPesquisar(JTextField txtPesquisar) {
this.txtPesquisar = txtPesquisar;
}
public JPanel getPnlCadastro() {
return pnlCadastro;
}
public void setPnlCadastro(JPanel pnlCadastro) {
this.pnlCadastro = pnlCadastro;
}
public JPanel getPnlPesquisarPor() {
return pnlPesquisarPor;
}
public void setPnlPesquisarPor(JPanel pnlPesquisarPor) {
this.pnlPesquisarPor = pnlPesquisarPor;
}
public JPanel getPnlTabela() {
return pnlTabela;
}
public void setPnlTabela(JPanel pnlTabela) {
this.pnlTabela = pnlTabela;
}
public JTextField getTxtDescricao() {
return txtDescricao;
}
public void setTxtDescricao(JTextField txtDescricao) {
this.txtDescricao = txtDescricao;
}
// Variables declaration - do not modify
private javax.swing.JButton btnEditar;
private javax.swing.JButton btnExcluir;
private javax.swing.JButton btnNovo;
private javax.swing.JButton btnSalvar;
private javax.swing.JButton btnSelecionar;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel pnlAções;
private javax.swing.JPanel pnlCadastro;
private javax.swing.JPanel pnlPesquisarPor;
private javax.swing.JPanel pnlTabela;
private javax.swing.JScrollPane scrPane;
private javax.swing.JTable tabela;
private javax.swing.JTextField txtDescricao;
private javax.swing.JTextField txtPesquisar;
CONTROLLER
package Controller;
import Controller.Helper.ArroladoPorHelper;
import Controller.Helper.HelperForHall;
import View.Forms.FrmArroladoPor;
import java.sql.SQLException;
/**
*
* @author Usuario
*/
public class ArroladoPorController {
private final FrmArroladoPor view;
private final ArroladoPorHelper helper;
private final HelperForHall helperForHall;
public ArroladoPorController(FrmArroladoPor view) throws SQLException {
this.view = view;
this.helper = new ArroladoPorHelper(view);
this.helperForHall = new HelperForHall();
}
public void limparCampos() {
helperForHall.limpaCampos(view.getPnlPesquisarPor());
helperForHall.limpaCampos(view.getPnlCadastro());
}
public void iniciaTela() {
helperForHall.iniciaTela(this.view, "Pesquisa e Cadastra Arrolado Por");
}
public void carregaTabela() throws SQLException {
helper.carregaTabelaBuscandoNoBanco();
}
public void inserir(String estado) throws SQLException {
if ("salvar".equals(estado)) {
helper.inserir();
}
if ("editar".equals(estado)) {
helper.atualizar();
}
}
public void excluir() throws SQLException {
helper.excluir();
}
public void filtrar() {
helper.filtrarTabela();
}
public void selecionarLinha() {
helper.selecionarLinha(view.getTabela());
}
public void setarEstadoComponentes(int estado) {
helper.setarEstadoComponentes(estado);
}
}
HELPER DO CONTROLLER
package Controller.Helper;
import Model.ArroladoPor;
import Dao.ArroladoPorDao;
import Model.Table.MeuRenderer;
import Model.Table.TableArroladoPor;
import View.Forms.FrmArroladoPor;
import java.awt.Color;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.event.ListSelectionEvent;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
/**
*
* @author Usuario
*/
public class ArroladoPorHelper {
private FrmArroladoPor view;
private TableArroladoPor modeloTabela;
private HelperForHall helperForHall;
private ArroladoPorDao dao;
private ArroladoPor objClasse;
public ArroladoPorHelper(FrmArroladoPor view) throws SQLException {
this.dao = new ArroladoPorDao();
this.view = view;
this.helperForHall = new HelperForHall();
}
public ArroladoPorHelper() {
}
public ArroladoPor instanciaObjClasseArroladoPorComId() {
String descricao = view.getTxtDescricao().getText().toUpperCase().trim();
int id = Integer.parseInt((view.getTabela().getValueAt(view.getTabela().getSelectedRow(), 0)).toString());
objClasse = new ArroladoPor(id, descricao);
return objClasse;
}
public ArroladoPor instanciaObjClasseArroladoPorSemId() {
String descricao = view.getTxtDescricao().getText().toUpperCase().trim();
objClasse = new ArroladoPor(descricao);
return objClasse;
}
public void inserir() throws SQLException {//pronto
if (view.getTxtDescricao().getText().trim().equalsIgnoreCase("")) {
JOptionPane.showMessageDialog(null,
"O campo descrição não pode ficar vazio!",
"Validação ", JOptionPane.ERROR_MESSAGE);
view.getTxtDescricao().setBackground(Color.LIGHT_GRAY);
} else {
if (dao.VerificacaoSalvar(instanciaObjClasseArroladoPorSemId()) != true) {
dao.salvar(instanciaObjClasseArroladoPorSemId());//SALVA NO BANCO
modeloTabela.addRow(objClasse);
helperForHall.limpaCampos(view.getPnlPesquisarPor());
javax.swing.JOptionPane.showMessageDialog(null,
"Novo registro armazenado com sucesso!",
"Cadastro", JOptionPane.INFORMATION_MESSAGE);
} else {
javax.swing.JOptionPane.showMessageDialog(null,
"Não foi possivel salvar, registro já existente!",
"Verificação ao Salvar ", JOptionPane.ERROR_MESSAGE);
}
}
}
public void atualizar() throws SQLException {//pronto
if (view.getTabela().getSelectedRow() != -1) {
if (dao.verificaAlterar(instanciaObjClasseArroladoPorComId()) == true) {
JOptionPane.showMessageDialog(null,
"Não foi possivel editar, registro já existente!",
"Verificação ao Editar", JOptionPane.ERROR_MESSAGE);
} else {
dao.alterar(instanciaObjClasseArroladoPorComId());
helperForHall.limpaCampos(view.getPnlPesquisarPor());
//ATUALIZA A TABELA
modeloTabela.setValueAt(instanciaObjClasseArroladoPorComId(), view.getTabela().getSelectedRow(), 0);
modeloTabela.setValueAt(instanciaObjClasseArroladoPorComId(), view.getTabela().getSelectedRow(), 1);
modeloTabela.fireTableDataChanged();
JOptionPane.showMessageDialog(null,
"Alteracão realizado com sucesso!", "Alteração",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
public void excluir() throws SQLException {
String simNao[] = {"Sim", "Nao"};
int exclui = JOptionPane.showOptionDialog(null, "Confirma exclusão?", "Excluindo...",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, simNao, simNao[1]);
if (exclui == 0) {
if (view.getTabela().getSelectedRow() != -1) {
if (dao.verificaExcluir(instanciaObjClasseArroladoPorComId()) != true) {
//NÃO EXISTE EM OUTRA TABELA PODE EXCLUIR
dao.excluir(instanciaObjClasseArroladoPorComId());
modeloTabela.removeRow(view.getTabela().getSelectedRow());
JOptionPane.showMessageDialog(null, "Exclusão realizado com sucesso!",
"Exclusão", JOptionPane.INFORMATION_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "Registro existente em outra tabela!",
"Verificação ", javax.swing.JOptionPane.ERROR_MESSAGE);
}
}
}
}
public void carregaTabelaBuscandoNoBanco() throws SQLException {
ArrayList lista = (ArrayList) dao.selectAll();
modeloTabela = new TableArroladoPor(lista);
configuraTabela(modeloTabela);
}
private void configuraTabela(TableArroladoPor model) {
view.getTabela().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel lsm = view.getTabela().getSelectionModel();
lsm.addListSelectionListener((ListSelectionEvent e) -> {
if (!e.getValueIsAdjusting()) {
selecionarLinha(view.getTabela());
}
});
javax.swing.table.TableCellRenderer renderer = new MeuRenderer();
view.getTabela().setDefaultRenderer(Object.class, renderer);
TableRowSorter<TableModel> sorter = new TableRowSorter<>(modeloTabela);
view.getTabela().setRowSorter(sorter);
view.getTabela().setModel(model);
view.getTabela().getTableHeader().setReorderingAllowed(false);
view.getTabela().getColumnModel().getColumn(0).setMinWidth(0);
view.getTabela().getColumnModel().getColumn(0).setMaxWidth(0);
}
public void filtrarTabela() {
TableRowSorter<TableModel> sorter = new TableRowSorter<>(modeloTabela);
view.getTabela().setRowSorter(sorter);
String text = view.getTxtPesquisar().getText().toUpperCase();
if (text.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(text));
}
}
public void selecionarLinha(JTable tabela) {
if (tabela.getSelectedRow() != -1) {
int lin = view.getTabela().getSelectedRow();
String descricao = (view.getTabela().getValueAt(lin, 1).toString().trim());
view.getTxtDescricao().setText(descricao);
setarEstadoComponentes(3);
} else {
view.getTxtDescricao().setText("");
}
}
// public void cancelarOperacao() throws SQLException {
// FrmArroladoPor frmArroladoPor;
// frmArroladoPor = new FrmArroladoPor(null, true);
// frmArroladoPor.startScreen();
// helperForHall.fieldClean(view.getPnlCadastro());
// helperForHall.fieldClean(view.getPnlPesquisarPor());
// view.getTxtDescricao().setBackground(Color.white);
// preencheTabela();
// setarEstadoComponentes(1);
// }
public void setarEstadoComponentes(int estado) {
switch (estado) {
//inicializa o formulario
//ao excluir
case 1:
view.getTxtPesquisar().grabFocus();
view.getTxtPesquisar().setEnabled(true);
view.getTabela().setEnabled(false);
view.getTxtDescricao().setEnabled(false);
view.getBtnNovo().setEnabled(true);
view.getBtnSalvar().setEnabled(false);
view.getBtnEditar().setEnabled(false);
view.getBtnExcluir().setEnabled(false);
view.getBtnSelecionar().setEnabled(false);
break;
//ao filtrar
case 2:
view.getTxtPesquisar().setEnabled(true);
view.getTabela().setEnabled(true);
view.getTxtDescricao().setEnabled(false);
view.getBtnNovo().setEnabled(true);
view.getBtnSalvar().setEnabled(false);
view.getBtnEditar().setEnabled(false);
view.getBtnExcluir().setEnabled(false);
view.getBtnSelecionar().setEnabled(false);
break;
//ao selecionar linha tabela
case 3:
view.getTxtPesquisar().setEnabled(true);
view.getTabela().setEnabled(true);
view.getTxtDescricao().setEnabled(false);
view.getBtnNovo().setEnabled(false);
view.getBtnSalvar().setEnabled(false);
view.getBtnEditar().setEnabled(true);
view.getBtnExcluir().setEnabled(true);
view.getBtnSelecionar().setEnabled(false);
break;
//ao clicar botão novo
case 4:
view.getTxtDescricao().grabFocus();
view.getTxtPesquisar().setEnabled(true);
view.getTabela().setEnabled(false);
view.getTxtDescricao().setEnabled(true);
view.getBtnNovo().setEnabled(false);
view.getBtnSalvar().setEnabled(true);
view.getBtnEditar().setEnabled(false);
view.getBtnExcluir().setEnabled(false);
view.getBtnSelecionar().setEnabled(false);
break;
//ao apertar Salvar
case 5:
view.getTxtDescricao().grabFocus();
view.getTxtPesquisar().setEnabled(true);
view.getTabela().setEnabled(false);
view.getTxtDescricao().setEnabled(true);
view.getBtnNovo().setEnabled(false);
view.getBtnSalvar().setEnabled(true);
view.getBtnEditar().setEnabled(false);
view.getBtnExcluir().setEnabled(false);
view.getBtnSelecionar().setEnabled(false);
break;
//ao apertar Editar
case 6:
view.getTxtDescricao().grabFocus();
view.getTxtPesquisar().setEnabled(true);
view.getTabela().setEnabled(true);
view.getTxtDescricao().setEnabled(true);
view.getBtnNovo().setEnabled(false);
view.getBtnSalvar().setEnabled(true);
view.getBtnEditar().setEnabled(false);
view.getBtnExcluir().setEnabled(false);
view.getBtnSelecionar().setEnabled(false);
break;
default:
break;
}
}
}
MODELA DA TABELA DA CLASSE
package Model.Table;
import Model.ArroladoPor;
import java.util.ArrayList;
import java.util.Collections;
/**
*
* @author Usuario
*/
public class TableArroladoPor extends TableModelPadrao {
public TableArroladoPor(ArrayList linhas) {
super(linhas);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
ArroladoPor a = (ArroladoPor) linhas.get(rowIndex);
switch (columnIndex) {
case 0:
return a.getIdArrolado();
case 1:
return a.getDescricao();
default:
// Se o índice da coluna não for válido, lança um
// IndexOutOfBoundsException (Exceção de índice fora dos limites).
// Não foi necessário verificar se o índice da linha é inválido,
// pois o próprio ArrayList lança a exceção caso seja inválido.
throw new IndexOutOfBoundsException("Numero de colunas no TableArroladoPor"
+ " não é compativel com dados do banco");
}
}
@Override
protected String[] criarColunas() {
return new String[]{"Id", "Descricão"};
}
@Override
protected boolean[] colEditavel() {
return new boolean[]{false, false};
}
@Override
public void addRow(Object o) {
this.linhas.add(o);
Collections.sort (this.linhas);
this.fireTableDataChanged();
}
@Override
public void removeRow(int linha) {
this.linhas.remove(linha);
this.fireTableRowsDeleted(linha, linha);
this.fireTableDataChanged();
}
@Override
public void setValueAt(Object obj, int linha, int coluna) {
ArroladoPor a = (ArroladoPor) linhas.get(linha);
switch (coluna) {
// case 0: // Primeira coluna é o codigo.
// a.setIdArrolado(Integer.parseInt((String) obj));
// break;
case 1: // Segunda coluna é o descricao.
a.setDescricao(obj.toString());
break;
}
this.fireTableCellUpdated(linha, coluna);
}
@Override
public int getRowCount() {
return linhas.size();
}
@Override
public int getColumnCount() {
return colunas.length;
}
}