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 :

Problèmes avec la fonction enum


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut Problèmes avec la fonction enum
    Bonjour à tous !!!

    Voila, j'ai un problème avec nos amis les enums ,

    Je me sert de cette fonction pour traduire un soft en 2 langues, mais voila quand je test la fonction de traduction il me renvoie l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    Il me semble me souvenir que cela veut dire que j'ai une variable non-initialiser quelque part mais je n'en suis pas, sur, et si c'est bien sa l'explication je n'arrive pas a voir laquelle .

    Pour pouvoir vous aidez à m'aider je vous mets les codes que j'ai actuellement.

    Le premier est la fonction qui va me servir à traduire le reste (je vous ai enlevez tout ce qui avait attrait à la conception graphique)
    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
    public class ChooseLanguageUI implements Displayable, ActionListener {
     
    		Translation tr;
    		final private JPanel ui = new JPanel(new MigLayout());
    		final private JButton closeButton = new JButton(Translation.CLOSEBUTTON.setEnglish());
    		final private JButton startButton = new JButton(Translation.STARTBUTTON.setEnglish());
    		final private JRadioButton rbE = new JRadioButton("English");
    		final private JRadioButton rbF = new JRadioButton("French");
    		final private CloseListener<?> cl;
     
     
    		public void actionPerformed(ActionEvent evt) {
    			final Object src = evt.getSource();
     
    			if (src == startButton) {
    				if(rbE.isSelected()==true){
    					tr.setEnglish();
    					cl.closePerformed(null, null);
    				}
    				else if (rbF.isSelected()==true){;	
    					tr.setFrench();
    					cl.closePerformed(null, null);
    				}
    			}
    			else if (src == closeButton) {
    				cl.closePerformed(null, null);	
    			}
    		}
     
    		public JRadioButton getRbE() {
    			return rbE;
    		}
     
    		public JRadioButton getRbF() {
    			return rbF;
    		}
    }

    Celui-ci est le fichier qui contient la classe de type enum
    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
    package omm_accesskeys.core;
     
    public enum Translation {
     
    	CLOSEBUTTON("Close", "Annuler"),
    	STARTBUTTON("select","selectionner"),
    	;
     
    	private String en;
    	private String fr;
     
    	private Translation(String en, String fr) {
    		this.en = en;
    		this.fr = fr;
    	}
     
    	public String setFrench()  {
    		return this.fr;
    	}
    	public String setEnglish(){
    		return this.en;
    	}
    }

    Merci a vous

    Melom

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Melom Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    Il me semble me souvenir que cela veut dire que j'ai une variable non-initialiser quelque part mais je n'en suis pas, sur, et si c'est bien sa l'explication je n'arrive pas a voir laquelle .
    Regardez le stacktrace de l'erreur, la ligne où vous déférencez le null est indiquée.

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Le compilateur m'indique que c'est sur l'appelle de la fonction setFrench() quand je choisit de la version française ou setEnglish quand je demande la verson anglaise.

    Les appels sont dans le premier fichier, et le corps dans le deuxième.

    Melom

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tr est donc null, c'est là votre problème.

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Merci

    Je risque d'être un petit peu embêtant en demandant pourquoi ?

    En effet tr est de type Translation, il devrait par défaut valoir les paramètres qui se trouvent dans le constructeur, comment cela est-il possible ?

    Et vu que cela semble être le cas, existe-t-il un tutoriel ou quelque chose du genre duquel je puisse m'inspirer pour trouver solution a mon problème ?

    Melom

    ps : pas la peine de me vouvoyez je suis largement plus jeune que vous ^^

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Dans ChooseLanguageUI je ne vois nulle part où vous initialisez tr!

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 28
    Par défaut
    Citation Envoyé par Melom Voir le message
    En effet tr est de type Translation, il devrait par défaut valoir les paramètres qui se trouvent dans le constructeur, comment cela est-il possible ?
    Comme dit par tchize_, le problème est justement qu'il n'y a pas d'initialisation de tr. Je ne vois pas de trace du constructeur dont tu parles.

    Ajoute un constructeur à ta classe ChooseLanguageUI, lequel prendra en argument un objet Translation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ChooseLanguageUI (Translation language)
    {
         this.tr = language;
    }
    Au passage, attention, le membre final private CloseListener<?> cl n'est pas initialisé non plus.

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Le problème reste le même : quand j'initialise l'objet tr par cette ligne :
    J'aurais toujours droits à la même erreur, aux mêmes endroits.

    Il m'aurait plus de faire tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Translation tr = new Translation();
    Mais par la définition même des enums je n'en ai pas le droit.

    Melom

  9. #9
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Oui, désolé, j'avais oublié qu'il s'agit d'enums, donc pas de new. C'est pourquoi j'ai effacé mon message. j'allais faire une autre réponse, mais tu l'as déjà eue :

    Donne une valeur à ta variable tr. Ça ne sera pas automatiquement la première des valeurs possibles d'un tr, il faut lui donner celle que tu veux.

    EDIT : Ce qui d'ailleurs m'amène à penser qu'une méthode en setTruc() n'a rien à faire dans un enum, d'une part, et que vu qu'elle ne fait rien que renvoyer une valeur ça ne sert à rien de l'appeler sans récupérer cette valeur, d'autre part. Et qu'une méthode poutr obtenir une valeur, c'est un getTruc(), pas un un setTruc(), pour finir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tr DOIS prendre un valeur. En l'occurence ici, vous devez faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Translation tr = Translation.CLOSEBUTTON
    //ou
    Translation tr = Translation.STARTBUTTON

    de toutes façon, la logique de votre code est bancale:

    Translation est un enum, par définition immutable, donc les méthode setXXXX n'ont pas lieu d'être dessus

    vous mettez dedans un setter (setFrench()) mais il ne set rien du tout, c'est en réalité un getter (nom mal choisi donc)

    vous n'utiliser pas la valeur de retour de tr.setFrench(), donc cet appel est inutile.

    J'ai du mal a comprendre ce que vous essayez d'obtenir avec votre setFrench/setEnglish sur le coup.

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    Dans une vrai application pour les traductions on utilise les ResourceBundle càd des fichier .properties qui contiennent des clés avec la traduction dans la locale suffixé dans le nom de ce fichier .properties.
    Une enum c'est une classe qui contient un ensemble fini de singleton donc tu ne pourra rajouter d'autre instances à cette enum. En spécifiant un enum comme type à une variable tu dois l'affecter par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyEnum maVariable = MyEnum.value1
    si on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enum MyEnum {value1, value2}

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    vous mettez dedans un setter (setFrench()) mais il ne set rien du tout, c'est en réalité un getter (nom mal choisi donc)
    Effectivement, désoler, j'avais vu le problème sous un autre angle ...


    Citation Envoyé par tchize_ Voir le message
    J'ai du mal a comprendre ce que vous essayez d'obtenir avec votre setFrench/setEnglish sur le coup.
    En fait j'essaie, grâce à l'aide de enum, de passer d'une version anglaise d'un programme, à une version française de ce même programme.

    Citation Envoyé par hibour;
    Dans une vrai application pour les traductions on utilise les ResourceBundle
    Il est vrai que cela doit être très utile mais je n'ait pas le choix, je doit utiliser enum ...

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Il va falloir vous décider

    Soit l'enum contient les traduction (un enum: une paire de traduction)
    Soit l'enum permet de choisir la langue (avec un enum appelé FRANCAIS, et l'autre ANGLAIS par exemple), mais dans tous les cas n'essayez pas de faire faire tout le travail à un seul enum qui stockerais des données d'état, ce ne serait plus un enum, un enum étant immuable!

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2010
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 6
    Par défaut
    Sa marche !!!

    Comme vous le disiez ce n'est pas possible de tout passer par l'enum, alors j'ai créer des variables STATIC dans une classe Parameter pour faire le choix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Parameter {
    	public static  int CURRENTLANGUAGE = 0;
    	public  static final int ENGLISH=0;
    	public  static final int FRENCH=1;
    }
    Puis dans mon classe enum il a suffit d'importer la classe Parameter de faire :
    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
    public enum Translation {
     
    	ADDDRAWING("Add a new drawing", "Ajouter un nouveau dessin"),
    	ADDMATERIAL("Add a new material","Ajouter un nouveau matériel"),
    	ADDPROJECT("Add a new project","Ajouter un nouveau projet"),
     
    	private String en;
    	private String fr;
     
    	private Translation(String en, String fr) {
    		this.en = en;
    		this.fr = fr;
    	}
     
    	public String toString()  {
    		return Parameter.CURRENTLANGUAGE == Parameter.ENGLISH ? en : fr;
    	}
    }
    Je récupère la langue avec la variable CURRENTLANGUAGE. Si je veux tout afficher en francais je doit mettre :
    Et en Français :
    et à la place des chaines de caractères pour utiliser l'enum il faut mettre par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Translation.ADDMATERIAL.toString();
    Merci a tous

    Melom

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

Discussions similaires

  1. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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