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

 Java Discussion :

aide pour les JTextField (ou autre chose)


Sujet :

Java

  1. #1
    Nouveau membre du Club
    aide pour les JTextField (ou autre chose)
    bonjours,

    j'aimerais bien dans mon programme demander à écrire à une personne, j'ai utiliser un JTextField

    je voudrais pouvoir mettre dans mon JTextField une indication de quesqu'il faut mettre à l'interieur mais
    que dès que l'on commence à écrire dedans, les indication parte.

    Dans la même occasion je voudrais aussi
    metre une limite de caractère dans mon JTextField

    merci.

  2. #2
    Membre du Club
    Pou le texte dans le Jtextfield :

    JTextField test = new JTexField ("tes explications");

    Ou aussi un Jlabel, une info bulle....

    Et un petit lien : https://baptiste-wicht.developpez.co...?page=demander

  3. #3
    Nouveau membre du Club
    le problème est que l''explication est concrètement écrite dans le JTextField, moi je veut que ce soit dans le JTextField, il ne faut plus voir les explication une fois qu'on a écrit dans le JTextField.

    comme dans la barre de recherche de google ou c'est écrit "Rechercher sur le web"

  4. #4
    Modérateur

    Oui ben c'est pas de la magie, si tu veux ça programme-le. Quand il devient vide, remets les explications.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Nouveau membre du Club
    C'est bien pour ça que j'ai fait cette discution je ne c'est pas comment faire

  6. #6
    Modérateur

    Salut,

    Le texte qui explique ce qu'on doit saisir dans le champ et qui s'affiche dans le champ s'appelle un placeholder. Il n'est pas supporté nativement par Swing. On peut le gérer comme indiqué ci-avant avec un texte injecté dans le champ et des écouteurs d’événements pour le remettre quand le champ est vidé ou l'enlever quand on commence à saisir, tout ça, mais c'est un peu de la bricole, c'est compliqué à mettre au point (parce qu'il faut gérer le copier/coller aussi, avec la sélection, etc), etc.

    Pour faire ça on peut faire comme ça :
    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
    public class JTextFieldWithPlaceHolder {
     
    	public static void main(String[] args) {
     
    		JTextField textfield = new JTextField() {
     
     
    			private final String placeholder = "Saisir un truc..."; // ça c'est le texte du placeholder
    			private final Color placeholdercolor = Color.BLUE; // ça c'est la couleur du texte (on peut mettre null et ça utilisera la couleur "texte désactivé" (ou ce qu'on veut en modifiant le code)
     
    			  @Override
    			    protected void paintComponent(final Graphics graphics) {
    			        super.paintComponent(graphics);
     
    			        if ( !getText().isEmpty() ) {
    			        	// s'il y a du texte dans le champ, on n'affiche pas le placeholder
    			            return;
    			        }
    			        else if ( placeholder==null || placeholder.trim().isEmpty() ) {
    			        	// rien à afficher
    			            return;
    			        }
     
    			        final Graphics2D g = (Graphics2D) graphics;
    			        g.setRenderingHint(
    			            RenderingHints.KEY_ANTIALIASING,
    			            RenderingHints.VALUE_ANTIALIAS_ON);
    			        g.setColor(placeholdercolor==null?getDisabledTextColor():placeholdercolor);
    			        g.drawString(placeholder, getInsets().left, graphics.getFontMetrics()
    			            .getMaxAscent() + getInsets().top);
    			    }
     
    		};
    		textfield.setColumns(20);
     
    		JFrame demo = new JFrame("Démo");
     
    		JPanel panel = new JPanel(new GridBagLayout());
    		demo.add(panel);
     
    		panel.add(textfield);
     
    		demo.setSize(400, 600);
    		demo.setLocationRelativeTo(null);
     
    		demo.setVisible(true);
     
     
    	}
     
    }


    ça c'est un exemple de principe. On peut faire une classe qui gère ça avec des setters pour changer le texte du placeholder, la couleur etc.

    A noter que les préconisations modernes d'UX déconseillent d'utiliser des placeholders pour plusieurs raisons dont 2 principales :

    • quand il y a une saisie, on ne sait plus savoir quelles sont les indications de saisie, donc on perd une information
    • ça n'est pas accessible, en ce sens que les lecteurs automatiques ne liront jamais cette information (ils lisent plutôt le tooltip) et donc ces indications de saisie ne seront jamais accessibles à un non voyant


    A la place, on préférera carrément juste un texte affiché à côté du champ, ou éventuellement une petite icône (?) avec un tooltip, ou un renvoi sur un html (de documentation), etc. En plus ça permet d'en mettre beaucoup plus, de ne pas être limité par la taille du champ...

    Enfin, ce dont tu parles, quand tu parles de saisie google avec le texte qui se complète c'est autre chose : on appelle ça la complétion. C'est un peu différent : on utilisera un DocumentListener et/ou un DocumentFilter pour programmer ça, parce qu'il faut intercepter et la modifier la saisie pendant qu'elle se fait. Cela peut être plus ou moins compliqué selon le rendu qu'on veut. Tu trouveras des exemples sur le web, voire des composants prêts à l'emploi au sein de bibliothèques : plus souvent sous forme de JComboBox que de JTextField.
    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.

  7. #7
    Nouveau membre du Club
    merci pour ta réponse très complète mais quand je met ton paintCompenent il y a ce message d'erreur:

    "Multiple markers at this line
    - Syntax error on token ")", ; expected
    - Syntax error on token "(", ; expected"

    ce n'est pas la première fois que j'ai ce message d'erreur, je comprend pas.

  8. #8
    Modérateur

    Citation Envoyé par you_kill Voir le message
    merci pour ta réponse très complète mais quand je met ton paintCompenent il y a ce message d'erreur:

    "Multiple markers at this line
    - Syntax error on token ")", ; expected
    - Syntax error on token "(", ; expected"

    ce n'est pas la première fois que j'ai ce message d'erreur, je comprend pas.
    Tu as dû mal copier le source et oublier un morceau. Je viens pour ma part de tester et je n'ai aucune erreur, donc ça ne vient pas du code que je te montre.
    Multiple markers veut dire qu'il y a à priori plusieurs erreurs. L'erreur indiquée provient d'une erreur des syntaxes du type accolade, de parenthèse ou point-virgule qui manque, ou, malheureusement d'éléments qui manquent (on peut avoir ce genre d'erreur par exemple si on oublie un type dans une déclaration de méthode par exemple...)... en tout cas c'est typipquement le type d'erreur qui fait paniquer un IDE et lui fait indiquer une erreur pas à l'endroit où elle se trouve, ou pas sous la bonne qualification...
    Outre la relecture caractère par caractère, la de commentaires sur tout et suppression progressive, recommencer à partir de zéro est probablement le plus simple (sélectionner le source en entier (le lien Sélectionner Tout), Copier par CTRL-C, Recréer une nouvelle classe, remplacer/coller par CTRL-A/CTRL-V).
    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.

  9. #9
    Nouveau membre du Club
    j'ai en faite juste copier

    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
    private final String placeholder = "Saisir un truc..."; // ça c'est le texte du placeholder
    			private final Color placeholdercolor = Color.BLUE; // ça c'est la couleur du texte (on peut mettre null et ça utilisera la couleur "texte désactivé" (ou ce qu'on veut en modifiant le code)
     
    			  @Override
    			    protected void paintComponent(final Graphics graphics) {
    			        super.paintComponent(graphics);
     
    			        if ( !getText().isEmpty() ) {
    			        	// s'il y a du texte dans le champ, on n'affiche pas le placeholder
    			            return;
    			        }
    			        else if ( placeholder==null || placeholder.trim().isEmpty() ) {
    			        	// rien à afficher
    			            return;
    			        }
     
    			        final Graphics2D g = (Graphics2D) graphics;
    			        g.setRenderingHint(
    			            RenderingHints.KEY_ANTIALIASING,
    			            RenderingHints.VALUE_ANTIALIAS_ON);
    			        g.setColor(placeholdercolor==null?getDisabledTextColor():placeholdercolor);
    			        g.drawString(placeholder, getInsets().left, graphics.getFontMetrics()
    			            .getMaxAscent() + getInsets().top);
    			    }
     
    		};


    car j'ai déjà mon JTextField et ma JFrame

  10. #10
    Modérateur

    Oui, m'enfin, si tu copies un bout de code et tu le plaques comme ça dans le tiens, y'a très peu de chances que ça fonctionne. Regarde-bien ce que j'ai écris : j'ai redéfini la méthode paintComponent de la classe JTextField au moment de l'instanciation de mon JTextField. Il faut au moins faire la même chose, ou faire ta propre classe, que tu instancieras directement, genre :

    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
    public class JTextFieldWithPlaceHolder extends JTextField {
     
             private String placeholder; // ça c'est le texte du placeholder
    	private Color placeholdercolor; // ça c'est la couleur du texte 
     
           public void setPlaceHolder(String placeHolder) {
                   this.placeHolder = placeHolder;
                   repaint();
           }
     
           public void setPlaceHolderColor(Color color) {
                   this.placeholdercolor= color;
                   repaint();
           }
     
     
    	  @Override
    	    protected void paintComponent(final Graphics graphics) {
    			        super.paintComponent(graphics);
     
    			        if ( !getText().isEmpty() ) {
    			        	// s'il y a du texte dans le champ, on n'affiche pas le placeholder
    			            return;
    			        }
    			        else if ( placeholder==null || placeholder.trim().isEmpty() ) {
    			        	// rien à afficher
    			            return;
    			        }
     
    			        final Graphics2D g = (Graphics2D) graphics;
    			        g.setRenderingHint(
    			            RenderingHints.KEY_ANTIALIASING,
    			            RenderingHints.VALUE_ANTIALIAS_ON);
    			        g.setColor(placeholdercolor==null?getDisabledTextColor():placeholdercolor);
    			        g.drawString(placeholder, getInsets().left, graphics.getFontMetrics()
    			            .getMaxAscent() + getInsets().top);
    			    }
     
    }


    Et après dans ton code, tu fais, pour instancier le champ :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    JTextFieldWithPlaceHolder field = new JTextFieldWithPlaceHolder();
    field.setPlaceHolder("Saisir un truc...");
    field.setPlaceHolderColor(Color.DARK_GRAY);
    /* ... le reste c'est exactement pareil que pour un JTextField ****/
    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.

  11. #11
    Nouveau membre du Club
    j'ai commencer il y a 1 semaine je commence a me perdre là xD

    dès que je met un PaintCompenent ca met des erreur de partout

  12. #12
    Modérateur

    Bah, c'est sûr qu'au début, surtout au bout d'une semaine, on ne peut pas tout maîtriser. Il y a tout de même des bases à connaître, comme les classes, la façon de les étendre, de redéfinir des méthodes, d'instancier des objets, etc. Ce n'est pas indispensable pour faire des petits programmes, mais si on veut faire des trucs qui ne sont pas supportés par défaut, entre autre, c'est difficile de s'en passer. On peut commencer à apprendre en copiant des bouts de code, mais si on ne comprend pas tout ce qu'on fait, il arrive souvent un moment où les bouts de code ne fonctionnent plus ensemble...

    Pour l'instant, si tu n'y arrives pas, passe-toi des placeholders, ce n'est pas essentiel dans une UI. En plus, je t'ai dit qu'il fallait l'éviter (à lire à ce sujet https://www.nngroup.com/articles/for...-placeholders/).

    Si tu tiens aux placeholders, tu peux aussi faire ton interface en JavaFX, au lieu de Swing. Les TextField JavaFX supportent nativement les placeholders, sauf que ça s'appelle prompttext dans JavaFX.
    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.

  13. #13
    Nouveau membre du Club
    Dac je vais clore le sujet

###raw>template_hook.ano_emploi###