Estou desenvolvendo uma aplicação java para desktop em que gostaria de somar todos os valores de uma coluna do jtable e colocar em um TextField mas não estou conseguindo
Ao cadastrar um valor e multiplicar pela quantidade ele coloca o resultado certo na coluna sub-total, mas o txtResultado não mostra a soma dos valores que no caso era pra ser 132.0+24.0, ele substitui pelo o valor que digitei 24.0
publicDefaultTableModeladicionarProdutosOrcamento(){Visitasvisi=newVisitas();DefaultTableModelmodelo;String[]titulos={"Codigo","Nome do Cliente","Produto","Preço","Qtde","Cep","Bairro","Endereço","Estado","Uf","Data","Hora"};String[]registro=newString[12];modelo=newDefaultTableModel(null,titulos);intcodigo=Integer.parseInt(txtCodigo.getText());Stringnome=txtCliente.getText();Stringprodutos=jComboBox1.getSelectedItem().toString();doublepreço=Double.parseDouble(txtPreco.getText());intqtde=Integer.parseInt(txtQuantidade.getText());Stringcep=txtCep.getText();Stringbairro=txtBairro.getText();Stringrua=txtRua.getText();Stringestado=txtEstado.getText();Stringuf=txtUf.getText();Stringdata=lblData.getText();Stringhora=lblHora.getText();modelo=(DefaultTableModel)jTable2.getModel();doubleresultado=preço*qtde;modelo.addRow(newObject[]{codigo,nome,produtos,preço,qtde,cep,bairro,rua,uf,data,hora,estado,resultado});txtResultado.setText(String.valueOf(resultado));returnmodelo;}
Oi Felipe100!
Pelo que dá pra ver no teu código, essa função adiciona uma linha no TableModel, certo? E também seta o valor do TextField do resultado. Esta função não é chamada dentro de um laço ou algo do tipo? Pois parece que, na verdade, está definindo no TextField o valor do último registro!
F
Felipe100
ela é chamada toda vez que clico no botão
F
Felipe100
então como faço para adicionar os valores da coluna do sub-total e setar no txtResultado ?
E
elvex
É que repara bem: nesse método adicionarProdutosOrcamento tu está definindo o valor do txtResultado como o preço * qtde. Sendo que o preço e a qtde tu está pegando de outros dois TextFields. Sendo assim, o txtResultado sempre vai ter o valor dos textFields que foram lidos anteriormente, entende? Tu poderia ao invés de só setar o valor do txtResultado, pegar o valor que já tem nele e somar com esse cálculo que tu ta fazendo. Algo como:
entendi, então como faço para adicionar os valores da coluna do sub-total e setar no txtResultado ?
E
elvex
Outra dica: evita escrever variáveis como caracteres especiais, como o ç, por exemplo. Ao invés de nomear como preço, procure escrever preco, ok?!
F
Felipe100
sim cara entendi, mas como faço para adicionar os valores da coluna do sub-total e setar no txtResultado ?
E
elvex
Como eu disse, quando tu for setar o valor do textField, ao invés de só dar um setText(), pega o valor que já tá nele e soma com o cálculo que tu tá fazendo (preço * quantidade). Dá uma olhada no comentário que fiz antes, escrevi o código! x)
F
Felipe100
ele da um problema toda vez que eu adiciono na table ele multiplica a quantidade pelo ultimo registro adicionado,no caso da imagem o total era pra dar 80,0 , mas ele deu 40.0
publicDefaultTableModeladicionarProdutosOrcamento(){Visitasvisi=newVisitas();DefaultTableModelmodelo;String[]titulos={"Codigo","Nome do Cliente","Produto","Preço","Qtde","Cep","Bairro","Endereço","Estado","Uf","Data","Hora"};String[]registro=newString[12];modelo=newDefaultTableModel(null,titulos);intcodigo=Integer.parseInt(txtCodigo.getText());Stringnome=txtCliente.getText();Stringprodutos=jComboBox1.getSelectedItem().toString();doublepreço=Double.parseDouble(txtPreco.getText());intqtde=Integer.parseInt(txtQuantidade.getText());Stringcep=txtCep.getText();Stringbairro=txtBairro.getText();Stringrua=txtRua.getText();Stringestado=txtEstado.getText();Stringuf=txtUf.getText();Stringdata=lblData.getText();Stringhora=lblHora.getText();modelo=(DefaultTableModel)jTable2.getModel();doubleresultado=preço*qtde;modelo.addRow(newObject[]{codigo,nome,produtos,preço,qtde,cep,bairro,rua,uf,data,hora,estado,resultado});txtResultado.setText(String.valueOf(resultado));doubleresultadoAtual=Double.parseDouble(txtResultado.getText());resultadoAtual+=(preço*qtde);txtResultado.setText(String.valueOf(resultadoAtual));returnmodelo;}privatevoidjButton2ActionPerformed(java.awt.event.ActionEventevt){// TODO add your handling code here:adicionarProdutosOrcamento();}
E
elvex
Entendi. O que tu pode fazer então para garantir, é iterar sobe as linhas da tabela e ir somando o valor da coluna sub-total.
F
Felipe100
como posso interar sobe as linha e somar com o sub-total ?
Tu pode pegar o número de linhas através do método getRowCount e fazer um for para percorrer do início até esse valor. Dentro do for, tu pode utilizar o método getValueAt passando como argumento o número da linha (que é a variável de iteração do laço, como i, por exemplo) e passando o número da coluna do subtotal. Mas isso é só uma forma que pensei rapidamente aqui.
F
Felipe100
Fiz conforme você me falou mas ele pega o sub-total do ultimo cadastro da table e não soma toda a coluna
public DefaultTableModel adicionarProdutosOrcamento() {
Visitasvisi=newVisitas();DefaultTableModelmodelo;String[]titulos={"Codigo","Nome do Cliente","Produto","Preço","Qtde","Cep","Bairro","Endereço","Estado","Uf","Data","Hora"};String[]registro=newString[12];modelo=newDefaultTableModel(null,titulos);intcodigo=Integer.parseInt(txtCodigo.getText());Stringnome=txtCliente.getText();Stringprodutos=jComboBox1.getSelectedItem().toString();doublepreço=Double.parseDouble(txtPreco.getText());intqtde=Integer.parseInt(txtQuantidade.getText());Stringcep=txtCep.getText();Stringbairro=txtBairro.getText();Stringrua=txtRua.getText();Stringestado=txtEstado.getText();Stringuf=txtUf.getText();Stringdata=lblData.getText();Stringhora=lblHora.getText();modelo=(DefaultTableModel)jTable2.getModel();doubleresultado=preço*qtde;modelo.addRow(newObject[]{codigo,nome,produtos,preço,qtde,cep,bairro,rua,uf,data,hora,estado,resultado});for(inti=0;i<jTable2.getRowCount();i++){doubleresultado2=0;resultado2=resultado2+Double.parseDouble(jTable2.getValueAt(i,12).toString());txtResultado.setText(String.valueOf(resultado2));}returnmodelo;}privatevoidjButton2ActionPerformed(java.awt.event.ActionEventevt){// TODO add your handling code here:adicionarProdutosOrcamento();
}
E
Solucao aceita
elvex
Na verdade teu código tem alguns problemas. Tu está fazendo o cálculo e atribuindo o valor para o TextField dentro do laço. Então:
1- Declare a variável resultado2 = 0 fora do laço de repetição;
2- Atribua o valor do ao TextField fora do laço (tirar essa linha do laço: txtResultado.setText(String.valueOf(resultado2)); )