[RESOLVIDO]Treta no JTABLE me Ajuda ae....‏

Qdo inicia JFPrincipal, tem umas guias, na guia Inserir tem Controle de Materiais que qdo chamada lista numa jtable as construções(obras), cadastradas no bd. Após selecionar um dos cadastros e clicar em Atualizar Que chama o JIFInserir,

carrega as info de preenchimento deste JFrame que carregar os dados da tabela q contém as colunas: Materiais, Quantidade, Valor(double) e Total(double). Mas quando pego os Double’s do banco e tendo deixa-los com formato decimal e inserir nas respectivas colunas na Jtable ele da erro - Cannot format given Object as a Number - . Andei lendo sobre cellrender e celleditor e até adicionei as 02 classes mas tbm n consegui usa-las. Bom é isso.

Tentativas: Cheguei até a Trocar os campos pra String no get set mas não funcionou. atualmente são double.

Pode me dar uma aula de como fazer? Obrigado.

exemplo 1: DecimalFormat

DecimalFormat df = new DecimalFormat();    
df.applyPattern("R$ #,##0.00");   
DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();//JTable    
                            dtm.setNumRows(0);    
                            for(ProdutoObra paux : po.ListarPO()){    
                             //jtable Acabamento    
                                if(paux.getId_obra()== Integer.parseInt(jTxtCodigo.getText()) && paux.getCod_categoria()== 1){    
                                     String valor  =    df.format(paux.getValor());  //Passando pra String
                                    String total  =    df.format(paux.getTotal()); 

 
                                        dtm.addRow(new Object[]{paux.getCodigo(),    //adicionando bd as linhas
                                                                paux.getProduto(),    
                                                                paux.getQuantidade(),    
                                                                valor,    
                                                                total  
                                                                }    
                                                    );    
                                            
                                }    
                            }    

exemplo 2: NumberFormat

   
DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();//JTable    
                            dtm.setNumRows(0);    
                            for(ProdutoObra paux : po.ListarPO()){    
                             //jtable Acabamento    
                                if(paux.getId_obra()== Integer.parseInt(jTxtCodigo.getText()) && paux.getCod_categoria()== 1){    
                                   NumberFormat z = NumberFormat.getCurrencyInstance();

 
                                        dtm.addRow(new Object[]{paux.getCodigo(),    //adicionando bd as linhas
                                                                paux.getProduto(),    
                                                                paux.getQuantidade(),    
                                                                z.format(paux.getValor()),    
                                                                z.format(paux.getTotal())  
                                                                }    
                                                    );    
                                            
                                }    
                            }    

exemplo 3:

DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();//JTable    
                            dtm.setNumRows(0);    
                            for(ProdutoObra paux : po.ListarPO()){    
                             //jtable Acabamento    
                                if(paux.getId_obra()== Integer.parseInt(jTxtCodigo.getText()) && paux.getCod_categoria()== 1){    
                                
                                        dtm.addRow(new Object[]{paux.getCodigo(),    //adicionando bd as linhas
                                                                paux.getProduto(),    
                                                                paux.getQuantidade(),    
                                                                 NumberFormat.getCurrencyInstance().format(paux.getValor()),    
NumberFormat.getCurrencyInstance().format(paux.getTotal())  
                                                                }    
                                                    );    
                                            
                                }    
                            } 

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Cannot format given Object as a Number at java.text.DecimalFormat.format(DecimalFormat.java:505) at java.text.Format.format(Format.java:157) at javax.swing.plaf.synth.SynthTableUI$SynthTableCellRenderer.configureValue(SynthTableUI.java:803) at javax.swing.plaf.synth.SynthTableUI$SynthTableCellRenderer.getTableCellRendererComponent(SynthTableUI.java:790) at javax.swing.JTable.prepareRenderer(JTable.java:5731) at javax.swing.plaf.synth.SynthTableUI.paintCell(SynthTableUI.java:684) at javax.swing.plaf.synth.SynthTableUI.paintCells(SynthTableUI.java:581) at javax.swing.plaf.synth.SynthTableUI.paint(SynthTableUI.java:365) at javax.swing.plaf.synth.SynthTableUI.update(SynthTableUI.java:276) at javax.swing.JComponent.paintComponent(JComponent.java:778) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JViewport.paint(JViewport.java:731) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JLayeredPane.paint(JLayeredPane.java:585) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5228) at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1508) at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1439) at javax.swing.RepaintManager.paint(RepaintManager.java:1236) at javax.swing.JComponent.paint(JComponent.java:1040) at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:39) at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:78) at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:115) at java.awt.Container.paint(Container.java:1967) at java.awt.Window.paint(Window.java:3877) at javax.swing.RepaintManager$3.run(RepaintManager.java:807) at javax.swing.RepaintManager$3.run(RepaintManager.java:784) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706) at javax.swing.RepaintManager.access$1000(RepaintManager.java:62) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1647) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:694) at java.awt.EventQueue$3.run(EventQueue.java:692) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

Comece por criar teu próprio table model. Com o DefaultTableModel estará fadado a ter dores de cabeça.

drsmachado obrigado por responder;

Poderia me ajudar a usar outro método pois não consegui desenvolver.

Tem uma série de tópicos no guj falando de como implementar um TableModel próprio, estendendo-o de AbstractTableModel.
Não lembro nenhum no momento, mas se tu der uma pesquisada, logo encontra vários.

[quote=drsmachado]Tem uma série de tópicos no guj falando de como implementar um TableModel próprio, estendendo-o de AbstractTableModel.
Não lembro nenhum no momento, mas se tu der uma pesquisada, logo encontra vários.[/quote]

Sim, já encontrei vários mas quase sem soluções e o que preciso não encontro.

Alguém poderia me ajudar com esse código?

Tentei usar este mas sem sucesso: A dadosLinha não é reconhecido como variável já declara e tbm não sei como colocar essas info no JTable

String[] columnNames = {"Código", "Materiais",  "Quantidade",  "Valor",  "Total"};  
  
for(ProdutoObra paux : po.ListarPO()){ 
Object[][] dadosLinha = {  
        {paux.getCodigo(), paux.getProduto(),  paux.getQuantidade(),  paux.getValor(), paux.getTotal()}  
    };  
                                                                              //Aqui a dadosLinha não é reconhecido como variável já declara
DefaultTableModel modelo = new DefaultTableModel( dadosLinha , columnNames );       
JTable jTable1 = new JTable( modelo );  // linha e coluna     
  
jTable1.getColumnModel().getColumn(3).setCellEditor(new NumbCellEditor());     
jTable1.getColumnModel().getColumn(3).setCellRenderer(new NumbCellRender());     
jTable1.getColumnModel().getColumn(4).setCellEditor(new NumbCellEditor());     
jTable1.getColumnModel().getColumn(4).setCellRenderer(new NumbCellRender());   
jTable1.setBounds(0, 100, 60,  60, 60);  

Não sei mais o que tentar, quem poderá me ajudar?

=(

Eu disse para não usar DefaultTableModel, você leu isso?
Cara, se eu procurar e achar algum exemplo de implementação de um TableModel próprio que estenda de AbstractTableModel eu vou parar de te responder por que irei ver que você não quer ajuda, mas quer o código pronto.

[quote=drsmachado]Eu disse para não usar DefaultTableModel, você leu isso?
Cara, se eu procurar e achar algum exemplo de implementação de um TableModel próprio que estenda de AbstractTableModel eu vou parar de te responder por que irei ver que você não quer ajuda, mas quer o código pronto.[/quote]

Nem precisa procurar muito, o Marky tem um projeto com um ObjectTableModel bem legal:

http://code.google.com/p/towel/wiki/ObjectTableModel

Salax, dê uma olhada nesse TableModel porque ele irá te ajudar.

[quote=drsmachado]Eu disse para não usar DefaultTableModel, você leu isso?
Cara, se eu procurar e achar algum exemplo de implementação de um TableModel próprio que estenda de AbstractTableModel eu vou parar de te responder por que irei ver que você não quer ajuda, mas quer o código pronto.[/quote]

Sinto por ter transparecido isso pra vc, aqui esta como fazer o campo moeda, foi necessário apenas usa new Double

[code]DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();
dtm.setNumRows(0);
Produtos_ObrasADO po =new Produtos_ObrasADO();
//ObraADO aux = new ObraADO();
for(ProdutoObra paux : po.ListarPO()){
//jtable Acabamento

                if(paux.getId_obra()== cadastroObra.getCodigo() && paux.getCod_categoria()== 1){
                    dtm.addRow(new Object[]{paux.getCodigo(),
                                                paux.getProduto(),
                                                paux.getQuantidade(),
                                                new Double(paux.getValor()),
                                                new Double(paux.getTotal())
                                                }
                                    );
                        
                }
            }[/code]

porém vem com 3 casas decimais, estou tentando tratar, alguma dica de como posso fazer?

[quote=Salax][quote=drsmachado]Eu disse para não usar DefaultTableModel, você leu isso?
Cara, se eu procurar e achar algum exemplo de implementação de um TableModel próprio que estenda de AbstractTableModel eu vou parar de te responder por que irei ver que você não quer ajuda, mas quer o código pronto.[/quote]

Sinto por ter transparecido isso pra vc, aqui esta como fazer o campo moeda, foi necessário apenas usa new Double

[code]DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();
dtm.setNumRows(0);
Produtos_ObrasADO po =new Produtos_ObrasADO();
//ObraADO aux = new ObraADO();
for(ProdutoObra paux : po.ListarPO()){
//jtable Acabamento

                if(paux.getId_obra()== cadastroObra.getCodigo() && paux.getCod_categoria()== 1){
                    dtm.addRow(new Object[]{paux.getCodigo(),
                                                paux.getProduto(),
                                                paux.getQuantidade(),
                                                new Double(paux.getValor()),
                                                new Double(paux.getTotal())
                                                }
                                    );
                        
                }
            }[/code]

porém vem com 3 casas decimais, estou tentando tratar, alguma dica de como posso fazer?

[/quote]
Mais uma vez:[color=red]DEIXE DE USAR DEFAULTTABLEMODEL[/color]. Entendeu?

[quote=Ataxexe][quote=drsmachado]Eu disse para não usar DefaultTableModel, você leu isso?
Cara, se eu procurar e achar algum exemplo de implementação de um TableModel próprio que estenda de AbstractTableModel eu vou parar de te responder por que irei ver que você não quer ajuda, mas quer o código pronto.[/quote]

Nem precisa procurar muito, o Marky tem um projeto com um ObjectTableModel bem legal:

http://code.google.com/p/towel/wiki/ObjectTableModel

Salax, dê uma olhada nesse TableModel porque ele irá te ajudar.[/quote]

Ataxexe obrigado pela dica, irei estudar.

Salax, a única dica que cabe a você agora é não use DefaultTableModel. É uma péssima prática e muito propensa a erros e gambiarras, além de deixar seu código tremendamente horroroso.

Você chegou a ler sobre o ObjectTableModel? Parece que não! E isso nos leva a crer que você somente quer alguma coisa pronta e não seguir os conselhos que estamos dando.

[quote=drsmachado][quote=Salax][quote=drsmachado]Eu disse para não usar DefaultTableModel, você leu isso?
Cara, se eu procurar e achar algum exemplo de implementação de um TableModel próprio que estenda de AbstractTableModel eu vou parar de te responder por que irei ver que você não quer ajuda, mas quer o código pronto.[/quote]

Sinto por ter transparecido isso pra vc, aqui esta como fazer o campo moeda, foi necessário apenas usa new Double

[code]DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();
dtm.setNumRows(0);
Produtos_ObrasADO po =new Produtos_ObrasADO();
//ObraADO aux = new ObraADO();
for(ProdutoObra paux : po.ListarPO()){
//jtable Acabamento

                if(paux.getId_obra()== cadastroObra.getCodigo() && paux.getCod_categoria()== 1){
                    dtm.addRow(new Object[]{paux.getCodigo(),
                                                paux.getProduto(),
                                                paux.getQuantidade(),
                                                new Double(paux.getValor()),
                                                new Double(paux.getTotal())
                                                }
                                    );
                        
                }
            }[/code]

porém vem com 3 casas decimais, estou tentando tratar, alguma dica de como posso fazer?

[/quote]
Mais uma vez:[color=red]DEIXE DE USAR DEFAULTTABLEMODEL[/color]. Entendeu?[/quote]

tem um porque? É obsoleto, caiu em desuso ? Assim “[color=red]DEIXE DE USAR DEFAULTTABLEMODEL[/color]” é muito vago.

http://www.guj.com.br/java/149861-recuperar-id-de-jtable/2#813171

http://www.guj.com.br/java/149861-recuperar-id-de-jtable/2#813171[/quote]

Agora entendi pq ficam me olhando na rua…HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH

valeu Ataxexe

É um sistema pequeno, 03 tabelas e 04 telas.

Solução para converter coluna em Moeda,

Seguinte quando criara jTbale usando [color=red] DEFAULTTABLEMODEL[/color], as colunas moedas ao serem criadas devem ser [color=blue]string [/color]e não [color=darkblue]double [/color] ai vc aplica o DecimalFormat. e quando for addrow coloque [color=blue]new String [/color]

DecimalFormat df = new DecimalFormat();      
df.applyPattern("R$ #,##0.00");     
DefaultTableModel dtm =(DefaultTableModel) jTbAcabamento.getModel();//JTable      
                            dtm.setNumRows(0);      
                            for(ProdutoObra paux : po.ListarPO()){      
                             //jtable Acabamento      
                                if(paux.getId_obra()== Integer.parseInt(jTxtCodigo.getText()) && paux.getCod_categoria()== 1){      
                                     String valor  =    df.format(paux.getValor());  //Passando pra String  
                                    String total  =    df.format(paux.getTotal());   
  
  
                                        dtm.addRow(new Object[]{paux.getCodigo(),    //adicionando bd as linhas  
                                                                paux.getProduto(),      
                                                                paux.getQuantidade(),      
                                                                new String(valor),
                                                               new String(total)
}      
                                                    );      
                                              
                                }      
                            }      

[size=18]Funciona que é uma Beleza!!![/size]

drsmachado para minha aplicação o [color=red] DEFAULTTABLEMODEL[/color] serve muito bem, atende minha necessidade pois minha aplicação é simples.

Obrigado por responderem o topico…

Dou por encerrado valew!

Não é porque você tem algo simples na mão que vai fazer algo mal feito. E quando você precisar desenvolver melhor isso? Aí sim vai correr pra implementar um TableModel decente? Não seria melhor fazer isso enquanto tem uma situação mais simples enquanto é tempo.

Concordo no que diz, mas minha aplicação é pequena hoje e pensando a longo prazo ela é bem estruturada e organizada, então “hoje” não vejo como poderia me atrapalhar futuramente.

(y)

Concordo no que diz, mas minha aplicação é pequena hoje e pensando a longo prazo ela é bem estruturada e organizada, então “hoje” não vejo como poderia me atrapalhar futuramente.

(y)[/quote]

Se você nunca mais evoluir sua aplicação ela não vai te atrapalhar futuramente. E só de olhar esse código que você usou com o DefaultTableModel já é o bastante pra não considerar algo bem organizado e estruturado. Para você, que ainda não conhece muito de Swing e da importância de se definir os Models para os componentes, isso parece lindo, mas para quem tem uma certa experiêcia no assunto e quer te mostrar agora um meio de não se atrapalhar mais na frente, isso é terrível.

Compare o seu código com isto:

AnnotationResolver resolver = new AnnotationResolver(ProdutoObra .class); ObjectTableModel<Person> tableModel = new ObjectTableModel<Person>( resolver, "codigo,produto,quantidade,valor,total"); //Here we use the list to be the data of the table. tableModel.setData(po.ListarPO()); JTable table = new JTable(tableModel);

A parte de formatação você define na própria classe usando anotações. Isso é só um exemplo, mas se você não conseguir enxergar que isso é mais fácil de manter, eu só posso te dar os meus pêsames.