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

avec Java Discussion :

override de setText (JLabel)


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut override de setText (JLabel)
    Bonjour,

    Je cherche à permettre l'affichage du point décimal sous sa forme française ( , ) dans un JLabel. Je pensais donc surcharger les méthodes getText et setText de mon JLabel de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
            public static String MARQUEUR_DECIMAL = ",";
     
            @Override
                public String getText() {
                    return super.getText().replace(MARQUEUR_DECIMAL, ".");
                }
     
            @Override
                public void setText(String texte) {
                    System.out.println(texte.replace(".", MARQUEUR_DECIMAL));
                    super.setText(texte.replace(".", MARQUEUR_DECIMAL));
                }
    Problème :
    Lorsque je test mon objet, j'obtiens un résultat assez déroutant :

    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
    public class Main {
     
        public static void main(String[] args) {
            JFrame a=new JFrame();
            EcranDAffichage ecran = new EcranDAffichage("");
            a.getContentPane().add(ecran);
            a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            a.setSize(220,80);
            a.setVisible(true);
            ecran.setText("0,1");
        }
     
        public static String MARQUEUR_DECIMAL = ",";
     
            public static class EcranDAffichage extends JLabel {
                public EcranDAffichage(String label) {
                    super(label);
                    setHorizontalAlignment(JLabel.RIGHT);
                    setPreferredSize(new Dimension(220, 40));
                }
            @Override
                public String getText() {
                    String texte = super.getText();
                    return texte.replace(MARQUEUR_DECIMAL, ".");
                }
     
            @Override
                public void setText(String texte) {
                    System.out.println(texte.replace(".", MARQUEUR_DECIMAL));
                    super.setText(texte.replace(".", MARQUEUR_DECIMAL));
                    repaint();
                }
            }
     
    }
    Le println me renvoie "0,1"
    Le JLabel m'affiche "0.1"...

    Merci de votre aide

  2. #2
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    le paint de JLabel n'utiliserait t'il pas le getText ??? Si tu a les .java du jdk c'est à aller vérifier.
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Ca c'est fort possible. Mais si tu n'as pas les sources .java comme tu redéfinies la méthode getText(), tu peux mettre une trace ou un point d'arrêt en déboggant

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Ben... Probablement, puisqu'en mettant mon override de getText en commentaire, ça marche...


    Est-ce que je suis le seul à trouver aberrant le fait que paint utilise la méthode getText qui est publique, non final, et surtout, getteur ! C'est à dire qu'il est justement susceptible d'être modifié pour s'adapter aux besoins d'entrée/sortie de l'utilisateur !

    Enfin bon... Bref. Quels sont mes moyens de contrer ça? Laisser tomber la surcharge de getText et remplacer tous les getText de mon code par un getTextFormaté(), un truc du genre? Une autre idée?

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Perso, je ne vois pas ce qui te dérange :

    Dans getText(), tu transformes les ',' en '.'
    Dans setText(), tu fais les l'inverse : tu transformes les '.' en ','

    JLabel étant un objet, sans creuser plus, à mon avis il fonctionne comme tout objet respectant la norme de l'encapsulation. A savoir, a un attribut de type String, et lorsques tu fais un setText(), il écrit dans cette variable et getText() lit la variable. Donc si tu transformes les points en virgule, il n'y a pas de raison que de faire le chemin inverse dans la méthode getText().

  6. #6
    Membre éprouvé Avatar de Lady
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mars 2003
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Santé

    Informations forums :
    Inscription : Mars 2003
    Messages : 678
    Points : 909
    Points
    909
    Par défaut
    Sinon tu peut pas transformer le String en float ? tu aura alors le . ou la , en fonction de paramètre local de ton appli ...
    Informaticienne le jour, créatrice de bijoux la nuit (https://www.facebook.com/La-Fée-Chro...07539656306271) et maman à plein temps !

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Dans getText(), tu transformes les ',' en '.'
    Dans setText(), tu fais les l'inverse : tu transformes les '.' en ','
    Je ne suis pas d'accord :

    Comme précisé précédemment, paint utilise getText. Au final, si j'essaye d'écrire "0,1", avec ta méthode, il va faire :

    setText("0.1")
    - transforme "0.1" en "0,1"
    - appelle paint() -> getText() -> transforme "0,1" en "0.1" -> affiche "0.1" dans le JLabel

    C'est ce qu'il se passe dans mon exemple (Cf premier post)

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Citation Envoyé par Sharcoux Voir le message
    Je ne suis pas d'accord :

    Comme précisé précédemment, paint utilise getText. Au final, si j'essaye d'écrire "0,1", avec ta méthode, il va faire :

    setText("0.1")
    - transforme "0.1" en "0,1"
    - appelle paint() -> getText() -> transforme "0,1" en "0.1" -> affiche "0.1" dans le JLabel

    C'est ce qu'il se passe dans mon exemple (Cf premier post)
    Donc setText() appelle paint ?
    Pour quelle raison getText() transforme les ',' en '.' ?

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Donc setText() appelle paint ?
    Pas directement, mais de toute façon, on ne voit pas le résultat de setText avant l'appel de paint().

    Pour quelle raison getText() transforme les ',' en '.' ?
    Pour garder la compatibilité avec les commandes du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Double.valueOf(ecran.getText()).doubleValue()
    qui jonchent le code

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Points : 532
    Points
    532
    Par défaut
    Alors, tu devrais faire une autre méthode getContain par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Double.valueOf(ecran.getTContain()).doubleValue()
    Ne pas redéfinir getText()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @Override
            public String getContain() {
                return super.getText().replace(MARQUEUR_DECIMAL, ".");
            }

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Sinon tu peut pas transformer le String en float ? tu aura alors le . ou la , en fonction de paramètre local de ton appli ...
    J'ai essayé de mettre ça en place, mais le marqueur utilisé est toujours le "."
    Comment puis-je changer cela?

    (très rapidement)
    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 static class EcranDAffichage extends JLabel {
                public EcranDAffichage(String label) {
                    super(label);
                    setHorizontalAlignment(JLabel.RIGHT);
                    setPreferredSize(new Dimension(220, 40));
                }
     
            @Override
                public void setText(String texte) {
                    System.out.println(texte);
                    super.setText(texte.equals("") ? "" : ""+Float.valueOf(texte).floatValue());
                    repaint();
                }
            }

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 442
    Points : 417
    Points
    417
    Par défaut
    Alors, tu devrais faire une autre méthode getContain par exemple :
    Oui, c'est ce que j'avais pensé aussi :

    Quels sont mes moyens de contrer ça? Laisser tomber la surcharge de getText et remplacer tous les getText de mon code par un getTextFormaté(), un truc du genre?
    Du coup, je me suis rabattu sur cette méthode.

    Merci

  13. #13
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Enfin bon, quelque part, il suffit d'ajouter un nouveau set() à côté du nouveau get().
    'Faut être logique, les méthodes existantes sont là pour qu'on s'en serve, pas pour qu'elles fassent des trucs qui n'ont rien à voir avec leur fonction d'origine.

    Idéalement je me créerais un nouveau composant FilteredJLabel qui masque le JLabel originel au lieu d'en hériter, mais c'est plus facile à dire qu'à faire. Les deux nouvelles méthodes, c'est plus réaliste.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Utiliser setText (JLabel) dans une methode static
    Par Fahelis dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 21/05/2014, 22h53
  2. [Java] JLabel setText() saut de ligne
    Par GyZmoO dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 09/05/2007, 21h57
  3. JLabel, soucis lors d'un setText dessus.
    Par Djobird dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 25/04/2007, 15h37
  4. setText() ne fonctionne pas sur un JLabel
    Par TheBAT dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 06/01/2007, 12h11
  5. [Look and feel] Texte des JLabels en gras
    Par aliasjcdenton dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 26/01/2006, 11h49

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