Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème calculatrice en temps réel

Sujet résolu
    10 août 2017 à 12:05:52

    Bonjour / Bonsoir 

    Comme dit le titre, j'essaye de faire une petite addition en temps réel, bon j'ai 2 textfields et une textarea, je vous donne un exemple pour comprendre comment ça marche, ensuite je détaillerai mon problème.

    Lorsque j'entre un nombre par exemple 5 dans le textfield a, ça m'affiche directement le 5 dans le textarea en utilisant un Documentlistener sur le textfield a, j'utilise aussi un DocumentListener sur le textfield b, mon problème c'est lors ce que j'ajoute à un autre nombre par exemple 1 dans le text field b à la précence du 5 dans le textfield a b'en ça me veut pas me faire la somme, j'ai beaucoup essayé mais pas de solutions,  est-ce-que quelqu'un svp pourrait me donner des indications à comment résoudre ce problème. 

    Merci et bonne journée / soirée.

    Voici mon code 

    package test;
    
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    
    public class Main implements java.awt.event.ActionListener {
    	
    	static int m = 0;
    	static int n = 0;
    
    	public static void main(String[] args) {
    		
    		JFrame window = new JFrame();
    		JPanel pan   = new JPanel();
    		JTextField a = new JTextField();
    		JTextField b = new JTextField();
    		JTextArea c  = new JTextArea();
    		Font police  = new Font("Serif", Font.PLAIN, 20);
    		a.setFont(police);
    		b.setFont(police);
    		c.setFont(police);
    		
    		a.setBounds(100, 100, 100, 25);
    		b.setBounds(300, 100, 100, 25);
    		c.setBounds(200, 200, 100, 25);
    		
    		
    		
    		a.getDocument().addDocumentListener(new DocumentListener() {
    
    			public void changedUpdate(DocumentEvent arg0) {
    			
    			}
    			public void insertUpdate(DocumentEvent arg0) {
    				try {
    					c.setText(Integer.toString(Integer.parseInt(a.getText())));
    				} catch(NumberFormatException e) {
    					c.setText("ERROR");
    				}
    			
    			}
    
    			public void removeUpdate(DocumentEvent arg0) {
    				
    				if(!a.getText().isEmpty()) {
    				try {
    					c.setText(Integer.toString(Integer.parseInt(a.getText())));
    				} catch(NumberFormatException e) {
    					c.setText("ERROR");
    				}
    				}
    				else {
    					c.setText("");
    				}
    			}
    		});
    		
    		b.getDocument().addDocumentListener(new DocumentListener() {
    
    			public void changedUpdate(DocumentEvent arg0) {
    			
    			}
    			public void insertUpdate(DocumentEvent arg0) {
    				try {
    					c.setText(Integer.toString(Integer.parseInt(b.getText())));
    				} catch(NumberFormatException e) {
    					c.setText("ERROR");
    				}
    			
    			}
    
    			public void removeUpdate(DocumentEvent arg0) {
    				
    				if(!b.getText().isEmpty()) {
    				try {
    					c.setText(Integer.toString(Integer.parseInt(b.getText())));
    				} catch(NumberFormatException e) {
    					c.setText("ERROR");
    				}
    				}
    				else {
    					c.setText("");
    				}
    			}
    		});
    		pan.setLayout(null);
    		pan.add(a);
    		pan.add(b);
    		pan.add(c);
    		
    		window.setContentPane(pan);
    		window.setSize(600, 400);
    		window.setVisible(true);
    		
    		
    		
    		
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    }
    		

    -
    Edité par MEGHNI 10 août 2017 à 12:08:11

    • Partager sur Facebook
    • Partager sur Twitter
      10 août 2017 à 12:44:13

      Bonjour !

      Je ne suis pas tout à fait certain de comprendre pourquoi vous vous attendez à ce que le troisième champ produise une addition si à aucun moment vous lui indiquez d'en faire une ?

      L'idée est simple : chaque fois que le champ a ou le champ est modifié, le champ c doit afficher leur addition. C'est plutôt assez simple à écrire avec des lignes de code, non ? C'est ce qu'il faut mettre dans vos listeners.

      Littéralement, en pseudo code :

      - Prendre le texte de a, le parser sous forme d'integer. Si le champ est vide, on assigne 0.

      - Prendre le texte de b, le parser sous forme d'integer. Si le champ est vide, on assigne 0.

      - Faire leur addition

      - Passer la somme en String, et la mettre dans c

      Dans l'actuel, votre programme fait très exactement : "Si le champ a est modifié, je copie son contenu dans le champ c, pareil pour le champb"

      Pour éviter d'avoir à recopier deux fois le code dans les Listeners, il suffit au choix de créer un seul Listener et de l'associer aux deux TextField (ils ont le même comportement), ou de créer une fonction tierce qui fait le boulot demandé et qui sera appelé à chaque changement de valeur dans les TextField.

      • Partager sur Facebook
      • Partager sur Twitter
        10 août 2017 à 13:05:59

        SadPotato a écrit:

        Je ne suis pas tout à fait certain de comprendre pourquoi vous vous attendez à ce que le troisième champ produise une addition si à aucun moment vous lui indiquez d'en faire une ?


        Oui, je sais, j'ai posté le code à sa version propre, pour qu'il soit lisible 

        Merci pour ton aide et tes explications  !

        Hey, merci beaucoup, j'ai enfin résoulu ce problème, me reste à ajouter quelques trucs mais ça marche voici le nouveau code : 

        package test;
        
        import java.awt.Font;
        import java.awt.event.ActionEvent;
        
        import javax.swing.JFrame;
        import javax.swing.JPanel;
        import javax.swing.JTextArea;
        import javax.swing.JTextField;
        import javax.swing.event.DocumentEvent;
        import javax.swing.event.DocumentListener;
        
        public class Main implements java.awt.event.ActionListener {
        
        	
        	public static void main(String[] args) {
        		
        		JFrame window = new JFrame();
        		JPanel pan   = new JPanel();
        		JTextField a = new JTextField();
        		JTextField b = new JTextField();
        		JTextArea c  = new JTextArea();
        		Font police  = new Font("Serif", Font.PLAIN, 20);
        		a.setFont(police);
        		b.setFont(police);
        		c.setFont(police);
        		
        		a.setBounds(100, 100, 100, 25);
        		b.setBounds(300, 100, 100, 25);
        		c.setBounds(200, 200, 100, 25);
        		
        		
        		
        		
        		a.getDocument().addDocumentListener(new DocumentListener() {
        
        			
        			public void changedUpdate(DocumentEvent arg0) {
        				
        				
        			
        			}
        			public void insertUpdate(DocumentEvent arg0) {
        				int m = Integer.parseInt(a.getText());
        				
        				if(b.getText().isEmpty()) c.setText(Integer.toString(m)); 
        				else {
        					int n = Integer.parseInt(b.getText());
        					c.setText(Integer.toString(m + n));
        					
        				}
        				
        			}
        			public void removeUpdate(DocumentEvent arg0) {
        				if(!a.getText().isEmpty()) {
                       int m = Integer.parseInt(a.getText());
        				
        				if(b.getText().isEmpty()) c.setText(Integer.toString(m)); 
        				else {
        					int n = Integer.parseInt(b.getText());
        					c.setText(Integer.toString(m + n));
        					
        				}
        				} else c.setText(b.getText());
        				
        			
        			}
        			
        			
        		});
        		
        		b.getDocument().addDocumentListener(new DocumentListener() {
        
        			
        			public void changedUpdate(DocumentEvent arg0) {
        				
        				
        			}
        
        			public void insertUpdate(DocumentEvent arg0) {
                        int m = Integer.parseInt(b.getText());
        				
        				if(a.getText().isEmpty()) c.setText(Integer.toString(m)); 
        				else {
        					int n = Integer.parseInt(a.getText());
        					c.setText(Integer.toString(m + n));
        					
        				}
        			}
        
        			
        			public void removeUpdate(DocumentEvent arg0) {
        				if(!b.getText().isEmpty()) {
        		               int m = Integer.parseInt(b.getText());
        						
        						if(a.getText().isEmpty()) c.setText(Integer.toString(m)); 
        						else {
        							int n = Integer.parseInt(a.getText());
        							c.setText(Integer.toString(m + n));
        							
        						}
        						} else c.setText(a.getText());
        						
        				
        			}
        			
        		});
        		pan.setLayout(null);
        		pan.add(a);
        		pan.add(b);
        		pan.add(c);
        		
        		window.setContentPane(pan);
        		window.setSize(1366, 768);
        		window.setVisible(true);
        		
        		
        		
        		
        		
        	}
        
        	@Override
        	public void actionPerformed(ActionEvent arg0) {
        		// TODO Auto-generated method stub
        		
        	}
        	
        	
        }
        		
        		
        		
        		
        		
        		
        		
        	
        		
        
        		
        		
        		
        		
        		
        
        



        -
        Edité par MEGHNI 10 août 2017 à 14:50:42

        • Partager sur Facebook
        • Partager sur Twitter
          10 août 2017 à 18:20:26

          Bonjour,

          Ca "marche" mais ce n'est pas très "propre". Tu as beaucoup de code dupliqué et inutile, et tu ne suis pas les conseils de SadPotato.

          Dans ces cas-là, il est souvent bénéfique de découper son code en méthodes.

          private int getValeur(JTextField field) {
              try {
                  return Integer.parseInt(field.getText());
              } catch (NumberFormatException e) {
                  return 0;
              }
          }
          
          private void calculerSomme(JTextField field1, JTextField field2, JTextField resultat) {
              int somme = getValeur(field1) + getValeur(field2);
              resultat.setText(String.valueOf(somme));
          }


          Avec ces deux méthodes, plus besoin de tes if super compliqués.

          • Partager sur Facebook
          • Partager sur Twitter
            12 août 2017 à 10:12:07

            Hey, merci beaucoup, j'aime trop "les solutions compliquées"  hahaha merci :) :)

            -
            Edité par MEGHNI 12 août 2017 à 12:22:37

            • Partager sur Facebook
            • Partager sur Twitter

            Problème calculatrice en temps réel

            × 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