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

Entrée/Sortie Java Discussion :

Classes dans 2 fichiers séparés d'un même projet


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut Classes dans 2 fichiers séparés d'un même projet
    Bonjour,

    Toujours dans ma suite de test pour apprendre java, j'ai encore une question.

    J'ai créé une classe pour initialiser mes JTextField quand je clique sur le bouton Création et çà marche.

    Je voulais mettre cette classe dans un autre fichier.java pour ne pas surcharger mon fichier de base.

    J'ai donc créé un fichier InitialisationEcran.java dans le même projet et dans lequel j'ai mis ma classe, et j'ai cette erreur à chaque setText :

    "No enclosing instance of the type DecritFenetre is accessible in scope"

    Eléments de la classe DecritFenetre

    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
     
    public class DecritFenetre {
    ....
    ....
       private JLabel labelNom;
       private JTextField saisieNom;
    ....
       private JButton boutonCreate;
    ....
    ....
       public DecritFenetre () {
    ....
          labelNom = new JLabel ("Nom : ");              
          panneauHaut.add(labelNom);
          saisieNom = new JTextField(25);              
          panneauHaut.add(saisieNom);
    ....
          boutonCreate = new JButton("Création");
          boutonCreate.addActionListener((ActionListener) new InitialisationEcran());
          panneauBouton.add(boutonCreate);
    ....
    ....
       }
    }
    La classe InitialisationEcran

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
     
    // Pour initialisation des zones
    public class InitialisationEcran  implements ActionListener {  
       public void actionPerformed (ActionEvent e) { 
         //System.out.println("Création d'une personne");
         DecritFenetre.this.saisieNom.setText("Votre nom");   
         DecritFenetre.this.saisiePrenom.setText("Votre prénom");
    ....
         DecritFenetre.this.saisieNom.requestFocus();
       }
    }
    Que je mette la déclaration des JTextField en private ou en public, j'ai toujours la même erreur à chaque setText, à savoir :

    "No enclosing instance of the type DecritFenetre is accessible in scope"

    A noter quand la classe InitialisationEcran fait parti du fichier où se trouve la classe DecritFenetre tout marche bien, je n'ai pas d'erreur.

    Pouvez vous m'aider à résoudre ce problème et me donner l'explication ?

    Merci d'avance.
    Cordialement.

  2. #2
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Salut
    est ce que la classe se trouve -t-elle a l´interieur de la classe: et encore la classe devrait etre declarer sans l´accesseur public.
    et a l´interieur, tu peux faire tout simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     saisieNom.setText("Votre nom");   
         saisiePrenom.setText("Votre prénom");
         saisieNom.requestFocus();
    Eric

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 632
    Points
    21 632
    Par défaut
    DecritFenetre.this signifie en gros "l'instance en cours de la classe DecritFenetre."
    Quand tu fais ça à l'intérieur de la classe DecritFenetre, c'est clair : l'instance en cours de la classe DecritFenetre, c'est l'instance de DecritFenetre qui a été créée pour exécuter le code dans lequel tu te trouves.
    Mais ailleurs que dans la classe DecritFenetre, ça ne veut rien dire. Où ça, une "instance en cours de la classe DecritFenetre ?" Il n'y en a pas !

    Ce qu'il faut, c'est que ton InitialisationEcran sache sur quel DecritFenetre il doit agir. Et pour ça, il faut le lui dire.
    Le plus simple, ce serait d'ajouter un private DecritFenetre fenetre; dans ta classe InitialisationEcran, et un constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public InitialisationEcran(DecritFenetre fenetre) {
      this.fenetre = fenetre;
    }
    Il ne te reste plus qu'à remplacer les DecritFenetre.this par des fenetre.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Pour répondre à jeffray03, quand ma classe InitialisationEcran est dans la classe DecritFenetre, tout marche bien.

    Pour thelvin, quand je rajoute le constructeur à ma classe InitialisationEcran

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class InitialisationEcran  implements ActionListener {  
       private DecritFenetre fenetre;
       public InitialisationEcran(DecritFenetre fenetre) {                 
         this.fenetre = fenetre;
       }
       public void actionPerformed (ActionEvent e) { 
          fenetre.this.saisieNom.setText("Votre nom");                  
    ...
       }
    }
    Je rajoute DecritFenetre en parametre de l'appel de la classe comme ceci :

    boutonCreate.addActionListener((ActionListener) new InitialisationEcran(DecritFenetre));

    et j'ai l'erreur : DecritFenetre cannot be resolved to a variable

    Merci des réponses.
    Cordialement.

  5. #5
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    ton appel se fera comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boutonCreate.addActionListener((ActionListener) new InitialisationEcran(this));
    et ca va marcher
    Eric

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Oui çà marche,

    C'est donc la classe elle même, par this, qu'on passe en paramètre.

    Super, merci beaucoup.
    Bonne journée.

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 566
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 632
    Points
    21 632
    Par défaut
    Pas une classe, un objet. this désigne l'instance en cours. (Ou l'objet en cours si tu préfères.)

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2013
    Messages : 73
    Points : 40
    Points
    40
    Par défaut
    Ok merci de la précision car toutes ces notions sont nouvelles pour moi.

    Merci encore et bonne journée.

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

Discussions similaires

  1. Déclarer une classe dans des fichiers séparés
    Par Heriquet dans le forum Langage
    Réponses: 2
    Dernier message: 20/01/2010, 10h17
  2. Réponses: 2
    Dernier message: 12/04/2006, 20h48
  3. Sauvegarder/Lire une classe dans un fichier
    Par Rodrigue dans le forum C++
    Réponses: 10
    Dernier message: 10/09/2005, 14h12
  4. Réponses: 4
    Dernier message: 10/02/2005, 16h10
  5. [C#] [.NET] Lecture d'une classe dans un fichier
    Par niPrM dans le forum Windows Forms
    Réponses: 4
    Dernier message: 18/05/2004, 08h57

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