Puts, fiz alguma coisa que fez a minha JTable sumir (não aparece quando executo o programa) e não tô coseguindo achar o erro. Alguém sabe o que é?
Código:
publicclassTelaDadosProdutoextendsjavax.swing.JInternalFrame{MeuModelomodelo;ProdutoprodutO;publicTelaDadosProduto()throwsClasseDeExcecao{initComponents();JPanelpProd=newJPanel(newBorderLayout());JTabletabelaProduto=inicializaTabela();pProd.add(newJScrollPane(tabelaProduto),BorderLayout.CENTER);setContentPane(pProd);pack();}privateJTableinicializaTabela(){JTabletabelaProduto=newJTable(modelo);returntabelaProduto;}publicvoidsetPosicao(){Dimensiond=this.getDesktopPane().getSize();this.setLocation(15+(d.width-this.getSize().width)/5,15+(d.height-this.getSize().height)/5);}publicvoidshowMensagem(Stringmensagem,booleanisErro){if(isErro){JOptionPane.showMessageDialog(null,mensagem,"Mensagem de erro",JOptionPane.ERROR_MESSAGE);}else{JOptionPane.showMessageDialog(null,mensagem,"Mensagem de sucesso",JOptionPane.INFORMATION_MESSAGE);}}}
Modelo da tabela
publicclassMeuModeloextendsAbstractTableModel{privateArrayListlista=newArrayList();privateString[]colunas={"Nome","Quantidade","Unidade de venda","ValorCompra","ValorVenda","Data da compra"};publicMeuModelo(Listlista1){lista.addAll(lista1);}publicMeuModelo(){}publicProdutogetProdutoAt(introw){return(Produto)lista.get(row);}publicProdutoremoveProdutoAt(introw){return(Produto)lista.remove(row);}publicvoidaddProduto(Produtow){lista.add(w);fireTableDataChanged();}publicvoidaddProdutoList(Listl){lista.addAll(l);fireTableDataChanged();}publicintgetRowCount(){returnlista.size();}@OverridepublicStringgetColumnName(inti){returncolunas[i];}publicintgetColumnCount(){returncolunas.length;}publicObjectgetValueAt(intlinha,intcoluna){Produtoproduto=(Produto)lista.get(linha);switch(coluna){case0:returnproduto.getNome();case1:returnnewBigDecimal(String.valueOf(produto.getQuantidade()));case2:returnproduto.getUnidadeVenda();case3:returnnewBigDecimal(String.valueOf(produto.getValorVenda()));case4:returnnewBigDecimal(String.valueOf(produto.getValorCompra()));case5:returnnewDate(String.valueOf(produto.getDataCompra()));default:returnnull;}}@OverridepublicbooleanisCellEditable(intlinha,intcoluna){switch(coluna){case0://nomereturntrue;case1://quantidadereturntrue;case2://unidade de vendareturntrue;case3://valor unitárioreturntrue;case4://valor totalreturntrue;case5://data da comprareturntrue;default:returnfalse;}}@OverridepublicClassgetColumnClass(intcoluna){switch(coluna){case0://NomereturnString.class;case1://QuantidadereturnBigDecimal.class;case2://unidade de vendareturnString.class;case3://valor unitárioreturnBigDecimal.class;case4://valor totalreturnBigDecimal.class;case5://data da comprareturnDate.class;default:returnnull;}}@OverridepublicvoidsetValueAt(Objectvalor,intlinha,intcoluna){Produtoproduto=(Produto)lista.get(linha);switch(coluna){case0://Nometry{produto.setNome(valor.toString());}catch(ClasseDeExcecaoex){Logger.getLogger(MeuModelo.class.getName()).log(Level.SEVERE,null,ex);}break;case1://quantidadeBigDecimalquantidade=newBigDecimal(valor.toString());produto.setQuantidade(quantidade);break;case2://unidade de vendatry{produto.setUnidadeVenda(valor.toString());}catch(ClasseDeExcecaoex){Logger.getLogger(MeuModelo.class.getName()).log(Level.SEVERE,null,ex);}break;case3://valor unitárioBigDecimalvalorUnit=newBigDecimal(valor.toString());produto.setValorVenda(valorUnit);break;case4://valor totalBigDecimalvalortotal=newBigDecimal(valor.toString());produto.setValorCompra(valortotal);break;case5://valor unitárioDatedata=newDate(valor.toString());try{produto.setDataCompra(data);}catch(ClasseDeExcecaoex){Logger.getLogger(MeuModelo.class.getName()).log(Level.SEVERE,null,ex);}break;}}}
Tenta colocar um tabela.updateUI(); dpois de criar a tabela.
Ou modelo.fireTableDataChanged();
D
david.jv
claudneto:
Tenta colocar um tabela.updateUI(); dpois de criar a tabela.
Ou modelo.fireTableDataChanged();
claudneto, usando tabela.updateUI(); não deu nada. usando o modelo.fireTableDatChanged(); deu esse erro: Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
claudneto
Vc instanciou um objeto MeuModelo?
MeuModelo model = new MeuModelo();
tabela.setModel(modelo);
model.fireTableDatChanged();
D
david.jv
claudneto:
Vc instanciou um objeto MeuModelo?
MeuModelo model = new MeuModelo();
tabela.setModel(modelo);
model.fireTableDatChanged();
huuuu cara valeu… deu certim. Só mais uma coisinha, como faço para a tabela aparecer com, por exemplo, 10 linhas (em branco) sem eu precisar clicar em nada para adicionar.
D
david.jv
alguém ai sabe como fazer para aparecer N quantidades de linhas na tabela na hora que eu executar o programa? Tentei mais da esse erro: java.lang.Object cannot be cast to sistemaproduto.modelo.dominio.Produto
ViniGodoy
Você não deve chamar updateUI() em componente nenhum do Swing, em hipótese nenhuma. Se está fazendo isso, seu código está errado.
D
david.jv
eu usei o modelo abaixo:
MeuModelo model = new MeuModelo();
tabela.setModel(modelo);
model.fireTableDatChanged();
ViniGodoy
Tente definir seu modelo já no método inicializaTabela. Algumas informações sobre o tamanho da tabela dependem da existência de um modelo.
Além disso, sua JTable nem sequer aparece no seu form, ou ela aparece, mas vazia?
Finalmente, não é necessário chamar o fireTableDataChanged depois do setModel. Como o modelo inteiro está mudando na JTable, ela atualizará seus dados automaticamente. O fireTableDataChanged só deve ser disparado se alteramos o conteúdo de um modelo já associado ao JTable.
Finalmente, seria bom usar os generics ali no seu model para evitar aquele monte de casts. Ao invés de um ArrayList(), crie um ArrayList().
D
david.jv
ViniGodoy, a tabela aparece vazia, sem nenhuma linha em branco, só que eu queria que aparecesse por padrão 10 linhas.
D
david.jv
ViniGodoy, alterando para o modo que você falou, ficaria assim correto?
packagesistemaproduto.interfacegrafica;publicclassTelaDadosProdutoextendsjavax.swing.JInternalFrame{ProdutoprodutO;JTabletabelaProduto=newJTable();JButtonbCadastrar=newJButton();publicTelaDadosProduto()throwsClasseDeExcecao{JPanelpProd=newJPanel(newBorderLayout());tabelaProduto=inicializaTabela();pProd.add(newJScrollPane(tabelaProduto),BorderLayout.CENTER);setContentPane(pProd);pack();}privateJTableinicializaTabela(){classMeuModeloextendsAbstractTableModel{privateArrayListlista=newArrayList();privateString[]colunas={"Nome","Quant","Unid venda","Valor de Compra","Valor de Venda","Data da compra"};publicMeuModelo(ListlistA){lista.addAll(listA);}publicMeuModelo(){}publicvoidinsereLinha(){}publicProdutogetProdutoAt(introw){return(Produto)lista.get(row);}publicProdutoremoveProdutoAt(introw){return(Produto)lista.remove(row);}publicvoidaddProduto(Produtoprod){lista.add(prod);fireTableDataChanged();}publicvoidaddProdutoList(ListlistA){lista.addAll(listA);fireTableDataChanged();}publicintgetRowCount(){returnlista.size();}@OverridepublicStringgetColumnName(inti){returncolunas[i];}publicintgetColumnCount(){returncolunas.length;}publicObjectgetValueAt(intlinha,intcoluna){Produtoproduto=(Produto)lista.get(linha);switch(coluna){case0:returnproduto.getNome();case1:returnnewBigDecimal(String.valueOf(produto.getQuantidade()));case2:returnproduto.getUnidadeVenda();case3:returnnewBigDecimal(String.valueOf(produto.getValorVenda()));case4:returnnewBigDecimal(String.valueOf(produto.getValorCompra()));case5:returnnewDate(String.valueOf(produto.getDataCompra()));default:returnnull;}}@OverridepublicbooleanisCellEditable(intlinha,intcoluna){switch(coluna){case0://nomereturntrue;case1://quantidadereturntrue;case2://unidade de vendareturntrue;case3://valor unitárioreturntrue;case4://valor totalreturntrue;case5://data da comprareturntrue;default:returnfalse;}}@OverridepublicClassgetColumnClass(intcoluna){switch(coluna){case0://NomereturnString.class;case1://QuantidadereturnBigDecimal.class;case2://unidade de vendareturnString.class;case3://valor unitárioreturnBigDecimal.class;case4://valor totalreturnBigDecimal.class;case5://data da comprareturnDate.class;default:returnnull;}}@OverridepublicvoidsetValueAt(Objectvalor,intlinha,intcoluna){Produtoproduto=(Produto)lista.get(linha);switch(coluna){case0://Nometry{produto.setNome(valor.toString());}catch(ClasseDeExcecaoex){Logger.getLogger(MeuModelo.class.getName()).log(Level.SEVERE,null,ex);}break;case1://quantidadeBigDecimalquantidade=newBigDecimal(valor.toString());produto.setQuantidade(quantidade);break;case2://unidade de vendatry{produto.setUnidadeVenda(valor.toString());}catch(ClasseDeExcecaoex){Logger.getLogger(MeuModelo.class.getName()).log(Level.SEVERE,null,ex);}break;case3://valor unitárioBigDecimalvalorUnit=newBigDecimal(valor.toString());produto.setValorVenda(valorUnit);break;case4://valor totalBigDecimalvalortotal=newBigDecimal(valor.toString());produto.setValorCompra(valortotal);break;case5://valor unitárioDatedata=newDate(valor.toString());try{produto.setDataCompra(data);}catch(ClasseDeExcecaoex){Logger.getLogger(MeuModelo.class.getName()).log(Level.SEVERE,null,ex);}break;}}}MeuModelomodelo=newMeuModelo();JTabletabelaProdut=newJTable(modelo);returntabelaProdut;}publicMeuModeloTabgetModelo(){return(MeuModeloTab)tabelaProduto.getModel();}publicvoidsetPosicao(){Dimensiond=this.getDesktopPane().getSize();this.setLocation(115+(d.width-this.getSize().width)/5,115+(d.height-this.getSize().height)/5);}publicvoidshowMensagem(Stringmensagem,booleanisErro){if(isErro){JOptionPane.showMessageDialog(null,mensagem,"Mensagem de erro",JOptionPane.ERROR_MESSAGE);}else{JOptionPane.showMessageDialog(null,mensagem,"Mensagem de sucesso",JOptionPane.INFORMATION_MESSAGE);}}}
ViniGodoy
Opa, mas aí o problema é outro. Vc quer que apareça 10 linhas? Mas o que teria nessas linhas, se a tabela não tiver conteúdo?
Pq se vc quiser 10 linhas em branco, seu model teria que retornar essas linhas em branco.
D
david.jv
Sim ViniGodoy, é para ele retornar as 10 linhas em branco, só que num to conseguindo fazer ele retornar elas em branco pq na minha classe de Produto ele verifica se os campos são nulos ou não, daí ele me retorna um erro. E se eu retirar essa verificação de campo, a pessoa vai conseguir cadastrar alguns valores null.
D
david.jv
Aff… mesmo alterando o código e tirando as validações da erro. Fica dando NullPointException
D
david.jv
pô num consegui descobrir porque está dando NullPointException.
segue o código alterado, segundo os conselhos do ViniGodoy:
publicclassModeloTabelaextendsAbstractTableModel{privatestaticfinalintcol_nome=0;privatestaticfinalintcol_quantidade=1;privatestaticfinalintcol_unidadeVenda=2;privatestaticfinalintcol_valorCompra=3;privatestaticfinalintcol_valorVenda=4;privatestaticfinalintcol_dataCompra=5;//Produto produto = new Produto();privateList<Produto>valores;//Contrutor que recebe a lista de produtos;publicModeloTabela(List<Produto>valores){this.valores=newArrayList<Produto>(valores);// aqui dá o erro. Só que não descobri o porque do erro}publicintgetRowCount(){returnvalores.size();}publicintgetColumnCount(){return10;}@OverridepublicStringgetColumnName(intcoluna){if(coluna==col_nome){return"Nome";}if(coluna==col_quantidade){return"Qtd";}if(coluna==col_unidadeVenda){return"UnidVenda";}if(coluna==col_valorCompra){return"ValorCompra";}if(coluna==col_valorVenda){return"ValorVenda";}if(coluna==col_dataCompra){return"DatadaCompra";}return"";}publicObjectgetValueAt(intlinha,intcoluna){Produtoproduto=(Produto)valores.get(linha);switch(coluna){case0:returnproduto.getNome();case1:returnnewBigDecimal(String.valueOf(produto.getQuantidade()));case2:returnproduto.getUnidadeVenda();case3:returnnewBigDecimal(String.valueOf(produto.getValorVenda()));case4:returnnewBigDecimal(String.valueOf(produto.getValorCompra()));case5:returnnewDate(String.valueOf(produto.getDataCompra()));default:returnnull;}}@OverridepublicbooleanisCellEditable(intlinha,intcoluna){returntrue;}@OverridepublicClass<?>getColumnClass(intcolunaIndex){switch(colunaIndex){case0://NomereturnString.class;case1://QuantidadereturnBigDecimal.class;case2://unidade de vendareturnString.class;case3://valor unitárioreturnBigDecimal.class;case4://valor totalreturnBigDecimal.class;case5://data da comprareturnDate.class;default:returnnull;}}@OverridepublicvoidsetValueAt(Objectvalor,intlinha,intcoluna){Produtoproduto=(Produto)valores.get(linha);switch(coluna){case0://Nometry{//Nomeproduto.setNome(valor.toString());}catch(ClasseDeExcecaoex){Logger.getLogger(ModeloTabela.class.getName()).log(Level.SEVERE,null,ex);}break;case1://quantidadeBigDecimalquantidade=newBigDecimal(valor.toString());produto.setQuantidade(quantidade);break;case2://unidade de vendatry{produto.setUnidadeVenda(valor.toString());}catch(ClasseDeExcecaoex){Logger.getLogger(ModeloTabela.class.getName()).log(Level.SEVERE,null,ex);}break;case3://valor unitárioBigDecimalvalorUnit=newBigDecimal(valor.toString());produto.setValorVenda(valorUnit);break;case4://valor totalBigDecimalvalortotal=newBigDecimal(valor.toString());produto.setValorCompra(valortotal);break;case5://valor unitárioDatedata=newDate(valor.toString());try{produto.setDataCompra(data);}catch(ClasseDeExcecaoex){Logger.getLogger(ModeloTabela.class.getName()).log(Level.SEVERE,null,ex);}break;}}}
//Contrutor que recebe a lista de produtos;publicModeloTabela(List<Produto>valores){this.valores=newArrayList<Produto>(valores);// aqui dá o erro}
ViniGodoy
Estranho. E que linha chama essa função?
D
david.jv
esse é o construtor da minha classe
D
david.jv
só para tentar ajudar, quando eu debugo ele dá erro na linha que eu informei e mostra a seguinte mensagem onde você vê os valores das variáveis: “Informação de variável não disponível, código-fonte compilado sem a opção -g”, e na saída mostra java.lang.NullPoniterException.
Nâo sei se ajuda, mas quando debugo e da o erro ele também pula para a classe EventDispachThread
ViniGodoy
E daí? Cadê a linha onde o construtor é chamado?
Provavelmente vc está passando null no parâmetro da lista. Percorra o stacktrace vendo quem chama quem, pois o parâmetro de entrada “valores” está nulo.