IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Figer une variable de classe lors de sa déclaration dans une itérative


Sujet :

avec Java

  1. #1
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut Figer une variable de classe lors de sa déclaration dans une itérative
    Bonjour à tous,

    J'ai un petit soucis en Java. Pour faire simple, je dois créer un texte à trous, où les trous sont enfaite des JTextField. Quand on remplis ce JTextField, un évènement se passe en fonction du mot tapé dedans (si c'est le mot attendu, la case devient verte, sinon, elle devient rouge).

    Jusque là tout va bien. Le truc c'est que j'ai genre 100 phrases avec un JTextField chacune. J'ai tout déclaré en dur, et c'est pas très jolie à voir. Je me réoriente donc vers une solution plus "jolie": mettre les questions et leurs réponses dans un fichier XML, et tout créer dans une boucle.

    Pour l'instant, ça ressemble à ça (j'utilise JDOM pour le parsage xml) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Element courant;	
    List listQr = racine.getChildren("qr_enigmes");
    Iterator i = listQr.iterator();
    k = 0;
    courant = (Element)i.next();
    		while(i.hasNext())
    		{	
    			courant.getChild("question").getText();
    			courant.getChild("reponse").getText();
     
    		    lab_eni[k] = new JLabel(courant.getChild("question").getText());
     
    		    rep[k] = new JTextField(10); 
    		    rep[k].addFocusListener(new FocusListener() 
    		    {
    				public void focusGained(FocusEvent e) {}
     
    				public void focusLost(FocusEvent e) 
    				{
    					if (rep[k].getText().equals(courant.getChild("reponse").getText())) 
    					{
    						rep[k].setBackground(new Color(200,245,137));
    						rep[k].setEditable(false);
    						progressBar_enigmes.setValue(progressBar_enigmes.getValue()+2);
     
    					} 
    					else 
    					{ 
    						rep[k].setBackground(new Color(249,134,134));	
    					}
    				}
    			});
     
    		    monPan.add(lab_eni[k]);
    		    monPan.add(rep[k]);
    		    courant = (Element)i.next();
    		    k = k+1;
    Sachant que le fichier XML ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <enigmes> 
    	<qr_enigmes>
    		<question>- Il a les memes parents que moi :</question>
    		<reponse>frere</reponse>
    	</qr_enigmes>
    	<qr_enigmes>
    		<question>- Son metier est de couper les cheveux :</question>
    		<reponse>coiffeur</reponse>
    	</qr_enigmes>
    </enigmes>
    Tout ça me construit bien ce que je veux, visuellement parlant. Seulement, quand l'évènement est invoqué (quand je rentre/sors d'un des JTextField), il me prend la valeur de k à la sortit du while. Fin en gros, si avec le while la variable k est arrivé à 18, quand l'évènement est invoqué il me le fait pour k=18, même si c'était pour la 2nd case (ou k=2 lors de la déclaration de cette case).
    Pour ce qui est de la déclaration de k, je suis obligé de le déclaré au niveau de ma classe, sinon je ne pourrais pas y accéder dans le FocusListener.

    Donc en gros, je souhaiterais savoir comment figer le nom de mes variables au moment de leur déclaration.
    (Je sais pas si j'ai été très clair, mais je vois pas trop comment expliqué ça autrement).

    Merci d'avance !

  2. #2
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    Pour ceux que ça intéresserait, je penses avoir trouvé une solution.
    J'ai changé la boucle de mon code du message précédent par ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    List listQr = racine.getChildren("qr_enigmes");
    for(i=0;i<listQr.size();i++)
    {	 
    	courant = (Element)listQr.get(i);
    	lab_eni[i] = new JLabel(courant.getChild("question").getText());
    	rep[i] = new JTextField(10); 
    	rep[i].addFocusListener(new FocusListener() 
    	{
    		int k = i;
    		String reponse = courant.getChild("reponse").getText();
    		public void focusGained(FocusEvent e) {}
     
    		public void focusLost(FocusEvent e) 
    		{
    			if (rep[k].getText().equals(reponse)) 
    			{
    				rep[k].setBackground(new Color(200,245,137));
    				rep[k].setEditable(false);			  progressBar_enigmes.setValue(progressBar_enigmes.getValue()+2);	
    			} 
    			else 
    			{ 
    				rep[k].setBackground(new Color(249,134,134));
    			}
    		}
           });
    monPan.add(lab_eni[i]);
    monPan.add(rep[i]);
    }
    Et du coup la variable qui est utilisé dans les evenements est fixe, et ça à l'air de fonctionner.
    Bon après si quelqu'un à une solution plus "propre", je suis preneur

  3. #3
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Un solution similaire consiste à la déclarer en final en dehors de ta classe anonyme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    List listQr = racine.getChildren("qr_enigmes");
    for(i=0;i<listQr.size();i++)
    {	 
    	final int k = i;
    	courant = (Element)listQr.get(i);
    	lab_eni[i] = new JLabel(courant.getChild("question").getText());
    	rep[i] = new JTextField(10); 
    	rep[i].addFocusListener(new FocusListener() 
    	{
    		String reponse = courant.getChild("reponse").getText();
    		public void focusGained(FocusEvent e) {}
     
    		public void focusLost(FocusEvent e) 
    		{
    			if (rep[k].getText().equals(reponse)) 
    			{
    				rep[k].setBackground(new Color(200,245,137));
    				rep[k].setEditable(false);			  progressBar_enigmes.setValue(progressBar_enigmes.getValue()+2);	
    			} 
    			else 
    			{ 
    				rep[k].setBackground(new Color(249,134,134));
    			}
    		}
           });
    monPan.add(lab_eni[i]);
    monPan.add(rep[i]);
    }

  4. #4
    Membre du Club Avatar de Freeluvs
    Profil pro
    Inscrit en
    Février 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 78
    Points : 57
    Points
    57
    Par défaut
    Je viens de lire la partie de la FAQ concernant le "final", et ouai en effet, c'est bien ce qu'il me fallait.

    Merci Deaf

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/07/2013, 13h39
  2. Réponses: 2
    Dernier message: 29/08/2012, 11h05
  3. Utiliser la valeur d'un spinner lors de la déclaration d'une variable locale
    Par Jiggazzzzz dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 05/12/2011, 09h31
  4. Réponses: 1
    Dernier message: 31/08/2009, 22h48
  5. Réponses: 4
    Dernier message: 29/06/2008, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo