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. */packageMinhaTable;importjava.util.ArrayList;importjava.util.List;importjavax.swing.table.AbstractTableModel;/** * * @author André */publicclassMinhaTableextendsAbstractTableModel{//constantes que vão representar as colunas//(só para facilitar o entendimento do código)privatefinalintCOL_CPF=0;privatefinalintCOL_DataHora=1;privatefinalintCOL_Parceiro=2;privatefinalintCOL_ID=3;//lista dos produtos que serão exibidosprivateList<Modelo>modelo;publicMinhaTable(){modelo=newArrayList();}publicMinhaTable(List<Modelo>modelo){this();this.modelo=modelo;}@OverridepublicintgetRowCount(){//cada produto na lista será uma linhareturnmodelo.size();}@OverridepublicintgetColumnCount(){//vamos exibir só Nome e Quantidade, então são 2 colunasreturn3;}@OverridepublicStringgetColumnName(intcolumn){//qual o nome da colunaif(column==COL_CPF){return"CPF";}elseif(column==COL_DataHora){return"Data Hora";}elseif(column==COL_Parceiro){return"Parceiro";}elseif(column==COL_ID){return"#ID";}return"";}publicObjectgetValueAt(introwIndex,intcolumnIndex){//pega o produto da linhaModelom=modelo.get(rowIndex);//verifica qual valor deve ser retornadoif(columnIndex==COL_CPF){returnm.getCpf();}elseif(columnIndex==COL_DataHora){returnm.getDataHora();}elseif(columnIndex==COL_ID){returnm.getId();}elseif(columnIndex==COL_Parceiro){returnm.getParceiro();}return"";}@OverridepublicvoidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex){//pega o produto da linhaModelom=modelo.get(rowIndex);if(columnIndex==COL_CPF){m.setCpf(Integer.parseInt(aValue.toString()));}elseif(columnIndex==COL_DataHora){m.setDataHora(aValue.toString());}elseif(columnIndex==COL_ID){m.setId(Integer.parseInt(aValue.toString()));}elseif(columnIndex==COL_Parceiro){m.setParceiro(aValue.toString());}//avisa que os dados mudaramfireTableDataChanged();}publicvoidinserir(Modelop){modelo.add(p);fireTableDataChanged();}publicvoidexcluir(intpos){modelo.remove(pos);fireTableDataChanged();}publicvoidexcluir(Modelop){modelo.remove(p);fireTableDataChanged();}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){//no nosso caso todas vão ser editáveis, entao retorna true pra todasreturnfalse;}}
packageMinhaTable;/** * * @author André */publicclassModelo{privateintcpf;privateStringparceiro;privateStringdataHora;privateintid;publicModelo(){}publicModelo(intcpf,Stringparceiro,StringdataHora,intid){this.cpf=cpf;this.parceiro=parceiro;this.dataHora=dataHora;this.id=id;}publicintgetCpf(){returncpf;}publicvoidsetCpf(intcpf){this.cpf=cpf;}publicStringgetParceiro(){returnparceiro;}publicvoidsetParceiro(Stringparceiro){this.parceiro=parceiro;}publicStringgetDataHora(){returndataHora;}publicvoidsetDataHora(StringdataHora){this.dataHora=dataHora;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}}
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 ?
ViniGodoy
Nada?
Dicas:
É uma péssima prática disparar fireTableDataChanged para tudo. Existem métodos fire mais específicos, use-os;
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.
ViniGodoy
Cria o JTable e chama o método setModel com o seu TableModel.
SirDominque
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)
ViniGodoy
Mas você passou a lista de modelo carregada do banco no construtor do seu TableModel?
SirDominque
Não. Eu queria ir dando set aos poucos, pra depois salvar em Excel.
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.
SirDominque
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.
Mesmo Erro :P
@OverridepublicvoidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex){//pega o produto da linhaModelom=modelo.get(rowIndex);if(columnIndex==COL_CPF){m.setCpf(Integer.parseInt(aValue.toString()));}elseif(columnIndex==COL_DataHora){m.setDataHora(aValue.toString());}elseif(columnIndex==COL_ID){m.setId(Integer.parseInt(aValue.toString()));}elseif(columnIndex==COL_Parceiro){m.setParceiro(aValue.toString());}//avisa que os dados mudaramfireTableDataChanged();}
Esse método esta dentro da classe MinhaTable
ViniGodoy
Poste o erro com o código que você usa o inserir.
SirDominque
Classe VIEW :
packageMinhaTable;/** * * @author André */publicclassTabelaextendsjavax.swing.JFrame{publicTabela(){initComponents();setNewTableModel();}@SuppressWarnings("unchecked")// <editor-fold defaultstate="collapsed" desc="Generated Code"> privatevoidinitComponents(){jScrollPane1=newjavax.swing.JScrollPane();jTable1=newjavax.swing.JTable();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);jTable1.setModel(newjavax.swing.table.DefaultTableModel(newObject[][]{{},{},{},{},{},{},{},{},{},{}},newString[]{}));jScrollPane1.setViewportView(jTable1);javax.swing.GroupLayoutlayout=newjavax.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> publicstaticvoidmain(Stringargs[]){try{for(javax.swing.UIManager.LookAndFeelInfoinfo:javax.swing.UIManager.getInstalledLookAndFeels()){if("Nimbus".equals(info.getName())){javax.swing.UIManager.setLookAndFeel(info.getClassName());break;}}}catch(ClassNotFoundExceptionex){java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);}catch(InstantiationExceptionex){java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);}catch(IllegalAccessExceptionex){java.util.logging.Logger.getLogger(Tabela.class.getName()).log(java.util.logging.Level.SEVERE,null,ex);}catch(javax.swing.UnsupportedLookAndFeelExceptionex){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(newRunnable(){publicvoidrun(){newTabela().setVisible(true);}});}// Variables declaration - do not modify privatejavax.swing.JScrollPanejScrollPane1;privatejavax.swing.JTablejTable1;// End of variables declaration publicvoidsetNewTableModel(){MinhaTablem=newMinhaTable();jTable1.setModel(m);jTable1.setShowGrid(true);m.setValueAt("Oi",0,1);}}
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…
SirDominque
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…
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.