Iniciante na java - Calculadora

10 respostas
slashjvc

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…

10 Respostas

JonathanSSantos

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?

slashjvc

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

renamed

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!

guisjlender

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)

ViniGodoy

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.

JonathanSSantos

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:

slashjvc

Tá aí o código...(só não liguem pq eu sou iniciante "Mesmo"...^

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

    }

}
guisjlender

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

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!

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!");
	}

Grande abraço... até mais!

Flw

GuiSjlender

slashjvc

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!!!

Criado 21 de dezembro de 2009
Ultima resposta 23 de dez. de 2009
Respostas 10
Participantes 5