Problemas no AbstractTableModel

2 respostas
F

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.
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();
    }
}
Tabela View
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);



    }

Cadastro View

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);

    }

2 Respostas

F

2 dias depois… bump

Nicolas_Fernandes

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!!

Criado 29 de julho de 2011
Ultima resposta 2 de ago. de 2011
Respostas 2
Participantes 2