GuiTextField password



  • Bonjour a vous communauté de MFF.

    Je voudrais que Graphiquement, mon texte dans le GuiTextField soit remplacé par des étoiles.

    J'ai essayé de faire un .replaceAll mais du coup sa remplace le mdp ^^

    Je voudrais que ce soit graphique qu'on ne voit pas le mot de passe.

    Merci de votre aide !



  • Salut, tu peux créer une classe custom de GuiTextField, et override la méthode drawTextBox.
    Ou bien garder la classe vanilla mais à chaque appel de keyTyped sur ton GuiScreen, t'isoles les caractères tappés (normalement dans ton GuiTextField) vers un autre String, pour les remplacer ensuite par des étoiles.
    Voilà tu as ces deux solutions qui se valent selon moi.



  • Je pense faire le custom field

    Envoyé de mon ZTE BLADE V7 LITE en utilisant Tapatalk


    @'Plaigon':

    Salut, tu peux créer une classe custom de GuiTextField, et override la méthode drawTextBox.
    Ou bien garder la classe vanilla mais à chaque appel de keyTyped sur ton GuiScreen, t'isoles les caractères tappés (normalement dans ton GuiTextField) vers un autre String, pour les remplacer ensuite par des étoiles.
    Voilà tu as ces deux solutions qui se valent selon moi.

    Car je sais pas comment isoler chaque caractère vers un string ..



  • Déjà il faut récupérer le caractère tappé à l'appel de keyTyped. Tu as deux paramètres, peut-être que l'un peut intéresser.
    Pour ce qui est de la concaténation, cela fait partie des bases, revois les si tu n'y arrives pas.



  • @'Plaigon':

    Déjà il faut récupérer le caractère tappé à l'appel de keyTyped. Tu as deux paramètres, peut-être que l'un peut intéresser.
    Pour ce qui est de la concaténation, cela fait partie des bases, revois les si tu n'y arrives pas.

    Donc quelque chose comme ça

    @SubscribeEvent
        public void onEvent(KeyInputEvent event)
        {
        // Si vous remplacez isPressed() par getIsKeyPressed()
        // Le chat sera inondé à chaque fois que vous presserez la touche
    
        if(keyBindTest.isPressed())
        {
        keyTestTyped(); // Traitement de la touche
        }
        }
    
        private void keyTestTyped()
        {
        // La touche vient d'être appuyé !!
        Minecraft.getMinecraft().thePlayer.addChatComponentMessage(new ChatComponentText("lol, it works"));
        }
    


  • Non, revois mes messages et dis moi si j'ai parlé une seule fois de l'event KeyInputEvent ?



  • @'Plaigon':

    Non, revois mes messages et dis moi si j'ai parlé une seule fois de l'event KeyInputEvent ?

    protected void keyTyped(char par1, int par2)
        {
            super.keyTyped(par1, par2);
            this.textfield.textboxKeyTyped(par1, par2);
        }
    

    Je suppose que c'est "char par1" ?
    mais que faire avec



  • C'est le caractère tappé. A toi de voir quoi en faire avec toutes les instructions précédentes 😉



  • @'Plaigon':

    C'est le caractère tappé. A toi de voir quoi en faire avec toutes les instructions précédentes 😉

    [font=monospace, monospace  ```java
    protected void keyTyped(char par1, int par2)
       {%(#000000)[
           super].keyTyped(par1, par2);
           this.textfield.textboxKeyTyped(par1, par2);
           if ([color=#000000textfield].isFocused()) {%(#000000)[
               pass ]+= par1;
           }
           for (int p = 0; p < [color=#000000textfield].getText().length(); p++) {
               //mask += "*";
           }
           //[color=#000000textfield].setText(mask);%(#000000)[
           textfield].setText(pass);

    %(#666600)[}

    %(#272a34)[[font=monospace, monospace]Mais pour le masquer, je le fait comment ?]


  • C'est déjà un bon début. A ta place désormais, je retirerais le textBoxKeyTyped car celui va sinon écrire le caractère tappé à la suite du champ de texte. La boucle for n'est pas utile. Et dans ta condition, je rajouterai à la suite de ta concaténation ceci:
    textfield.writeText(Character.toString('*'));

    EDIT: Mais du coup ce n'est pas optimal dans la mesure où si tu souhaites déplacer le curseur avec les flèches directionnelles, ou même effacer un caractère, la fonction GuiScreen#textboxKeyTyped ne pourra désormais plus gérer ce genre de fonctionnalités. Le mieux aurait donc été de créer une classe du genre GuiPasswordField heritant de GuiTextField, mais avec des fonctions surchargées. En revanche si tu souhaites rester avec le plan B, tu peux faire une suite de conditions checkant le keyCode de la touché pressée pour handle les différent cas de figures précisés + haut.

    EEDIT: Et au passag, évite de spam plusieurs dév de deux forums différent pour un même problème. On a recours à ce genre de "technique" quand on n'obtient aucune réponse. Mais dans le cas présent, j'estime que je suis suffisamment actif pour t'aider alors ne va pas déranger ceux D'IC, surtout qu'ils ne risquent pas d'avoir la même patience que moi mdrr



  • @'Plaigon':

    C'est déjà un bon début. A ta place désormais, je retirerais le textBoxKeyTyped car celui va sinon écrire le caractère tappé à la suite du champ de texte. La boucle for n'est pas utile. Et dans ta condition, je rajouterai à la suite de ta concaténation ceci:
    textfield.writeText(Character.toString('*'));

    EDIT: Mais du coup ce n'est pas optimal dans la mesure où si tu souhaites déplacer le curseur avec les flèches directionnelles, ou même effacer un caractère, la fonction GuiScreen#textboxKeyTyped ne pourra désormais plus gérer ce genre de fonctionnalités. Le mieux aurait donc été de créer une classe du genre GuiPasswordField heritant de GuiTextField, mais avec des fonctions surchargées. En revanche si tu souhaites rester avec le plan B, tu peux faire une suite de conditions checkant le keyCode de la touché pressée pour handle les différent cas de figures précisés + haut.

    EEDIT: Et au passag, évite de spam plusieurs dév de deux forums différent pour un même problème. On a recours à ce genre de "technique" quand on n'obtient aucune réponse. Mais dans le cas présent, j'estime que je suis suffisamment actif pour t'aider alors ne va pas déranger ceux D'IC, surtout qu'ils ne risquent pas d'avoir la même patience que moi mdrr

    Le truc c'est que je ne sais pas comment faire le gui custom pour ça… donc normal que j'essaie de demandé de l'aide un peut partout ^^.
    Et avec le code que tu ma donné ça ne fonctionne pas sa met le mdp+* juste après.
    Pour créer le GuiTextFieldCustom je sais pas du tout comment faire ça..



  • C'est bien ce que je te reproche de demander de l'aide à tout le monde, MFF suffit amplement, tu ne penses pas ?!
    Refilé ta méthode keyTyped stp



  • @'Plaigon':

    C'est bien ce que je te reproche de demander de l'aide à tout le monde, MFF suffit amplement, tu ne penses pas ?!
    Refilé ta méthode keyTyped stp

    
    protected void keyTyped(char par1, int par2)
       {
           super.keyTyped(par1, par2);
           if (textfield.isFocused()) {
               pass += par1;
           }
           for (int p = 0; p < textfield.getText().length(); p++) {
               //mask += "*";
           }
           //textfield.setText(mask);
           textfield.setText(pass);
           textfield.writeText(Character.toString('*'));
    
       } 
    


  • Le setText à virer, la boucle for idem et le writeText dans le if.



  • @'Plaigon':

    Le setText à virer, la boucle for idem et le writeText dans le if.

    Oui mais du coup quand je met mon mot de passe bha sa met juste les étoiles… donc..



  • C'est un peu le principe d'un champ de mot de passe



  • @'Plaigon':

    C'est un peu le principe d'un champ de mot de passe

    Non mais de base le mot de passe il doit pas changé, jhe te parle en jeu quand je fait la commande, sa fait login ********



  • Le mot de passe est contenu dans le String pass, pour le moment il ne changerai donc aucunement. Si tu souhaitais un préfixe "/login", il faudrait clairement une classe custom.


  • Rédacteurs

    En vrai fait un copié/collé de la classe GuiTextField parce que là tu t'embête vraiment trop pour rien. Et après tu remplaces la fonction draw de la classe par celle-ci :

    
    public void drawTextBox()
    {
    if (this.getVisible())
    {
    if (this.getEnableBackgroundDrawing())
    {
    drawRect(this.x - 1, this.y - 1, this.x + this.width + 1, this.y + this.height + 1, -6250336);
    drawRect(this.x, this.y, this.x + this.width, this.y + this.height, -16777216);
    }
    
    // La fonction affiche le texte contenu dans la variable this.text, donc il suffit de changer le contenu de cette variable juste avant de l'afficher puis remettre sa velur
    int tempText = this.text; // On stock le mot de passe entrée par l'utilisateur dans une variable temporaire
    this.text = ""; // On vide le texte à afficher
    for(int i = 0; i < tempText.length; i++) // Pour chaque caractère du mot de passe
    this.text += "*"; //On ajoute une étoile au texte à afficher
    
    // Le code va s'occuper d'afficher le contenu de this.text comme pour le GuiTextField de base, or ici on a remplacé chaque caractère par une étoile
    
    int i = this.isEnabled ? this.enabledColor : this.disabledColor;
    int j = this.cursorPosition - this.lineScrollOffset;
    int k = this.selectionEnd - this.lineScrollOffset;
    String s = this.fontRenderer.trimStringToWidth(this.text.substring(this.lineScrollOffset), this.getWidth());
    boolean flag = j >= 0 && j <= s.length();
    boolean flag1 = this.isFocused && this.cursorCounter / 6 % 2 == 0 && flag;
    int l = this.enableBackgroundDrawing ? this.x + 4 : this.x;
    int i1 = this.enableBackgroundDrawing ? this.y + (this.height - 8) / 2 : this.y;
    int j1 = l;
    
    if (k > s.length())
    {
    k = s.length();
    }
    
    if (!s.isEmpty())
    {
    String s1 = flag ? s.substring(0, j) : s;
    j1 = this.fontRenderer.drawStringWithShadow(s1, (float)l, (float)i1, i);
    }
    
    boolean flag2 = this.cursorPosition < this.text.length() || this.text.length() >= this.getMaxStringLength();
    int k1 = j1;
    
    if (!flag)
    {
    k1 = j > 0 ? l + this.width : l;
    }
    else if (flag2)
    {
    k1 = j1 - 1;
    –j1;
    }
    
    if (!s.isEmpty() && flag && j < s.length())
    {
    j1 = this.fontRenderer.drawStringWithShadow(s.substring(j), (float)j1, (float)i1, i);
    }
    
    if (flag1)
    {
    if (flag2)
    {
    Gui.drawRect(k1, i1 - 1, k1 + 1, i1 + 1 + this.fontRenderer.FONT_HEIGHT, -3092272);
    }
    else
    {
    this.fontRenderer.drawStringWithShadow("_", (float)k1, (float)i1, i);
    }
    }
    
    if (k != j)
    {
    int l1 = l + this.fontRenderer.getStringWidth(s.substring(0, k));
    this.drawSelectionBox(k1, i1 - 1, l1 - 1, i1 + 1 + this.fontRenderer.FONT_HEIGHT);
    }
    
    this.text = tempText; // On oublie pas de remettre le mot de passe entré par le joueur comme valeur du GuiTextField pour que le mot de passe soit bien modifié lorsque le joueur tape du texte
    }
    }
    
    

    Le mot de passe est ensuite récupérable via la simple fonction GuiTextField#getText. J'ai pas testé le code mais ça devrait fonctionner.



  • Au moins, on peut être sûr qu'il y aura satisfaction car du code vient de lui tomber du ciel 😉