Iniciante na java - Calculadora

Olá pessoal…

Sou iniciante na linguagem e java, e estou construindo uma calculadora, minha dúvida é a seguinte:
Quando digito um valor e escolho um operador qualquer, ele apaga o JTextField para que eu digite o segundo valor(Até aí tudo bem…)

O problema é que se eu clico em outro operador, por exemplo “+”, ao invés dele fazer o calculo do 1ºoperador digitado, ele faz do segundo!!!..

e isso ocorre com todos…

por favor, alguem que poder, da um toque aí!!!.. :slight_smile:

Valeu galera…

Nao entendi mto bem o que ocorre!

Quando tu faz a soma por exemplo do primeiro pelo segundo… acontece o que?

Onde ocorre o erro?

Então JonathanSSantos…

é o seguinte…

Exemplo: 2 + 2…

se eu clicar em “-” depois do 2 valor digitado…ao invés de somar…ele subtrai…¬¬’

é isso que acontece…independente do operador

vc tera que colocar uma condição dentro dos botoes dos 4 operadores…

se os 2 numeros foram digitados e ele apertou um botao que representa um dos 4 operadores, ele deve fazer a conta e depois colocar o operador…

se não, deve so colocar o operador!

Olá tche…

Tu tem q cuidar como está empregando a sua lógica…

por exemplo… a calculadora que vc está fazendo funciona igual calculadora do windows correto? Vc escolhe uma operação… coloca o segundo numero e quando clicar em outra operação ele deve efetuar aquela operação antes correto?!

Isso, aparentemente é simples, mas não é simples não… existe um nivel concideravel de lógica!

Acho q para isso funcionar vc terá que salvar os numeros e a operação em variáveis… então toda vez que vc for clicar em uma operação vc só terá que verificar se a variável “operacao” existe valores, ou seja, há uma operação pendente! Ai vc executa essa operação antes, o valor irá salvar na primeira variável “numero1”, a variável “operacao” recebe a nova operação e o “numero2” será limpo esperando um novo valor…

Algo assim… qualquer coisa posso postar um pequeno exemplo… mas da uma analizada que vai sair! O aprendizado será bem maior se chegar ao resultado com seus esforços!

Até mais
Flw

GuiSjlender 8)

Não tem nada a ver com o seu problema, mas para evitar passar por isso, já leia o tópico:
Como acionar os botões de uma calculadora através do teclado

9 entre 10 pessoas que fazem uma calculadora esbarram nesse quesito.

O seu problema esta na sua logica de programacao!
Verifique como voce esta tratando essa informacao que e’ gerada na iteracao com o usuario da calculadora!!

Qualquer coisa poste seu codigo para que possamos ajudar na sua logica para voce entender como deve funcionar…
Para postar seu codigo coloque entre as tags :smiley: :smiley: :smiley:

Tá aí o código…(só não liguem pq eu sou iniciante “Mesmo”…^

[code]public class LayOut extends JFrame { //Trabalhando Conceito de Herança, onde extraimos os métodos de JFrame

private Calculos a, b, op;
public Operador operador;
//double val1, val2;
JTextField Num;

public LayOut() { //Construtor da classe LayOut

    //Dimensionando e centralizando o frame

    super("Calculadora do Renatão");

    Dimension tamTela = Toolkit.getDefaultToolkit().getScreenSize();

    setLocation((int) (tamTela.width / 2.6), (int) (tamTela.height / 3));

    this.setMinimumSize(new Dimension(300, 200));

    this.setPreferredSize(new Dimension(300, 200));

    //Criando caixa de Texto, painéis, botões e Separando por linhas

    Num = new JTextField("");

    Num.setFont(new Font("Dialog", Font.PLAIN, 24));

    JPanel Calculadora = new JPanel();

    JPanel Texto = new JPanel();

    JPanel Funcao = new JPanel();

    BorderLayout calc = new BorderLayout();

    GridBagConstraints c = new GridBagConstraints();

    getContentPane().setLayout(calc);

    Num.requestFocus();

    final JButton botaoSoma = new JButton("+");

    final JButton botaoSub = new JButton("-");

    final JButton botaoDiv = new JButton(":");

    final JButton botaoMult = new JButton("x");

    final JButton botaoIgual = new JButton("=");

    final JButton botaoLimpar = new JButton("Limpar");

    final JButton botaoSair = new JButton("Sair");

    Calculadora.add(botaoSoma);

    Calculadora.add(botaoSub);

    Calculadora.add(botaoDiv);

    Calculadora.add(botaoMult);

    Calculadora.add(botaoIgual);

    Texto.add(Num);

    Funcao.add(botaoLimpar);

    Funcao.add(botaoSair);

    getContentPane().add(Num, BorderLayout.NORTH);

    getContentPane().add(Calculadora, BorderLayout.CENTER);

    getContentPane().add(Funcao, BorderLayout.SOUTH);

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final Calculos calcu = new Calculos();

    //inicio de construção das funções: SOMA, SUBTRACAO, MULTIPLICACAO e DIVISAO
    
    ActionListener soma = new ActionListener() { // Criando um novo ActionListener

        public void actionPerformed(ActionEvent Soma) {

            if (calcu.val1 == null) {
                
                try { //Tentado fazer as validações de numerais, caso não ocorrer...
                    calcu.val1 = Double.parseDouble(Num.getText()); //converte valor digitado para Double

                    calcu.operador = new Operador(Operador.SOMA); //Atribui operador a função

                    Num.setText("");//Esvaziando campo para digitação do próximo número

                    Num.requestFocus();//Recuperando o foco da propriedade JTextField
                
                } catch (NumberFormatException ex) {//...Cairá em uma condição de limpeza do JTextField

                    JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                    Num.setText("");

                    calcu.operador = new Operador(Operador.INDEFINIDO);

                }

            } else {

                try {

                    calcu.val2 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador(Operador.SOMA);

                    Num.setText((calcu.val1 + calcu.val2) + "");

                    calcu.val1 = (calcu.val1 + calcu.val2);

                    calcu.val2 = null;

                    calcu.operador = new Operador(Operador.INDEFINIDO);

                    Num.requestFocus();

                } catch(NumberFormatException ex) {

                    JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                    Num.setText("");

                    calcu.operador = new Operador(Operador.INDEFINIDO);

                }
            }
           
        }
    };

    ActionListener sub = new ActionListener(){

        public void actionPerformed(ActionEvent subtracao)
        {
            if(calcu.val1 == null){

                try{

                    calcu.val1 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador(Operador.SUBTRACAO);

                    Num.setText("");

                    Num.requestFocus();


                }catch(NumberFormatException ex) {

                    JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                    Num.setText("");

                    calcu.operador = new Operador(Operador.INDEFINIDO);

                }

            }
            else{

                try{

                    calcu.val2 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador(Operador.SUBTRACAO);

                    Num.setText((calcu.val1 - calcu.val2) + "");

                    calcu.val1 = (calcu.val1 - calcu.val2);

                    calcu.val2 = null;

                    calcu.operador = new Operador (Operador.INDEFINIDO);

                    Num.requestFocus();


                } catch (NumberFormatException ex){

                    JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                    Num.setText("");

                    calcu.operador = new Operador(Operador.INDEFINIDO);

               }
            }
         }

};

ActionListener mult = new ActionListener(){

    public void actionPerformed(ActionEvent Multiplicacao){

        if(calcu.val1 == null) {

            try {
                    calcu.val1 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador(Operador.MULTIPLICACAO);

                    Num.setText("");

                    Num.requestFocus();

            } catch (NumberFormatException ex) {

                JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                Num.setText("");

                calcu.operador = new Operador (Operador.INDEFINIDO);

            }
        }
        else {
                try {
                    calcu.val2 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador (Operador.MULTIPLICACAO);

                    Num.setText((calcu.val1 * calcu.val2)+ "");

                    calcu.val1 = (calcu.val1 * calcu.val2);

                    calcu.val2 = null;

                    calcu.operador = new Operador (Operador.INDEFINIDO);

                    Num.requestFocus();

                } catch (NumberFormatException ex) {

                    JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                    Num.setText("");

                    calcu.operador = new Operador (Operador.INDEFINIDO);
                }
            }
         }

    };

    ActionListener div = new ActionListener(){

        public void actionPerformed(ActionEvent Divisao){

            if(calcu.val1 == null) {

                try {
                    calcu.val1 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador(Operador.DIVISAO);

                    Num.setText("");

                    Num.requestFocus();


                } catch (NumberFormatException ex) {

                    JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                    Num.setText("");

                    calcu.operador = new Operador (Operador.INDEFINIDO);

                }

            }
            else {

                try {
                    calcu.val2 = Double.parseDouble(Num.getText());

                    calcu.operador = new Operador (Operador.DIVISAO);

                    Num.setText((calcu.val1 / calcu.val2) + "");

                    calcu.val1 = (calcu.val1 / calcu.val2);

                    calcu.val2 = null;

                    calcu.operador = new Operador (Operador.INDEFINIDO);

                    Num.requestFocus();

                } catch (NumberFormatException ex) {

                    Num.setText("");

                    calcu.operador = new Operador (Operador.INDEFINIDO);
                }
            }
        }

    };

    ActionListener igual = new ActionListener(){

        public void actionPerformed(ActionEvent igual){

            if(calcu.operador.getOperador() == Operador.SOMA) {
               
                 calcu.val2 = Double.parseDouble(Num.getText());

                 Num.setText((calcu.val1 + calcu.val2) + "");

                 calcu.resultado = (calcu.val1 + calcu.val2);

            }
            else if(calcu.operador.getOperador() == Operador.SUBTRACAO) {

                 calcu.val2 = Double.parseDouble(Num.getText());

                 Num.setText((calcu.val1 - calcu.val2) + "");

                 calcu.resultado = (calcu.val1 - calcu.val2);
                 }
                 else if(calcu.operador.getOperador() == Operador.MULTIPLICACAO) {

                     calcu.val2 = Double.parseDouble(Num.getText());

                     Num.setText((calcu.val1 * calcu.val2) + "");

                     calcu.resultado = (calcu.val1 * calcu.val2);
                     }
                     else if(calcu.operador.getOperador() == Operador.DIVISAO) {

                         calcu.val2 = Double.parseDouble(Num.getText());

                         Num.setText((calcu.val1 / calcu.val2) + "");

                         calcu.resultado = (calcu.val1 / calcu.val2);
                         }
                         else {

                         JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);

                         }

        }
    };

    ActionListener limpar = new ActionListener(){

        public void actionPerformed(ActionEvent Limpar){

            calcu.operador = new Operador(Operador.INDEFINIDO);

            Num.setText("");

            Num.requestFocus();

        }

    };

    ActionListener sair = new ActionListener(){

        public void actionPerformed(ActionEvent Sair){

           dispose();

        }

    };

    //Adicionando os Eventos Criados aos respectivos botões

    botaoSoma.addActionListener(soma);

    botaoSub.addActionListener(sub);

    botaoMult.addActionListener(mult);

    botaoDiv.addActionListener(div);

    botaoIgual.addActionListener(igual);

    botaoLimpar.addActionListener(limpar);

    botaoSair.addActionListener(sair);

    setVisible(true);

    pack();
}

public static void main(String args[]) {
    
    LayOut layout = new LayOut();

}

}[/code]

Daew kra…

Bah… o val1 e val2 são double???

Vc está fazendo um if verificando se o val1 é igual a null… mas double nunk aceita null… o default dele é 0(zero)… vc tem q mudar para Double com “D” maiusculo… acho q dai pode ser isso!

Como o val1 nunk será null ele passa direto para a o else…

veja se é isso!

outra dica… vc pode melhorar esse seu código usando os conseitos de Programação Orientada a Objetos… separa uma função só para carregar as variáveis e outra função para executar as operações e dentro dessa função vc só verifica qual operação foi clicada… diminui o seu código para 1x4… blz?!

Boa sorte ai! =)

Flw

GuiSjlender

Dê uma olhada nesse exemplo… use isso como base e dente encaixar no seu código… irá diminuir mt seu código e otimiza-lo!

[code]private Double num1 = null;
private Double num2 = null;
private String operador = “”;

public void carregaValores(String valor){
	if(num1 == null)
		num1 = Double.parseDouble(valor);
	else
		num2 = Double.parseDouble(valor);
}

public void operacao(String operador){
	if(!this.operador.equals(""))
		calcular();
	this.operador = operador;
}

public void calcular(){
	if(num1 != null && num2 != null){
		if(operador.equals("+")){
			num1 = num1+num2;
			num2 = null;
		}else if(operador.equals("-")){
			 num1 = num1-num2;
			 num2 = null;
		}else if(operador.equals("*")){
			 num1 = num1*num2;
			 num2 = null;
		}else if(operador.equals("/")){
			 num1 = num1/num2;
			 num2 = null;
		}else if(operador.equals(""))
			 JOptionPane.showMessageDialog(null, "Informar a operação a ser informada!");
	} else
		JOptionPane.showMessageDialog(null, "Informar os dois valores para o calculo!");
}[/code]

Grande abraço… até mais!

Flw

GuiSjlender

Valeu!!!..

Então guisjlender…justamente eu estou estudando o conceito de orientação orientada a objetos, o qual estava “tentando” aplicar esse conceito^…

por exemplo…os valores val1 e val2 eu declarei como você falou mesmo…como Double em uma outra classe, aí usando o conceito de herança eu extrai os

valores de val1 e val2…mas tá aí…valeu pelas dicas cara!!!..

Até mais!!!