[Resolvido]Somar valores

15 respostas Resolvido
java-seprogramaçãojava
F

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

public DefaultTableModel adicionarProdutosOrcamento() {

    Visitas visi = new Visitas();

    DefaultTableModel modelo;

    String[] titulos = {"Codigo", "Nome do Cliente", "Produto", "Preço", "Qtde", "Cep", "Bairro", "Endereço", "Estado", "Uf", "Data", "Hora"};

    String[] registro = new String[12];

    modelo = new DefaultTableModel(null, titulos);

 
    int codigo = Integer.parseInt(txtCodigo.getText());
    String nome = txtCliente.getText();
    String produtos = jComboBox1.getSelectedItem().toString();
    double preço = Double.parseDouble(txtPreco.getText());
    int qtde = Integer.parseInt(txtQuantidade.getText());
    String cep = txtCep.getText();
    String bairro = txtBairro.getText();
    String rua = txtRua.getText();
    String estado = txtEstado.getText();
    String uf = txtUf.getText();
    String data = lblData.getText();
    String hora = lblHora.getText();

    modelo = (DefaultTableModel) jTable2.getModel();

    double resultado = preço * qtde;

    modelo.addRow(new Object[]{codigo, nome, produtos, preço, qtde, cep, bairro, rua, uf, data, hora, estado, resultado});

    txtResultado.setText(String.valueOf(resultado));

   
    return modelo;
}

15 Respostas

E

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

ela é chamada toda vez que clico no botão

F

então como faço para adicionar os valores da coluna do sub-total e setar no txtResultado ?

E

É 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:

double resultadoAtual = Double.parseDouble(txtResultado.getText());

resultadoAtual += (preço * qtde);

txtResultado.setText(resultadoAtual);
F

entendi, então como faço para adicionar os valores da coluna do sub-total e setar no txtResultado ?

E

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

sim cara entendi, mas como faço para adicionar os valores da coluna do sub-total e setar no txtResultado ?

E

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

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

public DefaultTableModel adicionarProdutosOrcamento() {

    Visitas visi = new Visitas();

    DefaultTableModel modelo;

    String[] titulos = {"Codigo", "Nome do Cliente", "Produto", "Preço", "Qtde", "Cep", "Bairro", "Endereço", "Estado", "Uf", "Data", "Hora"};

    String[] registro = new String[12];

    modelo = new DefaultTableModel(null, titulos);


    int codigo = Integer.parseInt(txtCodigo.getText());
    String nome = txtCliente.getText();
    String produtos = jComboBox1.getSelectedItem().toString();
    double preço = Double.parseDouble(txtPreco.getText());
    int qtde = Integer.parseInt(txtQuantidade.getText());
    String cep = txtCep.getText();
    String bairro = txtBairro.getText();
    String rua = txtRua.getText();
    String estado = txtEstado.getText();
    String uf = txtUf.getText();
    String data = lblData.getText();
    String hora = lblHora.getText();

    modelo = (DefaultTableModel) jTable2.getModel();

    double resultado = preço * qtde;

    modelo.addRow(new Object[]{codigo, nome, produtos, preço, qtde, cep, bairro, rua, uf, data, hora, estado, resultado});

    txtResultado.setText(String.valueOf(resultado));
    
    
    double resultadoAtual = Double.parseDouble(txtResultado.getText());
   resultadoAtual += (preço * qtde);
    txtResultado.setText(String.valueOf(resultadoAtual));

  
    return modelo;
}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
    adicionarProdutosOrcamento();
}
E

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

como posso interar sobe as linha e somar com o sub-total ?

E

Dá uma olhada no javadoc da interface TableModel: https://docs.oracle.com/javase/7/docs/api/javax/swing/table/TableModel.html

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

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() {

Visitas visi = new Visitas();

DefaultTableModel modelo;

String[] titulos = {"Codigo", "Nome do Cliente", "Produto", "Preço", "Qtde", "Cep", "Bairro", "Endereço", "Estado", "Uf", "Data", "Hora"};

String[] registro = new String[12];

modelo = new DefaultTableModel(null, titulos);


int codigo = Integer.parseInt(txtCodigo.getText());
String nome = txtCliente.getText();
String produtos = jComboBox1.getSelectedItem().toString();
double preço = Double.parseDouble(txtPreco.getText());
int qtde = Integer.parseInt(txtQuantidade.getText());
String cep = txtCep.getText();
String bairro = txtBairro.getText();
String rua = txtRua.getText();
String estado = txtEstado.getText();
String uf = txtUf.getText();
String data = lblData.getText();
String hora = lblHora.getText();

modelo = (DefaultTableModel) jTable2.getModel();

double resultado = preço * qtde;

modelo.addRow(new Object[]{codigo, nome, produtos, preço, qtde, cep, bairro, rua, uf, data, hora, estado, resultado});


for (int i = 0; i < jTable2.getRowCount(); i++) {
          double resultado2=0;
    resultado2=resultado2+Double.parseDouble(jTable2.getValueAt(i, 12).toString());

      txtResultado.setText(String.valueOf(resultado2));

    }




return modelo;
 }

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// TODO add your handling code here:
adicionarProdutosOrcamento();

}

E
Solucao aceita

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)); )

F

era isso mesmo obrigado

Criado 29 de dezembro de 2017
Ultima resposta 31 de dez. de 2017
Respostas 15
Participantes 2