Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'opération ??...

...ou est-ce ma méthode...

Sujet résolu
    17 décembre 2009 à 15:56:30

    Bonjour à tous.

    Dans le cadre de notre cours de JAVA, nous devons faire une appli qui permet de faire des sondages.
    Au départ on nous demande juste une fenêtre avec une question binaire et les résultats qui s'affichent après avoir cliqué sur un bouton.

    Voici ma page principale (pour que vous ayez les éléments mais tout ne vous sera pas utile) :
    package vue;
    
    import java.awt.*;
    import java.awt.event.*;
    
    import javax.swing.*;
    
    import appli.metier.*;
    
    import event.*;
    
    public class VueQuestionBinaire extends JFrame
    {
    	QuestionBinaire laQb;
    	private JButton btPos, btNeg, btRes, btQuit;
    	private JLabel quest, res;
    	private int pos, neg;
    	private JPanel pN, pS;
    	
    	public static String sPos = new String("");
    	public static String sNeg = new String("");
    	public static String sRes = new String("");
    	public static String sQuit = new String("");
    	
    	private static int nbPos = 0;
    	private static int nbNeg = 0;
    	private static int nbTot = 0;
    	
    	private void modifAttBt () {
    		this.sPos = this.laQb.getLibOui();
    		this.sNeg = this.laQb.getLibNon();
    		this.sRes = this.btRes.getText();
    		this.sQuit = this.btQuit.getText();
    	}
    	
    	public VueQuestionBinaire  (String _t, QuestionBinaire _qb)
    	{
    		super(_t);
    		this.laQb = _qb;
    		
    		//Taille de la fenêtre
    		this.setSize(500, 300);
    		this.setLocationRelativeTo(null);
    		
    		//Création des éléments
    		this.btPos = new JButton(this.laQb.getLibOui());
    		this.btNeg = new JButton(this.laQb.getLibNon());
    		this.btRes = new JButton("Résultats...");
    		this.btQuit = new JButton("Quitter");
    		this.quest = new JLabel(this.laQb.getQuestion());
    		this.res = new JLabel("Ici les résultats prochainement...");
    		this.btRes.setEnabled(false);
    		
    		this.modifAttBt();
    		
    		//Mise en place d'un layout pour placer les éléments
    		//On crée un panel
    		this.pN = new JPanel(new GridLayout(2,1));
    		//On y ajoute la question
    		this.pN.add(this.quest);
    		this.pN.add(this.res);
    		
    		/*
    		this.btPos.addActionListener(this);
    		this.btNeg.addActionListener(this);
    		this.btRes.addActionListener(this);
    		this.btQuit.addActionListener(this);
    		*/
    		//PLUTOT FAIRE UN ECOUTEUR DE BOUTONS
    		
    		//On crée un panel
    		this.pS = new JPanel();
    		//On y ajoute la question
    		this.pS.add(this.btRes);
    		this.pS.add(this.btQuit);
    		
    		
    		
    		this.add(this.pN, BorderLayout.NORTH);
    		this.add(this.pS, BorderLayout.SOUTH);
    		this.add(this.btPos, BorderLayout.WEST);
    		this.add(this.btNeg, BorderLayout.EAST);
    		
    		
    		EcouteurBouton btMouse = new EcouteurBouton(this, this.res);
    		btPos.addActionListener(btMouse);
    		btNeg.addActionListener(btMouse);
    		btRes.addActionListener(btMouse);
    		btQuit.addActionListener(btMouse);
    	}
    	
    	public int[] getNbVotes() {
    		int[] vals;
    		
    		vals = new int[3];
    		
    		vals[0] = this.nbPos;
    		vals[1] = this.nbNeg;
    		vals[2] = this.nbTot;
    		
    		return vals;
    	}
    	
    	public void setNbVotes(int _pPos, int _pNeg, int _pTot) {
    		this.nbPos = _pPos;
    		this.nbNeg = _pNeg;
    		this.nbTot = _pTot;
    	}
    
    	public void setResTrue() {
    		this.btRes.setEnabled(true);
    	}
    }
    


    Jusque là tout va bien !
    Enfin je crois :)
    Du moins la fenêtre s'affiche parfaitement et les boutons fonctionnent.

    Ensuite, donc le code pour l'écouter boutons :
    package event;
    
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    import javax.swing.JButton;
    import javax.swing.JLabel;
    
    import vue.*;
    
    
    
    public class EcouteurBouton implements ActionListener {
    
    	private VueQuestionBinaire _fen;
    	private JLabel _lab;
    	
    	
    	public EcouteurBouton (VueQuestionBinaire fen, JLabel lab){
    		this._fen = fen;
    		this._lab = lab;
    	}
    	
    	
    	
    	// Implémentation de l'interface ActionListener
    	public void actionPerformed(ActionEvent e){
    		Object o;
    		o = e.getSource();
    		JButton b = ((JButton)o);
    		String s = b.getLabel();
    		
    		JButton bt = null;
    		
    		if(s.equals(this._fen.sPos)) {
    			int[] res = new int[3];
    			
    			res = this._fen.getNbVotes();
    			res[0]++;
    			res[2]++;
    			this._fen.setNbVotes(res[0], res[1], res[2]);
    			this._fen.setResTrue();
    		}
    		if(s.equals(this._fen.sNeg)) {
    			int[] res = new int[3];
    			
    			res = this._fen.getNbVotes();
    			res[1]++;
    			res[2]++;
    			this._fen.setNbVotes(res[0], res[1], res[2]);
    			this._fen.setResTrue();
    		}
    		if(s.equals(this._fen.sRes)) {
    			int[] res = new int[3];
    			
    			res = this._fen.getNbVotes();
    			int tmp1, tmp2, tmp3;
    			
    			tmp1 = res[0];
    			tmp3 = res[2];
    			double resPos = (tmp1/tmp3)*100;
    			System.out.println("Votes POS : "+tmp1+"/"+tmp3+" - Res : "+resPos);
    			
    			tmp2 = res[1];
    			double resNeg = (tmp2/tmp3)*100;
    			System.out.println("Votes NEG : "+tmp2+"/"+tmp3+" - Res : "+resNeg);
    			
    			this._lab.setText("Votes positifs : "+resPos+"%. Votes négatifs : "+resNeg+"%.");
    			
    		}
    		if(s.equals(this._fen.sQuit)) {
    			System.exit(0);
    		}
    	}
    }
    



    Le main :
    import appli.metier.*;
    import utilitaires.*;
    import vue.VueQuestionBinaire;
    
    public class TestQB 
    {
    	
    	public static void main(String[] args) 
    	{
    		VueQuestionBinaire vqb ;
    		QuestionBinaire qb ;
    		
    		qb = new QuestionBinaire ("Comment allez vous ?", 10, 12, "Bien !", "Pas bien !");
    		
    		vqb = new VueQuestionBinaire ("Répondre à une question", qb);
    		vqb.setVisible (true);
    		
    	}	
    }
    


    Si jamais vous copiez/collez ce code et testez mon appli :
    - appuyez plusieurs fois sur le bouton de réponse positive puis résultats, tout marche ça donne 100% POSITIFS et 0% NEGATIFS. Pour l'inverse, cela fonctionne aussi.

    - appuyez sur positif puis négatifs le nombre de fois que vous voulez et dans l'ordre que vous le voulez, cela affichera 0% POSITIFS et 0% NEGATIFS.

    Là est mon soucis. Je ne comprends pas pourquoi il ne veut pas faire les calculs qui fonctionnent très bien normalement. Et il affiche 0% lorsque j'ai cliqué au moins une fois sur chaque boutons (positif et négatif).

    Alors voilà, je voudrais savoir comment résoudre cette énigme. Comme vous le voyez j'ai essayé d'ajouter des variables (car au départ tout mon calcul était entre les +.....+ du System.out.println()).

    Donc si quelqu'un est capable de m'aider, je le remercie d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      19 décembre 2009 à 14:30:03

      Bon il y a du nombreux problèmes dans ton code, surtout niveau design.

      -Copier les éléments d'un tableau dans des variables tmp ne sert à rien. Si ton but était de rendre le code plus lisible c'est une bonne idée mais alors il faut donner de bon nom de variable et pas tmp1 2 et 3 qui n'indique pas ce que sont ces variables.

      -Pourquoi avoir une méthode qui retourne toute les votes dans un tableau? Ca ne sert à rien et c'est pas très compréhensible, voici un meilleurs design (je met évidement pas tout le code mais juste de quoi donner l'idée)
      public class VueQuestionBinaire extends JFrame {
      
      private int nbPos = 0; //déjà faut pas mettre des static pour rien
      private int nbNeg = 0; //ne jamais mettre de static sauf si y a vraiment une raison
      private int nbTot = 0;//et que tu sais ce que tu fais
      
      public void incrementeVotePositif(){
      nbPos++;
      nbTot++;
      }
      public void incrementeVoteNegatif(){
      nbNeg++;
      nbTot++;
      }
      public String getresultat(){
      //calculer le résultat ici
      //suivant les besoins, soit directement construire le String
      //soi faire plusieurs méthode qui renvoi les nombres voulu
      //et ensuite construire ton String(utile si tu souhaite après affichier le résultat de plusieurs manière)
      return ...;
      }
      

      De manière général une bonne class doit être une abstraction, donc tu ne doit pas accéder à son contenu, le modifier depuis l'extérieur et seter ce nouveau contenu, mais plutot appeler des méthodes qui feront ca en interne. Sinon pourquoi faire de l'orienté objet.

      int[] res = new int[3];//ca sert à rien de faire un new puisque c'est ta méthode qui renvoit le tableau
      res = this._fen.getNbVotes();
      mais bon de toute facon si tu suit mes conseil ce code devrait disparaître


      - ET maintenant le source de ton problème, enfin j'ai pas tester mais je pense que c'est ca:

      double resPos = (tmp1/tmp3)*100;

      tmp1 et tmp3 sont des entiers, donc si tmp1 vaut 5 et tmp3 vaut 6, alors 5/6=0 parce que c'est une division entière.
      Il faut donc écrire ((double)tmp1/tmp3)*100 ou tmp1*100/tmp3, si tu te contentes d'être au pourcent près



      • Partager sur Facebook
      • Partager sur Twitter

      Problème d'opération ??...

      × 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