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

JavaFX Discussion :

Nombre de caractères dans une textbox


Sujet :

JavaFX

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 122
    Points : 66
    Points
    66
    Par défaut Nombre de caractères dans une textbox
    Bonjour,

    Est-il possible de bloquer le nombre de caractères que peut rentrer un utilisateur dans une textbox en javaFX? Et si oui comment?

    Merci beaucoup d'avance pour vos réponse.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    Personne ne peut m'aider? J'essaie, j'essaie mais je n'y arrive pas

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Points : 409
    Points
    409
    Par défaut
    Ca devrait t'aider un petit peu
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    public class StringBox extends TextBox {
     
        public var nbMaxChar: Number = 4;
        override var focusTraversable = false;
     
        function getStyle(color: String): String {
            "-fx-background-color: "
            "{color}, -fx-text-box-border, -fx-control-inner-background;";
        }
     
        override var columns= 6;
     
        var str: String = bind rawText on replace {
            def nb = rawText.length();
            set = nb <= nbMaxChar;
        }
     
        public var set: Boolean = true on replace {
            if (set) {
                style = getStyle("green")
            } else {
                style = getStyle("red");
            }
        };
        public var onChange: function (str: String);
     
        override var action = function(): Void {
            if(set)
                onChange(text);
        }
    }
    function run() {
        var val: String;
        Stage {
            title: "StringBox"
            scene: Scene {
                width: 350 height: 150
                content: [
                    HBox {
                        nodeVPos: VPos.CENTER
                        spacing: 10
                        content: [
                            StringBox {
                                onChange: function(pval: String): Void {val = pval}
                            }
                            Label { text: bind "{val}"}
                        ]
                    }
                ]
            }
        }
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    Ok merci beaucoup de ta réponse même si ça correspond pas exactement à ce que je voulais faire.

    Voilà comment je me suis pris pour bloquer le nombre de caractère à 4 dans ma textbox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    textbox_annee = javafx.scene.control.TextBox {
                layoutX: 271.0
                layoutY: 146.0
                columns:45
                text:""
     
                onKeyPressed: function (e: KeyEvent): Void {
                    def nb = textbox_annee.rawText.length();
                    if(nb >= 4)
                    {
                        textbox_annee.deletePreviousChar();
                    }
                }    
             };
    Quand pensez-vous?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    Ou sinon j'ai une autre question.

    Est-ce que c'est possible lorsqu'on a tapé le nombre de caractères requis dans une textbox de passer automatiquement à une autre?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 64
    Points : 75
    Points
    75
    Par défaut
    J'y travaillais... vu que c'est un besoin pour le moins courant !
    Ma version consiste à créer une variante de la TextBox.
    J'ai d'ailleurs anticipé ton second besoin : il est possible de restreindre à la saisie de nombres seulement (ou autre chose, cela peut être flexible).
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    class RestrictiveTextBox extends TextBox
    {
        public-init var maxLen = 10;
        public-init var bDigitsOnly = true;
     
        init
        {
            columns = maxLen;
        }
     
        override function replaceSelection(replacingText: String): Void
        {
            // Find out what portion of text is replaced
            var pos1 = Math.min(dot, mark);
            var pos2 = Math.max(dot, mark);
            // We cannot change parameters... :-(
            var rt = replacingText;
            if (bDigitsOnly)
            {
                // Let regex do the job for us... Not efficient but that's answer to user input, performance isn't critical
                rt = rt.replaceAll("\\D+", "");
            }
            // The expected result
            var newText = "{rawText.substring(0, pos1)}{rt}{rawText.substring(pos2)}";
            // Are we exceeding the limit?
            if (newText.length() > maxLen)
            {
                // Yes, compute how much
                var diff = newText.length() - maxLen;
                // We are already at max
                if (diff >= rt.length())
                    return;	// Just don't insert it
                // Truncate the input to fit in the box
                rt = rt.substring(0, diff);
            }
            // Insert the perhaps truncated string
            super.replaceSelection(rt);
        }
    }
     
     
    var input: RestrictiveTextBox;
    Stage
    {
        title: "Test Forum"
        scene: Scene
        {
            width: 200
            height: 100
            content: input = RestrictiveTextBox
            {
                maxLen: 8
                font: Font { size: 36 }
            }
        }
    }
    Désolé pour les commentaires en anglais, c'est une habitude...

    Remarques sur ton code :
    - Il faudrait if (nb > 4), pas >= 4 (example : taper 4 chars, puis flèche gauche)
    - Quoique... Le problème est que tu traites rawText qui n'est pas mis à jour au moment de l'évènement.
    - Apparemment, le "coller" (paste) ne génère pas cet évènement...

  7. #7
    Membre averti

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Points : 409
    Points
    409
    Par défaut
    C'est marrant on a à peu près tous les mêmes besoins....

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2009
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 64
    Points : 75
    Points
    75
    Par défaut
    Voilà la réponse à ta deuxième question.
    Je vais ajouter une validation, je pense (histoire d'éviter de taper 66 dans le jour ou le mois).
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    class RestrictiveTextBox extends TextBox
    {
        public-init var maxLen = 10;
        public-init var bDigitsOnly: Boolean;
        public-init var filter: function (repl: String): String;
        public-init var onFull: function (): Void;
     
        function DigitsOnly(repl: String): String
        {
            // Let regex do the job for us... Not efficient but that's answer to user input, performance isn't critical
            repl.replaceAll("\\D+", "");
        }
     
        init
        {
            columns = maxLen;
            if (bDigitsOnly)
            {
                // A common case
                filter = DigitsOnly;
            }
        }
     
        override function replaceSelection(replacingText: String): Void
        {
            // Find out what portion of text is replaced
            def pos1 = Math.min(dot, mark);
            def pos2 = Math.max(dot, mark);
            // We cannot change parameters... :-(
            var rt = replacingText;
            if (filter != null)
            {
                rt = filter(rt);
            }
            // The expected result
            var newText = "{rawText.substring(0, pos1)}{rt}{rawText.substring(pos2)}";
            // Are we exceeding the limit?
            if (newText.length() > maxLen)
            {
                // Yes, compute how much
                var diff = newText.length() - maxLen;
                // We are already at max
                if (diff >= rt.length())
                    return;	// Just don't insert it
                // Truncate the input to fit in the box
                rt = rt.substring(0, diff);
            }
            // Insert the perhaps truncated string
            super.replaceSelection(rt);
            if (rawText.length() == maxLen and onFull != null)
            {
                onFull();
            }
        }
    }
     
    def formFont = Font { size: 24 }
    def inputDay: RestrictiveTextBox = RestrictiveTextBox
    {
        maxLen: 2
        bDigitsOnly: true
        onFull: function (): Void { inputMonth.requestFocus() }
        font: formFont
    }
    def inputMonth: RestrictiveTextBox = RestrictiveTextBox
    {
        maxLen: 2
        bDigitsOnly: true
        onFull: function (): Void { inputYear.requestFocus() }
        font: formFont
    }
    def inputYear: RestrictiveTextBox = RestrictiveTextBox
    {
        maxLen: 4
        bDigitsOnly: true
        onFull: function (): Void { valButton.requestFocus() }
        font: formFont
    }
    def valButton: Button = Button
    {
        text: "OK", font: formFont,
        onKeyPressed: function (e: KeyEvent): Void { valButton.action() }
        action: function (): Void
        {
            println("{inputDay.text}/{inputMonth.text}/{inputYear.text}");
        }
    }
    def dateInput = HBox
    {
        spacing: 10
        content: [ inputDay, inputMonth, inputYear, valButton ]
    }
     
    Stage
    {
        title: "Test Forum"
        scene: Scene
        {
            width: 300
            height: 100
            content: dateInput
        }
    }
    inputDay.requestFocus();
    (Tiens, c'est mon cinquantième message, je suis enfin "Membre du Club"... )

  9. #9
    Membre averti

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Points : 409
    Points
    409
    Par défaut
    Bienvenue dans le club alors

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    Ok merci beaucoup à vous deux pour votre aide

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 122
    Points : 66
    Points
    66
    Par défaut
    PhiLho je suis entrain d'étudier ton code.

    Est-ce que tu peux m'expliquer ce que fais exactement ce bout de code?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // The expected result
    var newText = "{rawText.substring(0, pos1){rt}{rawText.substring(pos2)}";
    Et aussi là :p
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     if (newText.length() > maxLen)
            {
                /** Oui on calcule de combien on dépasse */
                var diff = newText.length() - maxLen;
     
                /** Nous sommes déjà au max */
                if (diff >= rt.length())
                    return;	// On ne l'insert pas
                // Tronquer l'entrée pour s'adapter à la boîte
                rt = rt.substring(0, diff);
            }

Discussions similaires

  1. Calcul d'un nombre de caractères dans une chaîne
    Par Thekiller dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2010, 23h21
  2. [Excel] Nombre de caractères dans une plage
    Par fred014 dans le forum Delphi
    Réponses: 20
    Dernier message: 02/03/2007, 21h32
  3. Réponses: 10
    Dernier message: 31/12/2006, 12h35
  4. Réponses: 2
    Dernier message: 17/08/2006, 12h36
  5. limite du nombre de caractères dans une requete
    Par pheno82 dans le forum Access
    Réponses: 3
    Dernier message: 01/06/2006, 22h12

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