Soma de Valores - Dúvida básica do Java

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.