2017-08-10 1 views
1

J'ai créé une petite "calculatrice" en utilisant une interface graphique. Mais quand j'utilise mon bouton d'entrée, il imprime toujours le produit des deux nombres indépendamment de l'opérateur que j'appuie.Pourquoi mon bouton n'effectue-t-il pas l'action appropriée?

class Calculator extends JFrame implements ActionListener{ 
    JTextfield firstN, secondN; 
    JButton addButton, subButton, divButton, mulButton, enter; 
    JLabel result; 

    Calculator(){ 
     // here I initialized all the components and added buttons/ActionListeners 
    } 

    public void actionPerformed(ActionEvent e) { 
     int first = Integer.parseInt(firstN.getText()); 
     int second = Integer.parseInt(secondN.getText()); 
     int value = 0; 

     if(e.getSource() == addButton){ 
      value = first + second; 
     }else if(e.getSource() == subButton){ 
      value = first - second; 
     }else if(e.getSource() == divButton){ 
      value = first/second; 
     }else{ 
      value = first*second; 
     } 

     if(e.getSource() == enter) 
     result.setText(value + ""); 
     } 

Sans le bouton d'entrée, la calculatrice fonctionne correctement. J'ai essayé une boucle de do-while mais cela s'est avéré être un infini.

Je suppose que j'ai quelque chose de mal avec les instructions if/else mais l'une des 4 premières instructions est toujours exécutée, donc la dernière devrait aussi travailler pour autant que je suis concerné ...

Répondre

1

La variable value ne doit pas être déclarée dans la méthode actionPerformed. De cette façon, il est réinitialisé à chaque fois que vous cliquez sur un bouton. Le bouton Entrée le réinitialise également. Vous avez le produit du numéro deux parce que c'est la branche par défaut de la première instruction if. Il devrait y avoir une seule instruction if, et la valeur doit être un champ de niveau de classe au lieu de la variable locale:

class Calculator extends JFrame implements ActionListener{ 
    JTextfield firstN, secondN; 
    JButton addButton, subButton, divButton, mulButton, enter; 
    JLabel result; 
    int value; 
    Calculator(){ 
     // here I initialized all the components and added buttons/ActionListeners 
    } 

    public void actionPerformed(ActionEvent e) { 
     int first = Integer.parseInt(firstN.getText()); 
     int second = Integer.parseInt(secondN.getText()); 


     if(e.getSource() == addButton){ 
      value = first + second; 
     }else if(e.getSource() == subButton){ 
      value = first - second; 
     }else if(e.getSource() == divButton){ 
      value = first/second; 
     }else if (e.getSource() == mulButton){ 
      value = first*second; 
     }else if(e.getSource() == enter) 
     result.setText(value + ""); 
     } 
    } 
+0

a parfaitement fonctionné! rapidement offtopic: pourquoi "value" est-il réinitialisé à chaque fois qu'un bouton est cliqué? pourquoi la variable devrait-elle être un champ de niveau classe? –

+0

@ marie.ellaZ Cela arrive parce que la méthode 'actionPerformed()' s'exécute du début à la fin à chaque fois que vous cliquez sur un bouton. Donc, s'il contient la ligne 'int value = 0;' chaque clic le mettra à zéro. Si vous souhaitez conserver la valeur entre les clics, vous devez la stocker quelque part en dehors de cette méthode, et un champ de niveau classe est une solution évidente pour cela. –

0

C'est parce que votre clause else sera appelée quand (e.getSource() == entrer) parce que les instructions if et else if seront fausses. Vous pouvez le rendre plus comme ceci:

 if(e.getSource() == addButton){ 
      value = first + second; 
     }else if(e.getSource() == subButton){ 
      value = first - second; 
     }else if(e.getSource() == divButton){ 
      value = first/second; 
     }else if(e.getSource() == mulButton){ 
      value = first*second; 
     }else if(e.getSource() == enter) 
     result.setText(value + ""); 
     } 
+0

avec cette solution l'Entrée activera le résultat à zéro –

+0

Je suis d'accord avec cela, je ne suis pas vraiment inquiète de la façon dont il met en œuvre son calcul de valeur comme la question impliquait que le produit était toujours calculé lorsque l'entrée était pressée. – LanfeaR

0

Depuis le dernier bloc d'autre {valeur = * première seconde; } n'a pas une condition if, il sera exécuté non seulement quand e.getSource == mulButton mais aussi quand e.getSource == entrez.

Une solution pourrait être de remplacer la dernière déclaration d'autre avec ce code:

} else if(e.getSource == mulButton) { 
    value = first*second; 
}