Classe interne

Résolu
estrellas6 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   -  
estrellas6 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   -
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
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 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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   Statut Membre Dernière intervention  
 
exacte ...
Merci beaucoup KX.
0