1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676
|
package package_calculatrice;
//Un LayoutManager est une interface(ensemble de méthodes)
//Cette interface est implémentée par toutes les classes dont le rôle est de régir la disposition spatiale de toutes les instances des classes filles de la classe Container( qui dit classe fille
//dit aussi petite-fille etc...):
//La classe Jcomponent est une classe fille de la classe Container- voir page2-6 du document Toolkit Graphique AWT/Swing -ENST -E.Lecolinet
//une classe qui implémente l'interface LayoutManager peut donc régir la disposition spatiale d'une instance de la classe Jcomponent et peut donc aussi régir la disposition spatiale de toutes les instances
//des sous-classes de Jcomponent
//Il existe plusieurs classes implémentant cette interface :La classe BorderLayout en est une
//Une instance de la classe BorderLayout régit la disposition spatiale d'un Jcomponent( ou d'une instance de ses sous classes)
//avec une disposition de type points cardinaux: voir page 2-43 du document Toolkit Graphique AWT/Swing -ENST -E.Lecolinet
import java.awt.BorderLayout;
//java.awt.Color est un package ou paquetage(ensemble de classes).
//Dans les classes Color et Font du paquetage java.awt.*, se trouvent les constantes, attributs et méthodes permettant d'utiliser diverses ressources gérées par le système :
//couleurs et polices de caractères .
import java.awt.Color;
//la classe Dimension du package awt permet de dimensionner un composant graphique d'après la largeur et la hauteur précisée en paramètres du constructeur de cette classe( voir API java,
//les constructeurs de classe Dimension
import java.awt.Dimension;
//voir définition donnée plus haut à propos dela classe Color
import java.awt.Font;
import java.awt.*;
//Si un evènement de type click sur un bouton ,se produit, une instance de la classe ActionEvent est créée.C'est donc un exemplaire d'une sous -classe de la classe Event, qui est un evènement.
//Le mot Action signifie qu'il s'agit d'un évènement lié à un bouton ou à un champ de texte( voir p2-20 du document Toolkit Graphique AWT/Swing -ENST -E.Lecolinet )
//Si un évènement de type click sur une souris se produit, une instance de la classe MouseEvent est créée, qui représente un évènement lié à la souris
//Si un evènement de type appui sur une touche , se produit, une instance de la classe Keyevent est créée, qui représente un evènement lié à une touche de clavier
//=>En fonction du type d'évènement qui se produit( click sur souris, appui sur un touche de clavier etc...), une instance d'un évènement d'un type différent sera créée
//Dans notre cas, nous allons gérer les evènements de type click sur un bouton
//C'est donc, à chaque click sur un bouton, une instance de la classe ActionEvent, qui sera créée
//Nous avons donc besoin d'importer cette classe
import java.awt.event.ActionEvent;
//A chaque click sur un bouton, nous avons besoin qu'un certain code soit executé
//Ce code est celui que l'on placera dans l'unique méthode de l'interface ActionListener,la méthode ActionPerformed
import java.awt.event.ActionListener;
//import javax.swing.BorderFactory;
//import de la classe JButton du package swing, pour créer des composants de type JButton
import javax.swing.JButton;
//import de la classe JFrame du package swing, pour créer des composants de type JFrame
import javax.swing.JFrame;
//import de la classe JLabel du package swing, pour créer des composants de type JLabel
import javax.swing.JLabel;
//import de la classe JPanel du package swing, pour créer des composants de type JPabel
import javax.swing.JPanel;
public class Calculatrice extends JFrame {
// déclaration de la variable privée tab_string de type tableau de String, destinée à contenir les différents chiffres et opérateurs
//apparaissant sur le clavier de la calculatrice
private String[] tab_string = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", "=", "C", "+", "-", "*", "/"};
//déclaration de la variable privée tab_button de type tableau de JButton, destinée à contenir autant de boutons( de composants de type JButton) qu'il y a de chiffres et d'opérateurs
// sur le clavier de la calculatrice
private JButton[] tab_button ;
// déclaration de la variable privée container, de type JPanel.
//Ce panneau est destiné à recevoir les 3 panneaux suivants( un panneau =une instance de la classe JPanel) :
//-panEcran qui contient le label qui affiche les chiffres saisis et les resultats d'opérations
//-panChiffre qui contient les chiffres du clavier de la calculatrice
//-panOperateur qui contient les opérateurs servant aux différentes opérations
private JPanel container;
//déclaration dela variable privée ecran , de type JLabel( c'est un label), qui fait apparaître les chiffres saisis par l'utilisateur ainsi que les résultats d'opérations
//( un label est une instance de la classe JLabel)
JLabel ecran ;
//déclaration de la variable privée dim1, qui contiendra la dimension ( c'est à dire les deux composantes (largeur et hauteur) d'un bouton)des boutons suivants:
//-ceux qui présentent des chiffres
//-le bouton qui présente le signe "="
//-le bouton qui présente le "." (équivaut à une virgule)
private Dimension dim1;
//déclaration de la variable privée dim2 qui contiendra la dimension des boutons qui présentent les opérateurs suivants ( C, +, -, /,*), c'est à dire les deux composantes (largeur et hauteur) d'un bouton
// le bouton qui présente l'opérateur "=" aura pour dimension dim1, comme précisé ci-dessus
private Dimension dim2;
//déclaration de la variable privée dim3 qui contiendra la dimension du Jlabel ecran
private Dimension dim3;
//déclaration de la variable chiffre qui a le statut friend, c'est à dire qu'elle n'est accessible que dans
//le package package_calculatrice, en particulier dans les classes ChiffreListener, DivListener etc...
//C'est une variable intermediaire destinée à recevoir le résultat d'une opération
//Ce resultat sera ensuite affiché dans le JLabel ecran
double chiffre;
//declaration de deux variables de type booleen:
//-clickOperateur qui contient true si l'utilsateur a cliqué sur un bouton qui designe un opérateur ou false dans le cas contraire
//- update qui contient
//ces deux variables ont le modificateur friendly, qui signifie qu'elles ne sont accessibles que dans le package
//package_calculatrice, en particulier dans les classes ChiffreListener, DivListener etc...
//-la variable update contient true si nous devons effacer ce qu'il y a à l'écran pour écrire un nouveau nombre.
//elle contient false si nous ne devons pas le faire
//-la variable clicOperateur contient true si un opérateur a été choisi( c'est à dire si on a cliqué sur le bouton d'un opérateur tel que "+", "-", "*", "/")et false si on a cliqué sur un chiffre pou sur l'opérateur "="
boolean clicOperateur, update ;
// declaration de la variable operateur qui contient la valeur de l'opérateur courant
String operateur;
//declaration de la variable panOperateur , de type JPanel, qui contiendra, une fois initialisée, les opérateurs servant aux différentes opérations
private JPanel panOperateur ;
//déclaration de la variable privée dim4 qui contiendra la dimension du JPanel panOperateur
private Dimension dim4;
//declaration de la variable panChiffre, de type JPanel, qui contiendra, une fois initialisée, les chiffres du clavier de la calculatrice
private JPanel panChiffre;
//déclaration de la variable privée dim5 qui contiendra la dimension du JPanel panChiffre
private Dimension dim5;
//déclaration de la variable panEcran, de type JPanel, qui contiendra, une fois initialisée, le label qui affiche les chiffres saisis et les resultats d'opérations
private JPanel panEcran;
//déclaration de la variable privée dim6 qui contiendra la dimension du JPanel Panecran
private Dimension dim6;
public Calculatrice(){
this.setSize(240, 260);
this.setTitle("Calculette");
// reprendre la signification de cette méthode
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//reprendre la signification de cetre méthode
this.setLocationRelativeTo(null);
//appel de la m&thode setResizable de la classe JFrame, qui , du fait de la valeur de
//son argument =false, ne permet pas de modifier dynamiquement la taille de la fenêtre
this.setResizable(false);
// initialisation du tableau tab_string avec toutes les valeurs du clavier de la calculatrice
//this.tab_string = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", "=", "C", "+", "-", "*", "/"};
//initialisation du tableau tab_button, dont le nombre d'éléments est égal à la longueur du tableau tab_string
this.tab_button = new JButton[tab_string.length];
// initialisation des deux variables dim1 et dim2 avec , en paramètres rééls du constructeur de la classe Dimension, les valeurs de la largeur et de la hauteur
this.dim1 = new Dimension(50, 40);
this.dim2 = new Dimension(50, 31);
this.dim3=new Dimension(220,20);
this.dim4=new Dimension (55,225);
this.dim5=new Dimension (165,225);
this.dim6=new Dimension (220,30);
//initialisation de la variable chiffre à 0
this.chiffre=0.0;
// initialisation de la variable clicOperateur à false, car pour l'instant aucun click sur le bouton d'un quelconque opérateur n'a eu lieu
this.clicOperateur = false;
// initilialisation de la variable update à false car pour l'instant il n'est pas question d'effacer ce qu'il y a à l'écran
//pour écrire un nouveau nombre
this.update = false;
//initialisation de la variable opérateur à la chaîne de caractère vise car aucun opérateur n'a encore été sélectionné
this.operateur = "";
// appeldela méthode initComposant qui initilialise les différents élements de l'interface graphique:le label qui contient le résultat final, les 3 panels,
// les bouton de la calculatrice avec leur libellé, le positionnement des différents panel selon un layoutmanager de type BORDERLAYOUT
initComposants();
this.setContentPane(container);
this.setVisible(true);
}//fin de constructeur Calculatrice
private void initComposants(){
// declaration et création de la police de caractère du label qui contient les différents opérateurs et opérandes des opérations
//et le résultat final de l'opération
Font police_ecran = new Font("Arial", Font.BOLD, 20);
//initialisation du label nommé ecran, qui contient les différents opérateurs et opérandes des
//opérations et le résultat final de l'opération, avec le caractère "0"(chiffre 0)
this.ecran = new JLabel("0");
//appel de la méthode setFont avec en paramètre le label police_ecran;
//cette police sera appliquée au label nommé ecran;
//Cette méthode est une méthode héritée de la classe JComponent du package swingx , qui est la classe mère de JLabel(super classe)
//
this.ecran.setFont(police_ecran);
//appel de la méthode setHorizontalAlignment avec en paramètre la position "RIGHT" , de type int,
//L'appel de cette méthode est appliquée au JlabelS nommé ecran et permet
//l'alignement du contenu du label sur l'axe des X( des abscisses) mais avec une saisie de droite à gauche.
this.ecran.setHorizontalAlignment(JLabel.RIGHT);
//
this.ecran.setPreferredSize(dim3);
this.panOperateur = new JPanel();
this.panOperateur.setPreferredSize(dim4);
this.panChiffre = new JPanel();
this.panChiffre.setPreferredSize(dim5);
this.panEcran = new JPanel();
this.panEcran.setPreferredSize(dim6);
// pour chaque case d'indice 0 à l'indice 16, du tableau tab_button, on crée un nouvel élément(une nouvelle instance), c'est à dire un nouveau bouton
//qui aura le texte précisé à l'indice i du tableau tab_string; par exemple pour le premier bouton d'inde 0 du tableau tab_button, il aura le texte d'indice 0 du tableau tab_string,
//c'est à dire "1" etc...
//Tous les boutons du tableau tab_button autont la dimension dim1, c'est à dire 50 pixels de longueur et 40 pixels de hauteur
for(int i = 0; i < tab_string.length; i++) {
this.tab_button[i] = new JButton(tab_string[i]);
this.tab_button[i].setPreferredSize(dim1);
// pour tous les boutons d'indice 11 à 16, c'est à dire les boutons qui ont le textre suivants
//"=", "C", "+", "-", "*", "/", on leur adjoint un comportement particulier
switch(i){
//Dans le cas où i =11, c'est à dire pour le bouton qui représente l'opérateur "=", on lui adjoint, par le biais de la méthode addActionListener,
//le comportement d'une instance de la classe EgalListener, qui implémente l'interface ActionListener.
// Cela signifie que chaque fois qu'un click sur bouton se produira, le code de toutes les méthodes de la nouvelle instance de la classe EgalListener
//sera exécuté.
//Il se trouve qu'il n'existe qu'une seule méthode dans l'interface ActionListener; cette méthode s'appelle ActionPerformed.
//Donc , seul ce code sera executé, lors d'un click sur un bouton.
//le détail du code de cette méthode sera expliqué dans la classe EgalListener
case 11 :
this.tab_button[i].addActionListener(new EgalListener());
//on ajoute ensuite le bouton qui est l'élement d'indice 11 du tableau tab_button au panel panChiffre, qui est le panel
// qui contient les chiffres du clavier de la calculatrice
this.panChiffre.add(tab_button[i]);
break;
case 12 :
this.tab_button[i].setForeground(Color.red);
this.tab_button[i].addActionListener(new ResetListener());
this.tab_button[i].setPreferredSize(dim2);
this.panOperateur.add(tab_button[i]);
break;
case 13 :
this.tab_button[i].addActionListener(new PlusListener());
this.tab_button[i].setPreferredSize(dim2);
this.panOperateur.add(tab_button[i]);
break;
case 14 :
this.tab_button[i].addActionListener(new MoinsListener());
this.tab_button[i].setPreferredSize(dim2);
this.panOperateur.add(tab_button[i]);
break;
case 15 :
this.tab_button[i].addActionListener(new MultiListener());
this.tab_button[i].setPreferredSize(dim2);
this.panOperateur.add(tab_button[i]);
break;
case 16 :
this.tab_button[i].addActionListener(new DivListener());
this.tab_button[i].setPreferredSize(dim2);
this.panOperateur.add(tab_button[i]);
break;
// dans le cas où l'on n'a pas cliqué sur un bouton qui représente un opérateur
default :
this.tab_button[i].addActionListener(new ChiffreListener());
this.panChiffre.add(tab_button[i]);
break;
}// fin de switch
}// fin de for
this.panEcran.add(ecran);
// this.panEcran.setBorder(BorderFactory.createLineBorder(Color.black));
this.container.add(panEcran, BorderLayout.NORTH);
this.container.add(panChiffre, BorderLayout.CENTER);
this.container.add(panOperateur, BorderLayout.EAST);
}// fin de initComposant
public void calcul(){
if( this.operateur.equals("+") )
{
//la classe Double "enveloppe" une valeur du type primitf double en une instance du type Double
//la classe Double propose plusieurs méthodes de conversion d'un String en Double ou d'un Double en String, ce qui n'est pas le cas pour le type double primitif.
//La méthode parseDouble de la classe Double permet justement la conversion d'un String en Double
//la variable chiffre va contenir la valeur saisie dans le label convertie en Double
this.chiffre = chiffre + Double.parseDouble(ecran.getText());
//la méthode String valueOf(double d) de la classe String est une méthode statique
//C'est pour cette raison que lorsqu'on l'appelle on met devant le nom de la classe et non pas le nom d'une instance de la classe String
//Elle permet de retourner une instance de type String qui est la conversion d' une valeur de type double
//qui est celle du paramètre de type double convertie en type String
//this.ecran.setText(String.valueOf(chiffre));
}
if( this.operateur.equals("-"))
{
this.chiffre = chiffre - Double.parseDouble(ecran.getText());
//this.chiffre = chiffre - Double.valueOf(ecran.getText()).doubleValue();
// this.ecran.setText(String.valueOf(chiffre));
}
if( this.operateur.equals("*"))
{
//this.chiffre = chiffre * Double.valueOf(ecran.getText()).doubleValue();
this.chiffre = chiffre * Double.parseDouble(ecran.getText());
// this.ecran.setText(String.valueOf(chiffre));
}
if( this.operateur.equals("/"))
{
try{
//this.chiffre = chiffre / Double.valueOf(ecran.getText()).doubleValue();
this.chiffre = chiffre / Double.parseDouble(ecran.getText());
this.ecran.setText(String.valueOf(chiffre));
}// fin de try
catch(ArithmeticException e){
//dans le cas où il est demandé une division par 0, le chiffre 0 ( de type caractère)
//s'affiche dans le JLabel ecran
this.ecran.setText("0");
}// fin de catch
}// fin de if ( this.operateur.equals("/"))
}// fin de méthode calcul
}// fin de classe Calculatrice
//permet l'affichage dans le JLabel ecran , du chiffre sur lequel on a cliqué
class ChiffreListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//lorqu'on a clické sur un bouton qui n'est pas le bouton d'un opérateur, donc lorsqu'on a cliqué sur un chiffre,
//il se crée une instance de la classe ActionEvent
//On récupère l'adresse de cette instance dans la variable e de type ActionEvent.
//Ensuite, on apelle la méthode getSource de la classe ActionEvent.
//Celle-ci permet de retourner le bouton( c'est à dire l'instance de la classe JButton)sur lequel on a cliqué
//l'appel de la méthode getText, appliqué à ce bouton, permet de retourner le texte écrit sur le bouton sur lequel on a cliqué
//Ce texte est affecté à la variable str
String str = ((JButton)e.getSource()).getText();
//update est = true quand on a cliqué sur un opérateur , ce qui permet d'effacer le chiffre saisi auparavant
//if(update) teste si la variable update contient true et donc teste si on est dans une situation où
//on a cliqué auparavant sur un opérateur
// si c'est le cas, on reinitialise simplement la variable update à false, pour permette la saisie du chiffre en cours
if(update)
{
update = false;
}
else
//dans le cas où update est déjà à false, c'est à dire par exemple lorsqu'on commence la saisie de l'expression numérique,
//alors on affiche simplement le contenu de la variable str
{
// si le Jlabel ecran ne contient pas le chiffre 0 , la variable str qui contient la chaine de
//caractères à afficher, va contenir ce qui existe déjà à l'écran dans le Jlabel +
//le chiffre du bouton sur lequel on a cliqué(exemple affichage du nombre 87)
if(!ecran.getText().equals("0"))
str = ecran.getText() + str;
}
ecran.setText(str);
}
}// fin de class ChiffreListener
class EgalListener implements ActionListener{
//Au moment où l'utilisateur clique sur le bouton "=", la variable operateur contient normalement "+" ou "-" ou "*" ou "/"
@Override
public void actionPerformed(ActionEvent arg0) {
// du fait que la variable operateur contient les opérateurs "+" ou "-" ou "*" ou "/" quand on clique sur "=",
//une opération d'addition ,de multiplication, de soustraction ou de division
//doit s'executer quand on clique sur le bouton "=".
//C'est ce qui justifie l'appel de la méthodoe calcul
calcul();
//quand on clique sur l' opérateur = après la saisie d'un chiffre, cela efface le chiffre
// pour afficher un resultat
//et update = true;
update = true;
//on considère que l'opérateur = n'est pas un opérateur qui permet de faire des calculs;
//il permet simplement d'afficher un resultat
//quand on clique dessus , la variable clicOperateur vaut donc false
clicOperateur = false;
}
}
class PlusListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
try{
//la variable clicOperateur vaut true lorsqu'on a déjà cliqué précédemment sur un opérateur "-" ou "*"ou "+"ou "/"
//c'est à dire lorsqu'on a déjà fait une première opération
if(clicOperateur)
{
//si la variable operateur contient déjà un opérateur,:"-" ou "*"ou "+"ou "/" , on doit alors appeler la méthode calcul
//qui va calculer le resultat précédent
//ex:si clicOperateur == true, je suis par exemple dans cette situation 3*3+ : j'appelle la méthode calcul,
//qui teste l'opérateur existant(c'est à dire ici l'operateur *) pour effectuer la multiplcation 3*3
calcul();
// conversion en String de la valeur contenue dans la variable chiffre, pour pouvoir afficher cette valeur
//dans le label ecran, qui ne peut accepter que des données de type String
ecran.setText(String.valueOf(chiffre));
}
else
//Si on est dans les cas suivants
//- on clique pour la première fois sur l'opérateur + , la variable clicOperateur vaut false du fait qu'elle est initialisée avec cette valeur
//On doit donc la faire passer à true avec l'instruction qui suit:clicOperateur = true;
//-on a cliqué précédemment sur le signe" = ", ce qui a provoqué que la variable clicOperateur = false, on doit alors la faire passer à true
//la variable chiffre vaut simplement ce qui est saisi dans le JLabel ecran( pas encore de resultat calculé)
{
//chiffre = Double.valueOf(ecran.getText()).doubleValue();
chiffre = Double.parseDouble(ecran.getText());
clicOperateur = true;
}
// je ne fais passer la variable operateur à la valeur + qu'après avoir effectué le calcul qui tient compte du fait de l'opérateur existant
// c'est à dire dans l'exemple présent, l'opérateur *
operateur = "+";
//après la saisie de l'opérateur + on efface le chiffre à l'écran et donc update passe à true
update = true;
}// fin de try
catch(NumberFormatException NFex){
System.out.println("Attention!! vous n'avez pas saisi de chiffre");
ecran.setText("0");
}// fin de catch
catch(Exception ex){
System.out.println("Une erreur inattendue s'est produite");
ecran.setText("0");
}// fin de deuxièmpe catch
}// fin de actionPerformed
}// fin de classe
class DivListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
try{
//la variable clicOperateur vaut true lorsqu'on a déjà cliqué précédemment sur un opérateur "-" ou "*"ou "+"ou "/"
//c'est à dire lorsqu'on a déjà fait une première opération
if(clicOperateur)
//si la variable operateur contient déjà un opérateur,:"-" ou "*"ou "+"ou "/" , on doit alors appeler la méthode calcul
//qui va calculer le resultat précédent
//ex:si clicOperateur == true, je suis par exemple dans cette situation 12* 4 / : j'appelle la méthode calcul,
//qui teste l'opérateur existant(c'est à dire ici l'operateur *) pour effectuer la multiplcation 12 * 4
{
calcul();
ecran.setText(String.valueOf(chiffre));
}
else
//Si on est dans les cas suivants
//- on clique pour la première fois sur l'opérateur / , la variable clicOperateur vaut false du fait qu'elle est initialisée avec cette valeur
//On doit donc la faire passer à true avec l'instruction qui suit:clicOperateur = true;
//-on a cliqué précédemment sur le signe" = ", ce qui a provoqué que la variable clicOperateur = false, on doit alors la faire passer à true
//la variable chiffre vaut simplement ce qui est saisi dans le JLabel ecran( pas encore de resultat calculé)
{
chiffre = Double.valueOf(ecran.getText()).doubleValue();
clicOperateur = true;
}
// je ne fais passer la variable operateur à la valeur / qu'après avoir effectué le calcul qui tient compte du fait de l'opérateur existant
// c'est à dire dans l'exemple présent, l'opérateur *
operateur = "/";
//après la saisie de l'opérateur / on efface le chiffre à l'écran et donc update passe à true
update = true;
}// fin de try
catch(NumberFormatException Nfex){
System.out.println("Attention!! vous n'avez pas saisi de chiffre");
ecran.setText("0");
}// fin de catch
catch(Exception ex){
System.out.println("Une erreur inattendue s'est produite");
ecran.setText("0");
}// fin de deuxièmpe catch
}// fin de actionPerformed
}// fin de classe DivListener
class MoinsListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
try{
if(clicOperateur)
{
//si la variable operateur contient déjà un opérateur,:"-" ou "*"ou "+"ou "/" , on doit alors appeler la méthode calcul
//qui va calculer le resultat précédent
//ex:si clicOperateur == true, je suis par exemple dans cette situation 3*3- : j'appelle la méthode calcul,
//qui teste l'opérateur existant(c'est à dire ici l'operateur *) pour effectuer la multiplcation 3*3
calcul();
ecran.setText(String.valueOf(chiffre));
}// fin de if
else
//Si on est dans les cas suivants
//- on clique pour la première fois sur l'opérateur -, la variable clicOperateur vaut false du fait qu'elle est initialisée avec cette valeur
//On doit donc la faire passer à true avec l'instruction qui suit:clicOperateur = true;
//-on a cliqué précédemment sur le signe" = ", ce qui a provoqué que la variable clicOperateur = false, on doit alors la faire passer à true
//la variable chiffre vaut simplement ce qui est saisi dans le JLabel ecran( pas encore de resultat calculé)
{
// chiffre = Double.valueOf(ecran.getText()).doubleValue();
chiffre = Double.parseDouble(ecran.getText());
clicOperateur = true;
}// fin de else
// je ne fais passer la variable operateur à la valeur - qu'après avoir effectué le calcul qui tient compte du fait de l'opérateur existant
// c'est à dire dans l'exemple présent, l'opérateur *
operateur = "-";
//après la saisie de l'opérateur "-" on efface le chiffre à l'écran et donc update passe à true
update = true;
//la variable clicOperateur vaut true lorsqu'on a déjà cliqué précédemment sur un opérateur "-" ou "*"ou "+"ou "/"
//c'est à dire lorsqu'on a déjà fait une première opération
}// fin de try
catch(NumberFormatException Nfex){
System.out.println("Attention!! vous n'avez pas saisi de chiffre");
ecran.setText("0");
}// fin de catch
catch(Exception ex){
System.out.println("Une erreur inattendue s'est produite");
ecran.setText("0");
}// fin de deuxièmpe catch
}// fin de action Performed
}// fin de classe MoinsListener
class MultiListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
try{
//la variable clicOperateur vaut true lorsqu'on a déjà cliqué précédemment sur un opérateur quel qu'il soit : "*" ,"/", "+", "-"
//c'est à dire lorsqu'on a déjà fait une première opération
if(clicOperateur)
{
//si la variable operateur contient déjà un opérateur,:"-" ou "*"ou "+"ou "/" , on doit alors appeler la méthode calcul
//qui va calculer le resultat précédent
//ex:si clicOperateur == true, je suis par exemple dans cette situation 3+3* : j'appelle la méthode calcul,
//qui teste l'opérateur existant(c'est à dire ici l'operateur +) pour effectuer la multiplcation 3+3
calcul();
ecran.setText(String.valueOf(chiffre));
}
//Si on est dans les cas suivants
//- on clique pour la première fois sur l'opérateur * , la variable clicOperateur vaut false du fait qu'elle est initialisée avec cette valeur
//On doit donc la faire passer à true avec l'instruction qui suit:clicOperateur = true;
//-on a cliqué précédemment sur le signe" = ", ce qui a provoqué que la varaible clicOperateur = false, on doit alors la faire passer à true
//la variable chiffre vaut simplement ce qui est saisi dans le JLabel ecran( pas encore de resultat calculé)
else
{
// chiffre = Double.valueOf(ecran.getText()).doubleValue();
chiffre = Double.parseDouble(ecran.getText());
clicOperateur = true;
}
// je ne fais passer la variable operateur à la valeur * qu'après avoir effectué le calcul qui tient compte du fait de l'opérateur existant
// c'est à dire dans l'exemple présent, l'opérateur +
operateur = "*";
//après la saisie de l'opérateur * on efface le chiffre à l'écran et donc update passe à true
update = true;
}// fin de try
catch(NumberFormatException Nfex){
System.out.println("Attention!! vous n'avez pas saisi de chiffre");
ecran.setText("0");
}// fin de catch
catch(Exception ex){
System.out.println("Une erreur inattendue s'est produite");
ecran.setText("0");
}// fin de deuxièmpe catch
}// fin de actionPerformed
}// fin de classe MultiListener
class ResetListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
try{
//quand on appuie sur le bouton Reset, la variable clicOperateur repasse
//puisqu'on n'a pas cliqué sur un opérateur tel que "+", "-", "*", "/"
clicOperateur = false;
//update passe à true, puisqu'on va effacer tou ce qui est dans le JLabel ecran
update = true;
//la varaible chiffre est réinitialisée à true
chiffre = 0;
//la variable operateur eszt égaelement réinitialisée avec sa valeur par défaut =""
operateur = "";
//e JLabel ecran contient la chaîne de caractères vide
ecran.setText("");
}// fin de try
catch(Exception ex){
System.out.println("Une erreur inattendue s'est produite");
ecran.setText("0");
}// fin de catch
}// fin de actionPerformed
}// fin de classe ResetListener
Code : Java
1
2
3
4
5
6
7
8
package package_calculatrice;
public class Main {
public static void main(String[] args) {
Calculatrice calculette = new Calculatrice();
}// fin de méthode
}// fin de classe
2 errors |
Partager