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

Langage Java Discussion :

Ne peut être référencé à partir d'un contexte statique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut Ne peut être référencé à partir d'un contexte statique
    Bonjour,

    J'ai une question concernant l'annotation du compilateur "Non-static method 'getTablePrinc()' cannot be referenced from a static context" et l'appel d'une variable (tablePrinc) ou méthode (getTablePrinc() ) se trouvant dans un répertoire (donnéesdentrée/FichierDonnéesDEntrée.java), comme argument d'une méthode se trouvant dans un autre répertoire (monotone.EnergElectr_TranchePuiss.java).

    Je ne vois pas où il trouve ce 'static context';

    Pour mon application, la structure de mes répertoires et fichiers est :
    (P: Symbole d'un 'package' - F: Symbole d'un fichier java)
    P: choixpuissmach
    _____F: <quelques fichiers Java>
    P: choixpuissmach.donnéesdentrée
    _____F: FichierDonnéesDEntrée.java
    _____F: <quelques autres fichiers Java>
    P: choixpuissmach.monotone
    _____F: EnergElectr_TranchePuiss.java
    _____F: <quelques autres fichiers Java>
    Rem.1: On notera que dans la fenêtre 'Projects' de tous les IDE de NetBeans (le mien : v.7.3.1), le fait de créer des nouveaux 'packages' ('donnéesdentrée' et 'monotone') dans un package existant (choixpuissmach) fait que les nouveaux packages apparaissent
    non pas dans le package original (choixpuissmach) et indentés
    mais alignés au package original et aux doubles noms : 'choixpuissmach.donnéesdentrée' et 'choixpuissmach.monotone'.

    Rem.2: Le fichier 'EnergElectr_TranchePuiss' contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    import choixpuissmach.donnéesdentrée.FichierDonnéesDEntrée;
    Cet import est souligné en jaune : "Unsed import", alors que je tente d'utiliser sa méthode 'JTable getTablePrinc()' à l'aide de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            dresserListeFréquConsoPuiss(
                    choixpuissmach.
                    donnéesdentrée.FichierDonnéesDEntrée.getTablePrinc());
    Le compilateur de l'IDE ne souligne que 'choixpuissmach' en rouge : Erreur :
    Non-static method 'getTablePrinc()' cannot be referenced from a static context.
    alors que ni la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class EnergElectr_TranchePuiss extends JScrollPane
    , ni sa méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private void initComponents()
    où se trouve l'appel de la méthode 'dresserListeFréquConsoPuiss()' ne sont 'static'.
    Je ne vois pas comment me débloquer.

    J'ai tenté d'inverser la situation en créant un appel à la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public ArrayList dresserListeFréquConsoPuiss(JTable tablePrinc)
    (implémentée dans 'EnergElectr_TranchePuiss') depuis la classe initiale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public class FichierDonnéesDEntrée extends JScrollPane implements ActionListener
            ...
            @Override public void actionPerformed(ActionEvent e)
                ...
                   choixpuissmach.monotone.EnergElectr_TranchePuiss.dresserListeFréquConsoPuiss(tablePrinc);
    Ici aussi, le compilateur de l'IDE ne souligne que 'choixpuissmach' en rouge : Erreur :
    Non-static method 'dresserListeFréquConsoPuiss(JTable)' cannot be referenced from a static context.
    et je ne vois aucun 'static context' ...

    Une âme empathique aurait une idée d'investigation ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Je suppose que tu as créé une méthode getTablePrinc() dans ta classe FichierDonnéesDEntrée (évites les caractères spéciaux, dont les accentués dans les noms de packages, de classes, ou de variables, ça t'évitera pas mal de galères), comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class FichierDonnéesDEntrée {
     
    public JTable getTablePrinc() {
    ...
    }
     
    }
    Quand tu appelles une méthode de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NomDeClasse.nomDeMethode();
    il s'agit forcément de méthode statique, ce que te dis le compilateur dans ton cas : que tu essayes d’accéder à une méthode non-statique comme si c'était une méthode statique, alors que ce n'est pas le cas.


    Pour accèder à une méthode (sous entendu, non-statique), on instancie la classe, et on appelle la méthode sur l'instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FichierDonneesDEntree instance = new FichierDonneesDEntree();
    ...
    JTable table = instance.getTablePrinc();
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Bonjour à tous.
    Joël Drigo, merci pour ta réponse - Problème résolu.

    Oui, j'avais créé la méthode 'getTablePrinc()' dans ma classe 'FichierDonnéesDEntrée' comme tu l'indiques, retournant un 'public JTable' ; JTable pour ma 'tablePrinc', qui reste 'private'.

    Quand tu appelles une méthode de cette façon :
    Code : NomDeClasse.nomDeMethode();
    il s'agit forcément de méthode statique, ce que te dis le compilateur dans ton cas : que tu essayes d’accéder à une méthode non-statique comme si c'était une méthode statique, alors que ce n'est pas le cas.
    Confirme-moi stp : En Java, toute variable (publique) appartenant à une autre classe (publique / soit à un autre fichier) peut être accessible au sein d'un autre fichier (pas forcément situé dans le même 'package') en mentionnant sont "path" absolu (pas relatif),
    - soit une fois pour toutes à l'aide d'un import
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import choixpuissmach.donnéesdentrée.FichierDonnéesDEntrée;    // getTablePrinc()
            ...
            dresserListeFréquConsoPuiss(getTablePrinc());
    - soit directement devant la référence à la variable (public tablePrinc ou public getTablePrinc()) comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        dresserListeFréquConsoPuiss(choixpuissmach.donnéesdentrée.FichierDonnéesDEntrée.getTablePrinc());
    Dans les deux cas, le nom 'FichierDonnéesDEntrée' représente la classe appelée (tout comme avec import java.util.ArrayList;, p.ex.) et non la référence à une variable statique. C'est le moyen en Java (et en C++) pour accéder à une propriété ou une méthode de cette classe, publique mais pas forcément statique, n'est-ce pas ?

    Et ces deux classe ne doivent pas avoir un lien de parentée ou d'appartenance directe. Ainsi dans mon cas, c'est la classe et le fichier de départ 'ChoixPuissMach.java' dans le package 'choixpuissmach' qui contient une instanciation des deux classes 'FichierDonnéesDEntrée' (dans 'choixpuissmach.donnéesdentrée') et 'EnergElectr_TranchePuiss' (dans 'choixpuissmach.monotone'). Les instanciations 'tab_FichierDonnéesDEntrée' et 'tab_EnergElectr_TranchePuiss' n'ont au départ aucune relation d'échange de références de certaines de leurs propriétés (p.ex. 'tablePrinc' vers 'tab_EnergElectr_TranchePuiss').

    Néanmoins, tu as eu raison de me faire chercher une instanciation qui n'aurait pas été passée, car c'était le cas dans mon application : tab_EnergElectr_TranchePuiss.
    Ce qui venait troubler la bonne vision d'ensemble dans mon application, c'est qu'un bouton dans un 'Tabbed pane' (FichierDonnéesDEntrée) commande secondairement le lancement d'une méthode dans un tabbedPane (EnergElect_TranchePuiss). De là le fait que je n'avais pas vu que l'instanciation de tab_EnergElectr_TranchePuiss n'avait pas été passée.
    Ce qui suit est la solution qui fonctionne (pour apporter ma modeste contribution au forum) :
    Classe ChoixPuissMach
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        public FichierDonnéesDEntrée tab_FichierDonnéesDEntrée;
        ...
        public EnergElectr_TranchePuiss tab_EnergElectr_TranchePuiss;
        ...
            tab_EnergElectr_TranchePuiss = new EnergElectr_TranchePuiss("Monotone");
            tabScrollPanel2 = tab_EnergElectr_TranchePuiss.getScrollPanel();
            panneauAOngletsPrinc.addTab("Blabla", icon, tabScrollPanel2);
     
            /* 'tab_EnergElectr_TranchePuiss' ne peut être passé au constructeur de la classe
             * 'FichierDonnéesDEntrée' que dès qu'une valeur a été assignée à cette référence. */
            tab_FichierDonnéesDEntrée = new FichierDonnéesDEntrée(pathNomFichier , tab_EnergElectr_TranchePuiss);
            tabScrollPanel1 = tab_FichierDonnéesDEntrée.getScrollPanel();
            panneauAOngletsPrinc.addTab("Bloblo", icon, tabScrollPanel1);
            ...
    Classe FichierDonnéesDEntrée
    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
    import choixpuissmach.monotone.EnergElectr_TranchePuiss;
        ...
        private EnergElectr_TranchePuiss tab_EnergElectr_TranchePuiss;
        ...
        public FichierDonnéesDEntrée(String pathNomFich, EnergElectr_TranchePuiss tab_EnergElectr_TranchePuiss )
        {
            ...
            // Pour pouvoir appeler la méthode 'dresserListeFréquConsoPuiss()'.
            this.tab_EnergElectr_TranchePuiss = tab_EnergElectr_TranchePuiss;
            ...
        }
        ...
        @Override public void actionPerformed(ActionEvent e)
        {   
            ...
            if (e.getSource() == bout_PrepDatasets)
            // <editor-fold defaultstate="collapsed" desc="Bouton Preparation des datasets">
            {   
                ...
                tab_EnergElectr_TranchePuiss.dresserListeFréquConsoPuiss(tablePrinc , tab_EnergElectr_TranchePuiss );
            } else
            ...
        }
     
     
        }
    Classe EnergElectr_TranchePuiss
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public ArrayList<EnergElectr_TranchePuiss.DonnéesQuartHor>[] dresserListeFréquConsoPuiss(JTable tablePrinc, EnergElectr_TranchePuiss tab_EnergElectr_TranchePuiss )
        {   
            ...
    OK au futur pour ta remarque concernant les caractères accentués, bien que je n'ai jamais eu de problème de ce côté, dans aucune de mes applications et qu'elles sont pleines de variables qui en contiennent. Avec NetBeans en tout cas; peut-être aussi avec Eclipse.

    Merci encore.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut
    Citation Envoyé par Chavadam Voir le message
    Confirme-moi stp : En Java, toute variable (publique) appartenant à une autre classe (publique / soit à un autre fichier) peut être accessible au sein d'un autre fichier (pas forcément situé dans le même 'package') en mentionnant sont "path" absolu (pas relatif),
    Raisonne en classes, et packages, pas en fichiers et répertoires, qui ne sont qu'un support physique. Lors de l'exécution du programme, le code java manipule des classes dans des packages.

    Il n'y pas de notion de package relatif. Soit on importe la classe, et elle peut être référencée par son nom simple dans n'importe quelle classe qui en a la visibilité (voir la notion de portée : public, private, protected, default(ou visibilité package)), soit on doit mettre le nom complet, package compris. Lors de l'héritage, la classe héritée à accès aux variables ou méthodes de la classe dont elle hérite, en tenant compte de la visibilité (et, suivant les mêmes règles, ce dont la classe dont elle hérite a héritée elle-même de son parent, et, ainsi de suite, jusqu'à la classe java.lang.Object.

    A noter que l'import statique te permet d'importer des éléments statiques (variables/constantes ou classes).

    Citation Envoyé par Chavadam Voir le message
    C'est le moyen en Java [...] pour accéder à une propriété ou une méthode de cette classe, publique mais pas forcément statique, n'est-ce pas ?
    Une variable statique existe pour toutes les instances d'une classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    package truc.machin.bidule;
    public class LaClasse {
        public static int VARIABLE_STATIQUE=42;
        public int variableNonStatique=33;
    }
    On peut l'invoquer par le nom de de sa classe (qui réprésente, en quelque sorte, "toutes les instances" dans ce cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int var = truc.machin.bidule.LaClasse.VARIABLE_STATIQUE
    Mais on peut l'appeler sur n'importe quelle instance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    truc.machin.bidule.LaClasse instance = new truc.machin.bidule.LaClasse();
    int var = instance.VARIABLE_STATIQUE;
    On ne le fait pas pour éviter les confusions, et d'ailleurs ce sera signalé en warning dans ton IDE.

    Une variable non statique appartient à l'instance : elle ne peut donc être manipulée que par l'instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    truc.machin.bidule.LaClasse instance = new truc.machin.bidule.LaClasse();
    int var = instance.variableNonStatique;
    Impossible de faire ça (ce code ne compilera pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int var = truc.machin.bidule.LaClasse.variableNonStatique;
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Chavadam Voir le message
    OK au futur pour ta remarque concernant les caractères accentués, bien que je n'ai jamais eu de problème de ce côté, dans aucune de mes applications et qu'elles sont pleines de variables qui en contiennent. Avec NetBeans en tout cas; peut-être aussi avec Eclipse.
    Ce n’est pas une question d'IDE, mais d'environnement d'exécution. Si tu diffuses tes programmes, certains pourraient ne pas pouvoir les utiliser. Ou avoir des hiéroglyphes dans la doc de tes API. Cela peut également empêcher de builder tes applications sur un serveur, si jamais il t'arrivait un jour de le faire.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    263
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 263
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    Ce n’est pas une question d'IDE, mais d'environnement d'exécution. Si tu diffuses tes programmes, certains pourraient ne pas pouvoir les utiliser. Ou avoir des hiéroglyphes dans la doc de tes API. Cela peut également empêcher de builder tes applications sur un serveur, si jamais il t'arrivait un jour de le faire.
    OuillOuillOuill ! ... C'est en effet bien autre chose, et parfois important.
    J'écris des applications comme programmeur-amateur ayant une autre spécialité professionnelle et utilisant Java comme d'autres utilisent un tableur. Je n'ai jamais eu la prétention d'écrire des applications destinées à fonctionner sur d'autres ordinateurs, et encore moins de les monter sur un serveur.
    Mais j'admets tout à fait ta remarque.

    Merci encore.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/07/2010, 22h00
  2. Sepi peut-être sur SourceForge
    Par sjrd dans le forum Sepi
    Réponses: 2
    Dernier message: 06/04/2005, 11h41
  3. Réponses: 2
    Dernier message: 10/03/2004, 19h52
  4. question (peut-être idiote) sur les vues
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/03/2003, 11h35

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