Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide sur un programme Java

Sujet résolu
    20 avril 2017 à 10:53:13

    Bonjour, dans le cadre d'un projet, je souhaiterais faire un Quizz, le problème est dans l'affichage du score, à chaque bonne réponse cela ne fait pas +1 mais passe de 1 à 3;7;15 (puissances de 2, -1).

    J'ai essayé de changer plusieurs choses mais ça ne marche toujours pas.

    Merci de votre aide :)

    import javax.swing.JFrame;
    import javax.swing.JButton;
    import javax.swing.JPanel;
    import javax.swing.Timer;
    
    
    import javax.swing.JLabel;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import java.util.Collections;
    
    
    public class Quizz2 extends JFrame implements ActionListener{
    	// TODO Auto-generated method stub	
    		JLabel label = new JLabel("Qui est Barack Obama ?");
    		private JPanel pan = new JPanel();
    		private JButton bouton1 = new JButton("1");
    		private JButton bouton2 = new JButton("2");
    		private JButton bouton3 = new JButton("3");
    		private JButton bouton4 = new JButton("4");
    		private JButton suivant = new JButton("Question Suivante");
    		String reponse ="Un ancien président des USA";
    		JLabel label2 = new JLabel("Score :0");
    		private int score=0;
    		
    		// titre + taille...
    		public Quizz2(){
    		this.setTitle("Quiz");
    		this.setSize(800,300);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    		
    
    		//Couleur
    	    pan.setBackground(Color.white);
    	    pan.setLayout(new BorderLayout());
    	    
    	    //Liste
    	    ArrayList<String> al = new ArrayList<String>();
    	    al.add("Un ancien président des USA");
    	    al.add("Un président français");
    	    al.add("Un président anglais");
    	    al.add("Un président espagnol");
    	    
    	    //Mélanger liste
    	    for(int i =0; i<6;i++){
    			Collections.shuffle(al);
    	    }
    	    
    	    //Assimiler valeur à chaîne caractères
    	    String a1 = (String) al.get(1);
    	    String a2 = (String) al.get(0);
    	    String a3 = (String) al.get(2);
    	    String a4 = (String) al.get(3);
    	    
    	    //Ajout texte à bouton
    	    bouton1.setText(a1);
    	    bouton2.setText(a2);
    	    bouton3.setText(a3);
    	    bouton4.setText(a4);
    	    
    	    //Ajout boutons et classe qui écoute
    	    bouton1.addActionListener(new BoutonListener());
    	    bouton2.addActionListener(new Bouton2Listener());
    	    bouton3.addActionListener(new Bouton3Listener());
    	    bouton4.addActionListener(new Bouton4Listener());
    	    suivant.addActionListener(new Suivant());
    		 
    		//Création south, ensemble de boutons
    		    JPanel south = new JPanel();
    		    south.add(bouton1);
    		    south.add(bouton3);
    		    south.add(bouton2);
    		    south.add(bouton4);
    		    pan.add(south, BorderLayout.SOUTH);
    		    south.setBackground(Color.black);
    		    pan.add(suivant,BorderLayout.EAST);
    	    
    	    //Paramètres texte
    	    label.setHorizontalAlignment(JLabel.CENTER);
    	    Font police = new Font("Tahoma", Font.BOLD, 20);
    	    label.setFont(police);
    	    pan.add(label,  BorderLayout.CENTER);
    	    
    	    label2.setHorizontalAlignment(JLabel.CENTER);
    	    Font police2 = new Font("Tahoma", Font.BOLD, 14);
    	    label2.setFont(police2);
    	    pan.add(label2,  BorderLayout.NORTH);
    	    
    	    this.setContentPane(pan);
    	    this.setVisible(true);
    	    
    	  }
    		
    		//Classe1 + Action à faire
    		class BoutonListener implements ActionListener{
    		private int compteur=0;
    
    		public void actionPerformed(ActionEvent arg0) {
    			 this.compteur++;
    			String jButText = bouton1.getText();
    			 //Tester la réponse
    			if(jButText== reponse)
    			 { label.setText("Bravo c'est la bonne réponse !");
    			 score =score+1;
    			 label2.setText("Score :"+ score);}
    			 else
    			 {
    				    label.setText("Vous devez réviser votre cours encore! C'était :"+ reponse);
    			  }
    			 if (compteur== 1){
    				 bouton1.setEnabled(false);
    				 bouton2.setEnabled(false);
    				 bouton3.setEnabled(false);
    				 bouton4.setEnabled(false);
    			 }
    			
    			  }
    		}
    		//Classe2 + Action à faire
    		class Bouton2Listener implements ActionListener{
    			 private int compteur;
    
    			public void actionPerformed(ActionEvent arg0) {
    				 this.compteur++;
    				String jButText = bouton2.getText();
    				//Tester la réponse
    				 if(jButText== reponse)
    				 { label.setText("Bravo c'est la bonne réponse !");
    				 score =score+1;
    				 label2.setText("Score :"+ score);
    				 		}
    				 else
    				 {
    					    label.setText("Vous devez réviser votre cours encore! C'était :"+ reponse);
    				  }
    				 if (compteur== 1){
    					 bouton1.setEnabled(false);
    					 bouton2.setEnabled(false);
    					 bouton3.setEnabled(false);
    					 bouton4.setEnabled(false);
    				 }
    					 
    		 }
    		}
    		//Classe3 + Action à faire
    		class Bouton3Listener implements ActionListener{
    			 private int compteur;
    			 public void actionPerformed(ActionEvent arg0) {
    				 this.compteur++;
    				String jButText = bouton3.getText();
    				
    				 //Tester la réponse
    				if(jButText== reponse)
    				 { label.setText("Bravo c'est la bonne réponse !");
    				 score =score+1;
    				 label2.setText("Score :"+ score);
    				 		}
    				 else
    				 {
    					    label.setText("Vous devez réviser votre cours encore! C'était :"+ reponse);
    				  }
    			 if (compteur== 1){
    				 bouton1.setEnabled(false);
    				 bouton2.setEnabled(false);
    				 bouton3.setEnabled(false);
    				 bouton4.setEnabled(false);
    			 }
    		}
    		}
    		//Classe4 + Action à faire
    		class Bouton4Listener implements ActionListener{
    			 private int compteur;
    			public void actionPerformed(ActionEvent arg0) {
    				 this.compteur++;
    				String jButText = bouton4.getText();
    				
    				 //Tester la réponse
    				if(jButText== reponse)
    				 { label.setText("Bravo c'est la bonne réponse !");
    				 score =score+1;
    				 label2.setText("Score :"+ score);
    				 		}
    				 else
    				 {
    					    label.setText("Vous devez réviser votre cours encore! C'était :"+ reponse);
    				  }
    				 if (compteur== 1){
    					 bouton1.setEnabled(false);
    					 bouton2.setEnabled(false);
    					 bouton3.setEnabled(false);
    					 bouton4.setEnabled(false);
    				 }
    		 }
    		}
    
    		class Suivant implements ActionListener{
    
    			@Override
    			public void actionPerformed(ActionEvent arg0) {
    				// TODO Auto-generated method stub
    				pan.removeAll();
    				pan.updateUI();
    				
    				pan.setBackground(Color.white);
    			    pan.setLayout(new BorderLayout());
    			    
    			    
    
    			    label.setText("Le plus petit chiffre");
    				reponse = "1";
    			    //Liste
    			    ArrayList<String> al2 = new ArrayList<String>();
    			    al2.add("1");
    			    al2.add("2");
    			    al2.add("3");
    			    al2.add("4");
    			    
    			    //Mélanger liste
    			    for(int i =0; i<6;i++){
    					Collections.shuffle(al2);
    			    }
    			    
    			    //Assimiler valeur à chaîne caractères
    			    String a1 = (String) al2.get(1);
    			    String a2 = (String) al2.get(0);
    			    String a3 = (String) al2.get(2);
    			    String a4 = (String) al2.get(3);
    			    
    			    //Ajout texte à bouton
    			    bouton1.setText(a1);
    			    bouton2.setText(a2);
    			    bouton3.setText(a3);
    			    bouton4.setText(a4);
    			    
    			    //Ajout boutons et classe qui écoute
    			    bouton1.addActionListener(new BoutonListener());
    			    bouton2.addActionListener(new Bouton2Listener());
    			    bouton3.addActionListener(new Bouton3Listener());
    			    bouton4.addActionListener(new Bouton4Listener());
    			    suivant.addActionListener(new Suivant());
    				 
    				//Création south, ensemble de boutons
    				    JPanel south = new JPanel();
    				    south.add(bouton1);
    				    south.add(bouton3);
    				    south.add(bouton2);
    				    south.add(bouton4);
    				    pan.add(south, BorderLayout.SOUTH);
    				    south.setBackground(Color.black);
    				    pan.add(suivant,BorderLayout.EAST);
    			    
    			    //Paramètres texte
    			    label.setHorizontalAlignment(JLabel.CENTER);
    			    Font police = new Font("Tahoma", Font.BOLD, 20);
    			    label.setFont(police);
    			    pan.add(label,  BorderLayout.CENTER);
    			    
    			    label2.setHorizontalAlignment(JLabel.CENTER);
    			    Font police2 = new Font("Tahoma", Font.BOLD, 14);
    			    label2.setFont(police2);
    			    pan.add(label2,  BorderLayout.NORTH);
    			    
    
    				 bouton1.setEnabled(true);
    				 bouton2.setEnabled(true);
    				 bouton3.setEnabled(true);
    				 bouton4.setEnabled(true);
    			    
    			}
    
    			
    		}
    		//Lancer l'exe
    		public static void main(String[] args) {
    			 new Quizz2();
    		}
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			// TODO Auto-generated method stub
    			
    		}
    		}
    



    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2017 à 13:09:39

      Bonjour,

      Faites attention à la duplication de code.

      Pour votre problème de score, ça vient du nombre de fois où les classes BoutonListener sont appelées. Supprimer et mettre à jour pan ne supprime pas les classes instanciées, plutôt que de supprimer le contenu et de le réécrire, il faut simplement le mettre à jour et enlever les appelles de BoutonListener.

      Voici ce que j'obtiens dans la classe Suivant :

      class Suivant implements ActionListener{
       
          @Override
          public void actionPerformed(ActionEvent arg0) {
      
                       
                       
       
              label.setText("Le plus petit chiffre");
              reponse = "1";
              //Liste
              ArrayList<String> al2 = new ArrayList<String>();
              al2.add("1");
              al2.add("2");
              al2.add("3");
              al2.add("4");
                       
              //Mélanger liste
              for(int i =0; i<6;i++){
                  Collections.shuffle(al2);
              }
                       
              //Assimiler valeur à chaîne caractères
              String a1 = (String) al2.get(1);
              String a2 = (String) al2.get(0);
              String a3 = (String) al2.get(2);
              String a4 = (String) al2.get(3);
                       
              //Ajout texte à bouton
              bouton1.setText(a1);
              bouton2.setText(a2);
              bouton3.setText(a3);
              bouton4.setText(a4);
                        
                                       
       
              bouton1.setEnabled(true);
              bouton2.setEnabled(true);
              bouton3.setEnabled(true);
              bouton4.setEnabled(true);
                       
          }
      }

      Le problème du score est réglé.

      Mais il y a trop de duplication de code, c'est pas très lisible. Les 4 classes BoutonListener peuvent être regroupées en une seule. La fonction actionPerformed prend l'action en argument, dont l'objet sujet à l'action.

      Pour récupérer le texte du bouton il suffit de caster l'objet de l'évènement et récupérer le texte. Soit :

      String jButText = ((AbstractButton) arg0.getSource()).getText();


      C'est mieux qu'avoir 4 fois le même code, c'est plus lisible et si il y a une modification à faire on la fait qu'une fois.

      Bonne continuation !

      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2017 à 18:16:01

        Merci pour ton aide vraiment !

        Oui pour récupérer le texte des JButton je me disais bien qu'il y avait plus simple mais n'ayant pas trouvé j'ai fait comme j'ai pu, merci en tout cas :)

        • Partager sur Facebook
        • Partager sur Twitter

        Aide sur un programme Java

        × 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