Eu sei que minha dúvida é bem básica, mas eu já tentei de tudo e não consegui fazer!
Espero que alguém me ajude aqui para que eu possa avançar em meus estudos.
Eu criei uma JFrame com 30 JLabels (identificador de 1 a 30) e 30 JTextField com nomes de variáveis em sequência txtC1 até txtC30. Fiz também uma JLabel para exibir o Subtotal enquanto se digita os valores nos JTextField.
Os problemas São:
- Não consigo somar com , (tipo R$10,20) e mostrar no label.
- Não consigo somar com alguma JTextField vazia.
- Não consigo fazer a soma sem um botão com ação de calcular, eu gostaria que ao preencher o valor
quando tirar o target do input ele já apresenta-se o Valor na JLabel de Subtotal.
Grato
Leo Martins
Isso ocorre por que você precisa converter para um tipo numérico que aceita valores decimais, neste caso, float (Float) ou double (Double) e eles fazem operações com o padrão americano (ou seja, substituindo a vírgula por ponto).
Logo, para fazer isso, precisa adaptar a este padrão. Nada que uma invocação ao método replace(char, char) da classe String não resolva.
Defina o valor das JTextField vazias como zero.
Pesquise sobre a interface FocusListener, ela possui um método que se encaixa no que você precisa
A parte lógica está clara p mim, oque eu estou com dificuldade é como fica o código em java.
No 1 eu tentei fazer assim mas, tem algo que está errado
float n1 = Integer.parseInt(txtC1.getText());
float n2 = Integer.parseInt(txtC2.getText());
float S = n1 + n2;
lblSub.setText(Integer.toString((int) S));
A parte do zero deu certo grato pela resposta.
O FocusListener
eu até entendi como ele funciona, mas não sei como dispor o código no JLabel
.
O problema pode estar aqui: um Integer nunca lê números com casas decimais. Talvez funcionasse se você utilizasse a classe adequada, no caso, java.lang.Float:
float n1 = Float.parseFloat(txtC1.getText());
Caso não funcione, tente fazer assim:
float n1 = Float.parseFloat(txtC1.getText(),replace(",", "."));
Lembrando que a melhor abordagem seria
String valorTf1 = txtC1.getText(); if("".equals(valorTf1)){ valorTf1 = "0"; } float n1 = Float.parseFloat(valorTf1,replace(",", ".");
Assim você tem certeza que terá um valor recebido, mesmo que zero.
Quanto a isso O FocusListener eu até entendi como ele funciona, mas não sei como dispor o código no JLabel.
, o FocusListener será adicionado ao JTextField. Você pode criar apenas uma classe que implemente o FocusListener, implemente o método onFocusLost e utilizar para todos. Claro que isso precisará de várias validações, mas, é um caminho.
Porque o formato que as linguagens que estamos utilizando são no formato Americano, onde o decimal é um ponto (.
), exemplo 10.20 etc. No caso da sua pergunta o formato do decimal é virgula, porque no Brasil é assim as configurações regionais. Para efetuar calculo existe algumas técnicas como replace
para substituir a virgula pelo ponto, exemplo:
import java.util.*;
import java.lang.*;
import java.io.*;
import java.text.DecimalFormat;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
//Exemplo 1
String valueStr0 = "10,20".replace(".","").replace(",",".");
float valuefloat0 = Float.parseFloat(valueStr0);
System.out.println(valuefloat0);
//Exemplo 2
String valueStr1 = "1.000,20".replace(".","").replace(",",".");
float valuefloat1 = Float.parseFloat(valueStr1);
System.out.println(valuefloat1);
}
}
Como valores vazios não podem ser convertidos, realmente não terá exito nessa soma, também existem estratégias para solucionar esse problema que são:
- Verificar se o
JTextField
é vazio e avisar o usuário que ele esqueceu de digitar um valor
- Adicionar um 0 automáticamente se o usuário deixou a caixa de texto vazia
Sempre antes de somar qualquer valor deve-se fazer uma pergunta para saber se os dados foram digitados.
Trabalhar com eventos é o que precisa, procure o evento de quando perder o focus
para que a conta seja feita automaticamente.