Manipular Jtable

Olá pessoal,

sou iniciante e antes de postar aqui meu pedido de ajuda estou a uns dias pesquisando como sanar minhas duvidas mas sem sucesso.

bom vamos, lá…

Em um form tenho um campo jtextField, jtable e botões novo, inserir, atualizar, excluir e atualizar.

manipular a tabela do banco de dados está tudo, carregar a jtable tbm! porem não estou conseguindo atualizar o jtable, ao excluir, editar sem ter que ficar buscando do BD o tempo todo até mesmo que não faz sentido isso. (vários lugares ensinam desta maneira).

segue as classes:

package Model.Table;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Usuario
 */
public abstract class TableModelPadrao extends AbstractTableModel {

    protected String[] colunas;
    protected ArrayList linhas;
    protected boolean[] colEditavel;

    public TableModelPadrao(ArrayList linhas) {
        setColunas(criarColunas());
        setColEditavel(colEditavel);
        this.linhas = linhas;
    }

    protected abstract String[] criarColunas();

    protected abstract boolean[] colEditavel();

    @Override
    public int getRowCount() {
        if (linhas != null) {
            return linhas.size();
        } else {
            return 0;
        }
    }

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

    @Override
    public boolean isCellEditable(int row, int col) {
        return false;
    }

    @Override
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

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

    //Getter e Setter
    public String[] getColunas() {
        return colunas;
    }

    public final void setColunas(String[] colunas) {
        this.colunas = colunas;
    }

    public ArrayList getLinhas() {
        return linhas;
    }

    public void setLinhas(ArrayList linhas) {
        this.linhas = linhas;
        fireTableDataChanged();
    }

    public boolean[] getColEditavel() {
        return colEditavel;
    }

    public void setColEditavel(boolean[] colEditavel) {
        this.colEditavel = colEditavel;
    }
    
    
    public abstract void addRow(Object o);
    
    public abstract void removeRow(int linha);
    
    @Override
    public abstract void setValueAt(Object o, int linha, int coluna);
    
}


package Model.Table;

import Model.ArroladoPor;
import java.util.ArrayList;

/**
 *
 * @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:
                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);
        this.fireTableDataChanged();
    }

    @Override
    public void removeRow(int linha) {
        this.linhas.remove(linha);
        this.fireTableRowsDeleted(linha, linha);

    }

    @Override
    public void setValueAt(Object obj, int linha, int coluna) {
        ArroladoPor a = (ArroladoPor) linhas.get(linha);

        //verifica qual valor vai ser alterado
        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;
        }
        //avisa que os dados mudaram
        this.fireTableCellUpdated(linha, coluna);
    }
}


package Controller.Helper;

import Model.ArroladoPor;
import Dao.ArroladoPorDao;
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.event.ListSelectionListener;
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 getModeloArroladoPor() {
        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 getModeloInserir() {
        String descricao = view.getTxtDescricao().getText().toUpperCase().trim();
        objClasse = new ArroladoPor(descricao);
        return objClasse;
    }

    public void inserir() throws SQLException {
        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(getModeloInserir()) != true) {
                dao.salvar(getModeloInserir());//SALVA NO BANCO
                modeloTabela.addRow(objClasse);//INSERI OBJ NA TABELA
                modeloTabela.fireTableDataChanged();

                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 {
        if (view.getTabela().getSelectedRow() != -1) {
            if (dao.verificaAlterar(getModeloArroladoPor()) == true) {
                JOptionPane.showMessageDialog(null,
                        "Não foi possivel editar, registro já existente!",
                        "Verificação ao Editar", JOptionPane.ERROR_MESSAGE);
            } else {
                dao.alterar(getModeloArroladoPor()); //ATUALIZA NO BANCO
                helperForHall.fieldClean(view.getPnlPesquisarPor());
                //ATUALIZA A TABELA
                modeloTabela.setValueAt(getModeloArroladoPor(), view.getTabela().getSelectedRow(), 0);
                modeloTabela.setValueAt(getModeloArroladoPor(), 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(getModeloArroladoPor()) != true) {
                    //NÃO EXISTE EM OUTRA TABELA PODE EXCLUIR
                    dao.excluir(getModeloArroladoPor());
                    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 carregaTabela() 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(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {
                if (!e.getValueIsAdjusting()) {
                    selecionarLinha(view.getTabela());
                }
            }
        });

        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 setarEstadoComponentes(int estado) {
        switch (estado) {
            //inicializa o formulario
            //Ao clicar 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;
        }
    }

}

A questão é: cada ação que interfere na tabela, na exibição dos dados que estão contidos ali, deve ser processada e refletir na mesma, não tem jeito.
Ou seja, se você insere, altera, exclui algo ou aplica um ou mais filtros de pesquisa, isso deve se refletir no que a jtable apresenta.
Então, você deve inserir um método específico para cada ação no teu table model e, em cada um deles, invocar o método fireTableDataChanged() ou qualquer outro que possa re renderizar o que está ali.

Darlan_machado eu chamei o fireTableDataChanged() apos ter chamado o metodo salvar e atualizar mas não funcionou… o bd alterou e salvou normal mais a jtable não. … o maximo q consegui foi ex: linha contendo o texto teste ao alterar para teste1 ele alterou no bd mas na jtable ficou com as duas informação teste e teste1.

Só chamar o fireTableDataChanged não resolve.
Precisa atualizar os dados que estão no array, né?
Após mudar (excluir, alterar, incluir, etc) no array, aí sim, chame o método para atualizar a tabela como um todo.

Darlan, mas não é esssa função do setValueAt? Alterar o array!

Senão, qual melhor prática de criar esses metodos de manipulação do array?

setvalueAt vai funcionar parra atualizar os dados. Mas, quando você exclui, faz como?

Entendo, mas é do atualizar mesmo que estou dizendo, não estou conseguindo… eu fiz de forma errada? Pois não está atualizando!