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!!!..
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!
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
slashjvc
Tá aí o código...(só não liguem pq eu sou iniciante "Mesmo"...^
publicclassLayOutextendsJFrame{//Trabalhando Conceito de Herança, onde extraimos os métodos de JFrameprivateCalculosa,b,op;publicOperadoroperador;//double val1, val2;JTextFieldNum;publicLayOut(){//Construtor da classe LayOut//Dimensionando e centralizando o framesuper("Calculadora do Renatão");DimensiontamTela=Toolkit.getDefaultToolkit().getScreenSize();setLocation((int)(tamTela.width/2.6),(int)(tamTela.height/3));this.setMinimumSize(newDimension(300,200));this.setPreferredSize(newDimension(300,200));//Criando caixa de Texto, painéis, botões e Separando por linhasNum=newJTextField("");Num.setFont(newFont("Dialog",Font.PLAIN,24));JPanelCalculadora=newJPanel();JPanelTexto=newJPanel();JPanelFuncao=newJPanel();BorderLayoutcalc=newBorderLayout();GridBagConstraintsc=newGridBagConstraints();getContentPane().setLayout(calc);Num.requestFocus();finalJButtonbotaoSoma=newJButton("+");finalJButtonbotaoSub=newJButton("-");finalJButtonbotaoDiv=newJButton(":");finalJButtonbotaoMult=newJButton("x");finalJButtonbotaoIgual=newJButton("=");finalJButtonbotaoLimpar=newJButton("Limpar");finalJButtonbotaoSair=newJButton("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);finalCalculoscalcu=newCalculos();//inicio de construção das funções: SOMA, SUBTRACAO, MULTIPLICACAO e DIVISAOActionListenersoma=newActionListener(){// Criando um novo ActionListenerpublicvoidactionPerformed(ActionEventSoma){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 Doublecalcu.operador=newOperador(Operador.SOMA);//Atribui operador a funçãoNum.setText("");//Esvaziando campo para digitação do próximo númeroNum.requestFocus();//Recuperando o foco da propriedade JTextField}catch(NumberFormatExceptionex){//...Cairá em uma condição de limpeza do JTextFieldJOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}else{try{calcu.val2=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.SOMA);Num.setText((calcu.val1+calcu.val2)+"");calcu.val1=(calcu.val1+calcu.val2);calcu.val2=null;calcu.operador=newOperador(Operador.INDEFINIDO);Num.requestFocus();}catch(NumberFormatExceptionex){JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}}};ActionListenersub=newActionListener(){publicvoidactionPerformed(ActionEventsubtracao){if(calcu.val1==null){try{calcu.val1=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.SUBTRACAO);Num.setText("");Num.requestFocus();}catch(NumberFormatExceptionex){JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}else{try{calcu.val2=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.SUBTRACAO);Num.setText((calcu.val1-calcu.val2)+"");calcu.val1=(calcu.val1-calcu.val2);calcu.val2=null;calcu.operador=newOperador(Operador.INDEFINIDO);Num.requestFocus();}catch(NumberFormatExceptionex){JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}}};ActionListenermult=newActionListener(){publicvoidactionPerformed(ActionEventMultiplicacao){if(calcu.val1==null){try{calcu.val1=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.MULTIPLICACAO);Num.setText("");Num.requestFocus();}catch(NumberFormatExceptionex){JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}else{try{calcu.val2=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.MULTIPLICACAO);Num.setText((calcu.val1*calcu.val2)+"");calcu.val1=(calcu.val1*calcu.val2);calcu.val2=null;calcu.operador=newOperador(Operador.INDEFINIDO);Num.requestFocus();}catch(NumberFormatExceptionex){JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}}};ActionListenerdiv=newActionListener(){publicvoidactionPerformed(ActionEventDivisao){if(calcu.val1==null){try{calcu.val1=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.DIVISAO);Num.setText("");Num.requestFocus();}catch(NumberFormatExceptionex){JOptionPane.showMessageDialog(null,"Não é número","Erro de validação",JOptionPane.ERROR_MESSAGE);Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}else{try{calcu.val2=Double.parseDouble(Num.getText());calcu.operador=newOperador(Operador.DIVISAO);Num.setText((calcu.val1/calcu.val2)+"");calcu.val1=(calcu.val1/calcu.val2);calcu.val2=null;calcu.operador=newOperador(Operador.INDEFINIDO);Num.requestFocus();}catch(NumberFormatExceptionex){Num.setText("");calcu.operador=newOperador(Operador.INDEFINIDO);}}}};ActionListenerigual=newActionListener(){publicvoidactionPerformed(ActionEventigual){if(calcu.operador.getOperador()==Operador.SOMA){calcu.val2=Double.parseDouble(Num.getText());Num.setText((calcu.val1+calcu.val2)+"");calcu.resultado=(calcu.val1+calcu.val2);}elseif(calcu.operador.getOperador()==Operador.SUBTRACAO){calcu.val2=Double.parseDouble(Num.getText());Num.setText((calcu.val1-calcu.val2)+"");calcu.resultado=(calcu.val1-calcu.val2);}elseif(calcu.operador.getOperador()==Operador.MULTIPLICACAO){calcu.val2=Double.parseDouble(Num.getText());Num.setText((calcu.val1*calcu.val2)+"");calcu.resultado=(calcu.val1*calcu.val2);}elseif(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);}}};ActionListenerlimpar=newActionListener(){publicvoidactionPerformed(ActionEventLimpar){calcu.operador=newOperador(Operador.INDEFINIDO);Num.setText("");Num.requestFocus();}};ActionListenersair=newActionListener(){publicvoidactionPerformed(ActionEventSair){dispose();}};//Adicionando os Eventos Criados aos respectivos botõesbotaoSoma.addActionListener(soma);botaoSub.addActionListener(sub);botaoMult.addActionListener(mult);botaoDiv.addActionListener(div);botaoIgual.addActionListener(igual);botaoLimpar.addActionListener(limpar);botaoSair.addActionListener(sair);setVisible(true);pack();}publicstaticvoidmain(Stringargs[]){LayOutlayout=newLayOut();}}
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!
privateDoublenum1=null;privateDoublenum2=null;privateStringoperador="";publicvoidcarregaValores(Stringvalor){if(num1==null)num1=Double.parseDouble(valor);elsenum2=Double.parseDouble(valor);}publicvoidoperacao(Stringoperador){if(!this.operador.equals(""))calcular();this.operador=operador;}publicvoidcalcular(){if(num1!=null&&num2!=null){if(operador.equals("+")){num1=num1+num2;num2=null;}elseif(operador.equals("-")){num1=num1-num2;num2=null;}elseif(operador.equals("*")){num1=num1*num2;num2=null;}elseif(operador.equals("/")){num1=num1/num2;num2=null;}elseif(operador.equals(""))JOptionPane.showMessageDialog(null,"Informar a operação a ser informada!");}elseJOptionPane.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!!!..