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 
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 ?
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 
[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")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
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();
}// </editor-fold>
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);
}
//</editor-fold>
/* 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 
Valeu 