Problemas no AbstractTableModel

Ola Galera do GUJ !!! Sou novo no mundo Java e então novo forum.
Então… estou estudando o AbstractTableModel porque pelo que li, fazer a tabela com o default é uma furada, estou com umas duvidas e espero que vocês consigam me ajudar. Como estou usando swing vou explicar mais ou menos como está meu codigo, fiz um cadastro pequeno apenas de nome e telefone pra pega a estrutura, estou trabalhando com 4 classes “bean com JPA”, “Minha Tabela”, “Tabela View” que tem a chamada pra “Tela de Cadastro”.

1 - Quando faço um novo cadastro, os dados vão corretos pro banco, mas não é inserido na tabela. ai tiver que criar um botão a mais no “Tabela View” pra atualizar. (o botão está meio armengado) tentei até bota um metodo atualizar junto com o salvar e nada.
2 - Não estou conseguindo fazer multiplas exclusoes.
3- Se possivel queria uma dicas de como deixar o codigo mais limpo.

Minha Tabela.

[code]package View;

import Bean.Clientes;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class MinhaTableModel extends AbstractTableModel {

private List<Clientes> linhas;
private String[] colunas = new String[]{
    "Nome", "Telefone"};

public MinhaTableModel() {

    linhas = new ArrayList<Clientes>();
}

public MinhaTableModel(List<Clientes> lista) {
    linhas = new ArrayList<Clientes>(lista);
}

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

}

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

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

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 0:
            return String.class;
        case 1:
            return String.class;
        default:
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
    }
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

    Clientes p = linhas.get(rowIndex);

    switch (columnIndex) {
        case 0:
            return p.getNome();
        case 1:
            return p.getTelefone();

        default:
            throw new IndexOutOfBoundsException("columnIndex out of bounds");
    }
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    Clientes p = linhas.get(rowIndex);

    switch (columnIndex) {
        case 0:
            p.setNome(aValue.toString());
        case 1:
            p.setTelefone(aValue.toString());

            fireTableDataChanged();
    }
}

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

public Clientes getCliente(int indiceLinha) {
    return linhas.get(indiceLinha);
}

public void addCliente(Clientes cliente) {
    linhas.add(cliente);
    fireTableDataChanged();
}

public void removeCliente(int indiceLinha) {
    linhas.remove(indiceLinha);
    fireTableRowsDeleted(indiceLinha, indiceLinha);
}

public void addListaDeClientes(List<Clientes> clientes) {

    int tamanhoAntigo = getRowCount();
    linhas.addAll(clientes);
    fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
}       

public void removeCliente(Clientes cliente) {
    linhas.remove(cliente);

    fireTableDataChanged();
}

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

public void limpar(){
   	linhas.clear();
}

}[/code]

Tabela View

[code]package View;

import Bean.Clientes;
import java.util.List;
import javax.swing.JTable;

public class ClientesView extends javax.swing.JFrame {

private MinhaTableModel model;

public ClientesView() {
    initComponents();
    EntityManager.getTransaction().begin();
    addListaDeClientes(List);


}

public JTable getTbCliente() {
    if (tbClientes == null) {
        tbClientes = new JTable();
        tbClientes.setModel(new MinhaTableModel());
    }
    return tbClientes;
}

public MinhaTableModel getModel() {
    if (model == null) {
        model = (MinhaTableModel) getTbCliente().getModel();
    }
    return model;
}

public void addCliente(Clientes cliente) {
    getModel().addCliente(cliente);


}

public void removeCliente(int indiceLinha) {
    getModel().removeCliente(indiceLinha);
}

private void addListaDeClientes(List<Clientes> lista) {
    getModel().addListaDeClientes(lista);
}
        
// inserir novo cadastro
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    new CadastroView().setVisible(true);
}                                        
// exlcuir
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    List.clear();
    List = Query.getResultList();

    int[] selected = tbClientes.getSelectedRows();

    for (int i = 0; i < selected.length; i++) {

        Clientes m = List.get(selected[i]);
        EntityManager.remove(m);
        removeCliente(selected[i]);
    }

    EntityManager.getTransaction().commit();
    EntityManager.getTransaction().begin();



}                                        
public void atualizarTabela() {
    getModel().limpar();
    List.clear();
    List = Query.getResultList();
    addListaDeClientes(List);

}
// atualizar
private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    atualizarTabela();

}                                        


public static void main(String args[]) {

    new ClientesView().setVisible(true);



}[/code]

Cadastro View

[code]package View;

import Bean.Clientes;
import java.util.List;
import javax.swing.JTable;

public class ClientesView extends javax.swing.JFrame {

private MinhaTableModel model;

public ClientesView() {
    initComponents();
    EntityManager.getTransaction().begin();
    addListaDeClientes(List);


}

public JTable getTbCliente() {
    if (tbClientes == null) {
        tbClientes = new JTable();
        tbClientes.setModel(new MinhaTableModel());
    }
    return tbClientes;
}

public MinhaTableModel getModel() {
    if (model == null) {
        model = (MinhaTableModel) getTbCliente().getModel();
    }
    return model;
}

package View;

import Bean.Clientes;

public class CadastroView extends javax.swing.JFrame {

/** Creates new form CadastroView */
public CadastroView() {
    initComponents();
}


@SuppressWarnings("unchecked")

private Clientes cliente = new Clientes();
private ClientesView cv = new ClientesView();

private void setNovoCliente(Clientes cliente) {
    this.cliente = cliente;
}

public void novoCadastro() {
    Clientes cad = new Clientes();


    cad.setNome(tfNome.getText());
    cad.setTelefone(tfTelefone.getText());

    try {
        if (entityManager1.getTransaction().isActive()) {
            entityManager1.clear();
            entityManager1.persist(cad);
            entityManager1.getTransaction().commit();

        } else {
            entityManager1.getTransaction().begin();
            entityManager1.persist(cad);
            entityManager1.getTransaction().commit();

        }
        setNovoCliente(cad);

    } catch (Exception ex) {
        ex.printStackTrace();


    }
    tfNome.setText("");
    tfTelefone.setText("");

}

private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                         
    novoCadastro();
    cv.atualizarTabela();
}                                        

public static void main(String args[]) {

    new CadastroView().setVisible(true);

}[/code]

2 dias depois… bump

Fala, fantasminha!

Algumas mudanças que eu faria:

  1. No seu TableModel, você fez…

Eu mudaria os quatro métodos:

  • O addCliente, chame o fireTableRowsInserted para avisar que inseriu uma linha nova. Bom, é costume meu, por isso mudaria. rs
  • O addListaDeClientes, faria do mesmo modo, só que sempre pegando até o último registro da linha, e não até “tamanho - 1”.
  • Chame os eventos propícios para cada situação (RowsInserted para inserção, RowsDeleted para exclusão, etc.).
  • O limpar, avisar à tabela que você limpou os registros para ela limpar na tela.
  • Aliás, adicionaria um método para excluir o registro pela linha que foi selecionada na sua JTable.
public void addCliente(Clientes cliente) {

    linhas.add(cliente);
    fireTableRowsInserted(linhas.size(), linhas.size()); //<--- o último registro da sua coleção.
}

public void removeCliente(Clientes cliente) {

    int index = linhas.indexOf(cliente);
    if (index > 0) {
    
        linhas.remove(cliente);
        fireTableRowsDeleted(index, index); 
    }
}
public void removeCliente(int index) {

    if (index > 0) {
    
        linhas.remove(cliente);
        fireTableRowsDeleted(index, index); 
    }
}
public void addListaDeClientes(List<Clientes> clientes) {

    int tamanhoAntigo = linhas.size();
    linhas.addAll(clientes);
    fireTableRowsInserted(tamanhoAntigo, linhas.size()); //<--- do último registro da antiga lista até o último registro da nova lista.
}

public void limpar() {
    
    linhas.clear();
    fireTableDataChanged(); //<--- avisar à tabela que você limpou os registros.
}

Na sua View, você pode fazer um código do seguinte jeito:

Suponhamos que você selecionou vários registros na tabela, e tem um botão “Excluir” para limpá-las, certo?

buttonExcluir = new JButton("Excluir");
buttonExcluir.addActionListener( new ActionListener() {

    public void actionPerformed(ActionEvent event) {

        int[] linhasSelecionadas = minhaTabela.getSelectedRows();
        for (int linhaSelecionada : linhasSelecionadas) {
        
            meuTableModel.excluirRegistro(linhaSelecionada);
        }
 
        JOptionPane.showMessageDialog(null, "Voilà!");
    }
});

Lembrando que o excluirRegistro que coloquei ali é baseado no código de exclusão que coloquei logo acima!

Para fazer códigos mais limpos e reusáveis, faça uso de uma arquitetura. Para começar, entenda como funciona a arquitetura MVC e tente aplicá-la ao seu projeto.
Espero ter ajudado! Abraços!!