Minha jTableModel - O que falta nela?

OK gente, estou na Quest de tentar descobrir como fazer minha TableModel sem o livro do Deitel ( que vou comprar nas férias/Dezembro )
O que falta para montar a tabela ?

Segue minhas classes :

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package MinhaTable;

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

/**
 *
 * @author André
 */
public class MinhaTable extends AbstractTableModel{
    
      //constantes que vão representar as colunas
    //(só para facilitar o entendimento do código)
    private final int COL_CPF = 0;
    private final int COL_DataHora = 1;
    private final int COL_Parceiro = 2;
    private final int COL_ID = 3;
 
    //lista dos produtos que serão exibidos
    private List<Modelo> modelo;
    
    public MinhaTable()
    {
        modelo = new ArrayList();
    }
    
    public MinhaTable(List<Modelo> modelo)
    {
        this();
        this.modelo = modelo;
    }
    
    @Override
     public int getRowCount() {
        //cada produto na lista será uma linha
        return modelo.size();
    }
    
    @Override
     public int getColumnCount() {
        //vamos exibir só Nome e Quantidade, então são 2 colunas
        return 3;
    }
    
    @Override
    public String getColumnName(int column) {
        //qual o nome da coluna
        if (column == COL_CPF) {
            return "CPF";
        } else if (column == COL_DataHora) {
            return "Data Hora";
        }else if (column == COL_Parceiro)
        {
            return "Parceiro";
        }else if (column == COL_ID)
        {
            return "#ID";
        }
        
        return "";
    }
    
    
    
public Object getValueAt(int rowIndex, int columnIndex) {
        //pega o produto da linha
        Modelo m = modelo.get(rowIndex);
 
        //verifica qual valor deve ser retornado
        if (columnIndex == COL_CPF) {
            return m.getCpf();
        } else if (columnIndex == COL_DataHora) {
            return m.getDataHora();
        } else if (columnIndex == COL_ID)
        {
            return m.getId();
        }else if (columnIndex == COL_Parceiro)
        {
            return m.getParceiro();
        }
        return "";
    }    
    
    
 @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        //pega o produto da linha
       Modelo m = modelo.get(rowIndex);
       
       if (columnIndex == COL_CPF) {
            m.setCpf(Integer.parseInt(aValue.toString()));
        } else if (columnIndex == COL_DataHora) {
           m.setDataHora(aValue.toString());
        } else if (columnIndex == COL_ID)
        {
          m.setId(Integer.parseInt(aValue.toString())); 
        }else if (columnIndex == COL_Parceiro)
        {
           m.setParceiro(aValue.toString());
        }
       
        //avisa que os dados mudaram
        fireTableDataChanged();
    }
 
 
   public void inserir(Modelo p) {
        modelo.add(p);
 
        fireTableDataChanged();
    }
 
    public void excluir(int pos) {
        modelo.remove(pos);
 
        fireTableDataChanged();
    }
 
    public void excluir(Modelo p) {
        modelo.remove(p);
 
        fireTableDataChanged();
    }


  @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas
        return false;
    }



    
    
}

package MinhaTable;

/**
 *
 * @author André
 */
public class Modelo{

    private int cpf;
    private String parceiro;
    private String dataHora;
    private int id;
    
    
    public Modelo()
    {
        
    }
    
    public Modelo(int cpf,String parceiro,String dataHora,int id)
    {
        this.cpf = cpf;
        this.parceiro = parceiro;
        this.dataHora = dataHora;
        this.id = id;
        
    }
    
    
    public int getCpf() {
        return cpf;
    }

    public void setCpf(int cpf) {
        this.cpf = cpf;
    }

    public String getParceiro() {
        return parceiro;
    }

    public void setParceiro(String parceiro) {
        this.parceiro = parceiro;
    }

    public String getDataHora() {
        return dataHora;
    }

    public void setDataHora(String dataHora) {
        this.dataHora = dataHora;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    
    
    
    
    
}

minha opinião:

troque os if/else por switch
como visto no método:

getColumnName

tem algo de estranho no teu comentário:

  @Override  
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas  
        return false;  
    }  

pq vc tem:

 this(); 

No teu segundo construtor?

O Método excluir Modelo pelo modelo eu faria excluir pelo ID …

…Também seria legal vc pensar em paginação :slight_smile:
mas nunca pensei sobre isso em desktop
mas é bom!

hehe

abraços

[quote=d34d_d3v1l]minha opinião:

troque os if/else por switch
como visto no método:

getColumnName

tem algo de estranho no teu comentário:

  @Override  
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        //no nosso caso todas vão ser editáveis, entao retorna true pra todas 

        return false;  
    }  

pq vc tem:

 this(); 

No teu segundo construtor?[/quote]

Não sei. Peguei de um site e fiz as alterações~; http://www.javasimples.com.br/swing-awt/death-to-defaulttablemodel-abstracttablemodel-rulez

Como que devo proceder agora pra colocar isso na minha View Do NetBeans ? Crio um Panel e jogo o jTable Dentro ? ou apenas dou set no Table ?

Nada?

Dicas:

  1. É uma péssima prática disparar fireTableDataChanged para tudo. Existem métodos fire mais específicos, use-os;
  2. Não é necessário dar fire no método setValueAt, a menos que você planeje chama-lo diretamente. Chamar o método diretamente é uma péssima prática.

Cria o JTable e chama o método setModel com o seu TableModel.

Valeu Viny, parece que funcionou.
Mas não aparece nenhuma linha na tabela.
E quando fiz setValueAt,
aconteceu isso aqui :

run: Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:604) at java.util.ArrayList.get(ArrayList.java:382) at MinhaTable.MinhaTable.setValueAt(MinhaTable.java:93) at MinhaTable.Tabela.setNewTableModel(Tabela.java:99) at MinhaTable.Tabela.<init>(Tabela.java:11) at MinhaTable.Tabela$1.run(Tabela.java:85) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:682) at java.awt.EventQueue$3.run(EventQueue.java:680) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:691) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139) at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Mas você passou a lista de modelo carregada do banco no construtor do seu TableModel?

Não. Eu queria ir dando set aos poucos, pra depois salvar em Excel.

Use o método inserir do seu TableModel, não o setValueAt.

Como já falei no outro post, o ideal é você nunca chamar o setValueAt ou o getValueAt diretamente. Deixe esses métodos para uso do JTable.

[quote=ViniGodoy]Use o método inserir do seu TableModel, não o setValueAt.

Como já falei no outro post, o ideal é você nunca chamar o setValueAt ou o getValueAt diretamente. Deixe esses métodos para uso do JTable.[/quote]

Mesmo Erro :stuck_out_tongue:

[code] @Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
//pega o produto da linha
Modelo m = modelo.get(rowIndex);

   if (columnIndex == COL_CPF) {
        m.setCpf(Integer.parseInt(aValue.toString()));
    } else if (columnIndex == COL_DataHora) {
       m.setDataHora(aValue.toString());
    } else if (columnIndex == COL_ID)
    {
      m.setId(Integer.parseInt(aValue.toString())); 
    }else if (columnIndex == COL_Parceiro)
    {
       m.setParceiro(aValue.toString());
    }
   
    //avisa que os dados mudaram
    fireTableDataChanged();
}[/code]

Esse método esta dentro da classe MinhaTable

Poste o erro com o código que você usa o inserir.

Classe VIEW :


package MinhaTable;

/**
 *
 * @author André
 */
public class Tabela extends javax.swing.JFrame {

    public Tabela() {
        initComponents();
        setNewTableModel();
    }

    @SuppressWarnings("unchecked")
    // &lt;editor-fold defaultstate="collapsed" desc="Generated Code"&gt;                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {},
                {},
                {},
                {},
                {},
                {},
                {},
                {},
                {},
                {}
            },
            new String [] {

            }
        ));
        jScrollPane1.setViewportView(jTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(82, 82, 82)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(125, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(29, 29, 29)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(42, Short.MAX_VALUE))
        );

        pack();
    }// &lt;/editor-fold&gt;                        

    public static void main(String args[]) {
        
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //&lt;/editor-fold&gt;

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Tabela().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    // End of variables declaration                   

    public void setNewTableModel() {

        MinhaTable m = new MinhaTable();
        jTable1.setModel(m);
        jTable1.setShowGrid(true);
        m.setValueAt("Oi",0,1);
        
    }

   
}

[quote]Exception in thread “AWT-EventQueue-0” java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at MinhaTable.MinhaTable.setValueAt(MinhaTable.java:93)
at MinhaTable.Tabela.setNewTableModel(Tabela.java:99)
at MinhaTable.Tabela.<init>(Tabela.java:11)
at MinhaTable.Tabela$1.run(Tabela.java:85)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
[/quote]

Cara, me diz aonde você está usando o método inserir neste teu código?
Já foi dito que não é uma boa prática o uso de setValueAt pois quem gerencia isso é a sua tabela, e não tem a necessidade de você querer chamá-lo diretamente, para isso, como também já foi falado, use o método inserir que você mesmo fez (ou copiou).

E o que aquele DefaultTableModel ta fazendo no initComponents? Com certeza o NetBeans fez isso por você, tire-o de lá…

Mais uma coisa, será que não da pra melhorar o teu main? Pense um pouco…

[quote=erico_kl]Cara, me diz aonde você está usando o método inserir neste teu código?
Já foi dito que não é uma boa prática o uso de setValueAt pois quem gerencia isso é a sua tabela, e não tem a necessidade de você querer chamá-lo diretamente, para isso, como também já foi falado, use o método inserir que você mesmo fez (ou copiou).

E o que aquele DefaultTableModel ta fazendo no initComponents? Com certeza o NetBeans fez isso por você, tire-o de lá…

Mais uma coisa, será que não da pra melhorar o teu main? Pense um pouco…[/quote]

Calma, estou aprendendo.
Vou tentar com o método inserir.

E esse projeto é apenas pra aprender a fazer essa jTable Model
O outro projeto esta bem melhor organizado.

Muito Obrigado, ja posto os resultados

OK, deu certo.

Só mais uma dúvida,

Essa mensagem aparece quando Compila :

Que tal fazer um método update?

OK, estou pesquisando sobre como fazer isso :smiley:

Valeu :smiley: