Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP Calculatrice

comprendre la solution du TP Calculatrice

    4 octobre 2015 à 20:03:11

    Bonjour,

    Je suis en train de suivre le tutoriel apprenez-a-programmer-en-java et j'ai essayé de faire le TP sur la calculatrice, en vain. J'ai donc lu la solution sans comprendre vraiment la logique.

    Quelqu'un pourrait éclairer ma lanterne en expliquant la solution avec des phrases.

    Voilà le code :

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener; 
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
      
    public class Calculatrice extends JFrame {
      private JPanel container = new JPanel();
      //Tableau stockant les éléments à afficher dans la calculatrice
      String[] tab_string = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "0", ".", "=", "C", "+", "-", "*", "/"};
      //Un bouton par élément à afficher
      JButton[] tab_button = new JButton[tab_string.length];
      private JLabel ecran = new JLabel();
      private Dimension dim = new Dimension(50, 40);
      private Dimension dim2 = new Dimension(50, 31);
      private double chiffre1;
      private boolean clicOperateur = false, update = false;
      private String operateur = "";
      
      public Calculatrice(){
        this.setSize(240, 260);
        this.setTitle("Calculette");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        //On initialise le conteneur avec tous les composants
    	  initComposant();
    	  //On ajoute le conteneur
        this.setContentPane(container);
        this.setVisible(true);
      }
          
      private void initComposant(){
        //On définit la police d'écriture à utiliser
        Font police = new Font("Arial", Font.BOLD, 20);
        ecran = new JLabel("0");
        ecran.setFont(police);
        //On aligne les informations à droite dans le JLabel
        ecran.setHorizontalAlignment(JLabel.RIGHT);
        ecran.setPreferredSize(new Dimension(220, 20));
        JPanel operateur = new JPanel();      
        operateur.setPreferredSize(new Dimension(55, 225));
        JPanel chiffre = new JPanel();
        chiffre.setPreferredSize(new Dimension(165, 225));
        JPanel panEcran = new JPanel();
        panEcran.setPreferredSize(new Dimension(220, 30));
    
        //On parcourt le tableau initialisé
        //afin de créer nos boutons
        for(int i = 0; i < tab_string.length; i++){
          tab_button[i] = new JButton(tab_string[i]);
          tab_button[i].setPreferredSize(dim);
          switch(i){
            //Pour chaque élément situé à la fin du tableau
            //et qui n'est pas un chiffre
            //on définit le comportement à avoir grâce à un listener
            case 11 :
              tab_button[i].addActionListener(new EgalListener());
              chiffre.add(tab_button[i]);
              break;
            case 12 :
              tab_button[i].setForeground(Color.red);
              tab_button[i].addActionListener(new ResetListener());
              operateur.add(tab_button[i]);
              break;
            case 13 :
              tab_button[i].addActionListener(new PlusListener());
              tab_button[i].setPreferredSize(dim2);
              operateur.add(tab_button[i]);
              break;
            case 14 :
              tab_button[i].addActionListener(new MoinsListener());
              tab_button[i].setPreferredSize(dim2);
              operateur.add(tab_button[i]);
              break;	
            case 15 :	
              tab_button[i].addActionListener(new MultiListener());
              tab_button[i].setPreferredSize(dim2);
              operateur.add(tab_button[i]);
              break;
            case 16 :
              tab_button[i].addActionListener(new DivListener());
              tab_button[i].setPreferredSize(dim2);
              operateur.add(tab_button[i]);
              break;
            default :
              //Par défaut, ce sont les premiers éléments du tableau
              //donc des chiffres, on affecte alors le bon listener
              chiffre.add(tab_button[i]);
              tab_button[i].addActionListener(new ChiffreListener());
              break;
          }
        }
        panEcran.add(ecran);
        panEcran.setBorder(BorderFactory.createLineBorder(Color.black));
        container.add(panEcran, BorderLayout.NORTH);
        container.add(chiffre, BorderLayout.CENTER);
        container.add(operateur, BorderLayout.EAST);
      }
    
      //Méthode permettant d'effectuer un calcul selon l'opérateur sélectionné
      private void calcul(){
        if(operateur.equals("+")){
          chiffre1 = chiffre1 + 
                Double.valueOf(ecran.getText()).doubleValue();
          ecran.setText(String.valueOf(chiffre1));
        }
        if(operateur.equals("-")){
          chiffre1 = chiffre1 - 
                Double.valueOf(ecran.getText()).doubleValue();
          ecran.setText(String.valueOf(chiffre1));
        }          
        if(operateur.equals("*")){
          chiffre1 = chiffre1 * 
                Double.valueOf(ecran.getText()).doubleValue();
          ecran.setText(String.valueOf(chiffre1));
        }     
        if(operateur.equals("/")){
          try{
            chiffre1 = chiffre1 / 
                  Double.valueOf(ecran.getText()).doubleValue();
            ecran.setText(String.valueOf(chiffre1));
          } catch(ArithmeticException e) {
            ecran.setText("0");
          }
        }
      }
    
      //Listener utilisé pour les chiffres
      //Permet de stocker les chiffres et de les afficher
      class ChiffreListener implements ActionListener {
        public void actionPerformed(ActionEvent e){
          //On affiche le chiffre additionnel dans le label
          String str = ((JButton)e.getSource()).getText();
          if(update){
            update = false;
          }
          else{
            if(!ecran.getText().equals("0"))
              str = ecran.getText() + str;
          }
          ecran.setText(str);
        }
      }
    
      //Listener affecté au bouton =
      class EgalListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0){
          calcul();
          update = true;
          clicOperateur = false;
        }
      }
    
      //Listener affecté au bouton +
      class PlusListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0){
          if(clicOperateur){
            calcul();
            ecran.setText(String.valueOf(chiffre1));
          }
          else{
            chiffre1 = Double.valueOf(ecran.getText()).doubleValue();
            clicOperateur = true;
          }
          operateur = "+";
          update = true;
        }
      }
    
      //Listener affecté au bouton -
      class MoinsListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0){
          if(clicOperateur){
            calcul();
            ecran.setText(String.valueOf(chiffre1));
          }
          else{
            chiffre1 = Double.valueOf(ecran.getText()).doubleValue();
            clicOperateur = true;
          }
          operateur = "-";
          update = true;
        }
      }
    
      //Listener affecté au bouton *
      class MultiListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0){
          if(clicOperateur){
            calcul();
            ecran.setText(String.valueOf(chiffre1));
          }
          else{
            chiffre1 = Double.valueOf(ecran.getText()).doubleValue();
            clicOperateur = true;
          }
          operateur = "*";
          update = true;
        }
      }
    
      //Listener affecté au bouton /
      class DivListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0){
          if(clicOperateur){
            calcul();
            ecran.setText(String.valueOf(chiffre1));
          }
          else{
            chiffre1 = Double.valueOf(ecran.getText()).doubleValue();
            clicOperateur = true;
          }
          operateur = "/";
          update = true;
        }
      }
    
      //Listener affecté au bouton de remise à zéro
      class ResetListener implements ActionListener {
        public void actionPerformed(ActionEvent arg0){
          clicOperateur = false;
          update = true;
          chiffre1 = 0;
          operateur = "";
          ecran.setText("");
        }
      }      
    }
    public class Main {
      public static void main(String[] args) {
        Calculatrice calculette = new Calculatrice();
      } 
    }

    Merci d'avance pour vos réponses :)

    -
    Edité par MagJ 4 octobre 2015 à 21:51:28

    • Partager sur Facebook
    • Partager sur Twitter
      4 octobre 2015 à 22:55:43

      Expliquer tout le code risque d'être un peu long mais pour faire simple :

      Il faut distinguer plusieurs parties : l'interface graphique, les données et les interactions entre les deux.

      Dans la méthode initComposant(), comme l'indique le nom, on initialise chaque composant de l'interface graphique et on attribue aux boutons des listeners : on mets sur écoute les boutons et on actionne une action lorsqu'on clique dessus.

      L'action à executer se trouve dans la méthode actionPerformed() qu'on implémente de l'interface ActionListener. Ainsi, on a choisi de créer un Listener pour chaque bouton et un bouton correspond à une action ("diviser","multiplier","remettre à zéro",etc...).

      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2015 à 19:49:07

        Bonjour,

        Malheureusement je manque de temps en ce moment, mais je vais revenir pour expliquer plus en détail ce qui me pose problème, car j'ai bien compris l'idée générale.

        Merci pour la réponse

        -
        Edité par MagJ 30 novembre 2015 à 19:54:53

        • Partager sur Facebook
        • Partager sur Twitter

        TP Calculatrice

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown