Classe interne

Résolu/Fermé
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014 - 6 mars 2014 à 18:43
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014 - 7 mars 2014 à 22:25
Bonsoir,

j'ai créé une classe interne dont voici le code:

class Bouton1Listener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {			
		    
		if(arg0.getSource() == bouton1){
			//label.setText("Vous avez cliqué sur le bouton 1");
			this.compteur1++;
			label.setText("vous avez cliquer"+this.compteur1+"fois sur le bouton 1");
		}
		}
	}

le problème c'est que eclipse m'indique l'erreur suivante:

compteur1 cannot be resolved or is not a field

sachant que je l'ai déjà déclaré .
Merci.

4 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
6 mars 2014 à 19:01
Tu l'as déclaré mais pas dans la classe interne, or this est l'objet de la classe interne.

Tu pourrais faire
"vous avez cliquer"+compteur1+"fois sur le bouton 1"
qui devrait marcher, ou alors expliciter à quelle classe appartient this, en faisant
MaClasse.this.compteur1
où "MaClasse" est la classe où tu as définis compteur1.
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
7 mars 2014 à 18:19
Merci pour ta réponse

pour la première proposition, le programme a bien fonctionné .
mais pour la seconde j'ai eu le même p
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 mars 2014 à 18:36
Pour la deuxième il faudrait voir plus de code, parce que l'on ne sait pas où est défini compteur1, en tout cas certainement pas dans Bouton1Listener donc this.compteur1 est impossible.
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
7 mars 2014 à 18:49
j'ai essayé les deux cas:
1-

class Bouton1Listener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {			
		    
		if(arg0.getSource() == bouton1){
			private int compteur1=0;
			Bouton1Listener.this.compteur1++;
			label.setText("vous avez cliquer"+compteur1+"fois sur le bouton 1");
		}
		}
	}
	


2-

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Fenetre extends JFrame {
	private Panneau pan = new Panneau();
	//private Bouton bouton = new Bouton("Mon bouton");
	private JButton bouton1=new JButton("bouton 1");
	private JButton bouton2=new JButton("bouton 2");
	private JPanel container = new JPanel();
	JPanel south=new JPanel();
	JLabel label =new JLabel("label");
	private int compteur1=0;
	private int compteur2= 0;
	
	public Fenetre(){
		this.setTitle("Animation");
		this.setSize(300, 300);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		container.setBackground(Color.white);
		container.setLayout(new BorderLayout());
		
		bouton1.addActionListener(new Bouton3Listener());
		bouton1.addActionListener(new Bouton1Listener());
		bouton2.addActionListener(new Bouton2Listener());
		
		south.add(bouton1);
		south.add(bouton2);
		
		//Définition d'une police d'écriture
		Font police = new Font("Tahoma", Font.BOLD, 16);
		//On l'applique au JLabel
		label.setFont(police);
		//Changement de la couleur du texte
		label.setForeground(Color.blue);
		//On modifie l'alignement du texte grâce aux attributs statiques
		//de la classe JLabel
		label.setHorizontalAlignment(JLabel.CENTER);
		
		container.add(label,BorderLayout.NORTH);
		container.add(pan, BorderLayout.CENTER);
		container.add(south, BorderLayout.SOUTH);
		this.setContentPane(container);
		this.setVisible(true);
		/*
		 * //On ajoute le bouton au content pane de la JFrame
		this.getContentPane().add(bouton);
		//Ajout du bouton à notre content pane
		pan.add(bouton);
		this.setContentPane(pan);
		 */
		go();
	}
	
	private void go(){
	  //Les coordonnées de départ de notre rond
	  int x = pan.getPosX(), y = pan.getPosY();
	  //Le booléen pour savoir si l'on recule ou non sur l'axe x
	  boolean backX = false;
	  //Le booléen pour savoir si l'on recule ou non sur l'axe y
	  boolean backY = false;
	  //Dans cet exemple, j'utilise une boucle while
	  //Vous verrez qu'elle fonctionne très bien
	
	   while(true){
	   //Si la coordonnée x est inférieure à 1, on avance
	   if(x < 1)backX = false;
	   //Si la coordonnée x est supérieure à la taille du Panneau moins la taille du rond, on recule
	   if(x > pan.getWidth()-50)backX = true;
	   //Idem pour l'axe y
	   if(y < 1)backY = false;
	   if(y > pan.getHeight()-50)backY = true;
	   //Si on avance, on incrémente la coordonnée
	   if(!backX) pan.setPosX(++x);
	   //Sinon, on décrémente
	   else pan.setPosX(--x);
	   //Idem pour l'axe Y
	   if(!backY) pan.setPosY(++y);
	   else pan.setPosY(--y);
	   //On redessine notre Panneau
	   pan.repaint();
	   //Comme on dit : la pause s'impose ! Ici, trois millièmes de seconde
	
       try {
	       Thread.sleep(3);
	   } 
       catch (InterruptedException e) {
	   e.printStackTrace();
	   }
	   } 
	}
	
	class Bouton1Listener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {			
		    
		if(arg0.getSource() == bouton1){
			//label.setText("Vous avez cliqué sur le bouton 1");
			//private int compteur1=0;
			Bouton1Listener.this.compteur1++;
			label.setText("vous avez cliquer"+Bouton1Listener.this.compteur1+"fois sur le bouton 1");
		}
		}
	}
	
	class Bouton2Listener implements ActionListener{
		public void actionPerformed(ActionEvent e){
		
		if(e.getSource() == bouton2){
			//label.setText("Vous avez cliqué sur le bouton 2");
			compteur2++;
			label.setText("vous avez cliquer"+compteur2+"fois sur le bouton 2");
		}
		}
	}
	
	class Bouton3Listener implements ActionListener {
		public void actionPerformed(ActionEvent f){
			System.out.println("ma classe interne numéro 3 écoute bien le bouton 1");
		}
	}
	
	
	}	         
		


et dans les 2 cas ça n'a pas marché
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
7 mars 2014 à 18:54
Ce n'est pas Bouton1Listener.this qu'il faut mettre, c'est équivalent à this dans ton cas.
Ici c'est Fenetre.this.compteur1 qu'il faut mettre car c'est la classe Fenetre qui définit l'attribut compteur1.
0
estrellas6 Messages postés 36 Date d'inscription vendredi 26 juillet 2013 Statut Membre Dernière intervention 7 mars 2014
7 mars 2014 à 22:25
exacte ...
Merci beaucoup KX.
0