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

20 respostas
Salax

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)

20 Respostas

drsmachado

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

Salax

drsmachado obrigado por responder;

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

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.

Salax

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.

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?

Salax

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

=(

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.

Ataxexe

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.

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.

Salax
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.
Sinto por ter transparecido isso pra vc, aqui esta como fazer o campo moeda, foi necessário apenas usa
new Double
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())
                                                    }
                                        );
                            
                    }
                }

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

drsmachado
Salax:
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.
Sinto por ter transparecido isso pra vc, aqui esta como fazer o campo moeda, foi necessário apenas usa
new Double
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())
                                                    }
                                        );
                            
                    }
                }

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


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

Salax

Ataxexe:
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.

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.

Ataxexe obrigado pela dica, irei estudar.

Ataxexe

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.

Salax
drsmachado:
Salax:
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.
Sinto por ter transparecido isso pra vc, aqui esta como fazer o campo moeda, foi necessário apenas usa
new Double
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())
                                                    }
                                        );
                            
                    }
                }

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


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

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

Ataxexe

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

Salax

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

Agora entendi pq ficam me olhando na rua…HAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH

valeu Ataxexe

Salax

É um sistema pequeno, 03 tabelas e 04 telas.

Salax

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!

Ataxexe

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.

Salax

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)

Ataxexe

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)

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.

Salax

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)

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.

Obrigado pela dica, irei continuar estudando jtable e outros.

Criado 22 de agosto de 2013
Ultima resposta 23 de ago. de 2013
Respostas 20
Participantes 3