FAQ Java GUIConsultez toutes les FAQ
Nombre d'auteurs : 37, nombre de questions : 155, dernière mise à jour : 10 octobre 2015 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci.
- Comment faire un JLabel de plusieurs lignes ?
- Comment faire un JTextArea avec un retour à la ligne automatique ?
- Comment permettre la saisie de mot de passe (texte saisi avec des étoiles) ?
- Comment contraindre la saisie dans un composant texte ?
- Comment utiliser un JFormattedTextField
- Comment avoir un éditeur de texte avec plusieurs styles de mise en page ?
- Comment rendre visible le dernier ajout de texte dans un JTextComponent ?
- Comment obtenir la liste des polices de caractères ?
- Comment aligner un texte dans un JSpinner ?
Le HTML : la plus simple des méthodes pour avoir un texte sur plusieurs lignes est d'utiliser l'interpréteur HTML du JLabel. Pour cela, il faut que le texte soit entouré des balises '<html>' et '</html>'. Ensuite, il faut remplacer les "\n" par des balises '<br>', et le tour est joué !
Code java : | Sélectionner tout |
new JLabel("<html>ligne 1<br>ligne 2<br>etc...</html>");
(Un exemple est disponible en téléchargement)
Code java : | Sélectionner tout |
1 2 3 | JTextArea label = new JTextArea(); label.setText(text); label.setEnabled(false); |
À noter que la solution avec HTML marche également avec d'autres composants Swing tels que le JButton.
Tout simplement en utilisant les méthodes setLineWrap(boolean) et setWrapStyleWord(boolean) de la classe javax.swing.JTextArea.
Code java : | Sélectionner tout |
1 2 3 4 5 6 | /** On souhaite un retour à ligne automatique : */ monTextArea.setLineWrap(true); /** On souhaite que les mots ne soient pas coupés : */ monTextArea.setWrapStyleWord(true); |
Awt
Code java : | Sélectionner tout |
1 2 | TextField txt = new TextField (); txt.setEchoChar ('*'); |
Code java : | Sélectionner tout |
1 2 | JPasswordField txt = new JPasswordField (); txt.setEchoChar ('*') |
Exemple : comment autoriser l'utilisateur à ne saisir que des entiers dans un champ texte. Trois solutions s'offrent à vous :
- écouter les événements ;
- modifier le modèle du composant texte ;
- utiliser la classe javax.swing.JFormattedTextField (dispo seulement depuis le JDK 1.4).
Solution 1, les écouteurs (listener) : il s'agit sûrement des premières solutions auxquelles on pense, mais ce ne sont pas les plus simples à mettre en place ni les plus jolies. Je parle ici évidemment de java.awt.event.KeyListener ou javax.swing.event.DocumentListener et autres du même genre. Pour moi, ces solutions sont des solutions de rattrapage, car techniquement elles permettent uniquement de nous informer d'un changement. Or, si le changement est fait, cela veut donc dire que le « mal » est déjà fait. Ce qui signifie que le composant texte à un moment donné est dans une situation non cohérente. Je m'arrêterai donc là sur ce sujet.
Solution 2, modification du modèle : la notion de modèle provient du design pattern MVC , Model-View-Controller Architecture, le but ici est donc de modifier directement ce que peut contenir un composant texte en ignorant tout le reste. Pour ce faire, il suffit de créer une classe qui dérive du modèle auquel le composant texte est associé. Pour information nous avons :
- JTextField et JTextArea : PlainDocument ;
- JEditorPane et JTextPane : DefaultStyledDocument.
Ces deux classes implémentent toutes deux l'interface javax.swing.text.Document qui définit entre autres les méthodes insertString(int, java.lang.String, javax.swing.text.AttributeSet) et remove(int, int). Il suffit donc de créer une classe qui dérive de la classe modèle appropriée et de redéfinir la ou les méthodes nécessaires. Notons que ces deux méthodes insertString et remove seront appelées automatiquement par les classes de Sun à chaque ajout ou suppression de chaîne. Notre redéfinition doit donc avoir pour but de valider ou non l'action. Par conséquent, on notera que l'intégrité du composant texte n'est jamais bafouée (voir démo ci-dessous).
Solution 3, la classe JFormattedTextField : une toute nouvelle classe fait son apparition dans la version 1.4 du JDK. L'exemple ici est très réducteur de ses capacités, mais la prise en main est peut-être moins évidente. En tout cas, le résultat est là et il est même largement meilleur... Regardez l'exemple :-)
À noter qu'on peut aussi utiliser un MaskFormatter à un JFormattedTextField. Pour cela, il vous suffit de créer un nouveau MaskFormatter avec le masque de votre choix, puis d'installer ce mask sur votre JFormattedTextField via la méthode install de MaskFormatter. Cela donne encore plus de fonctionnalités à ce composant.
JFormattedTextField et formats standard (depuis le JDK 1.4)
La classe JFormattedTextField possède un constructeur prenant en paramètre un Format. Cela permet de spécifier un format au champ de saisie.
Classes dérivées de Format :
- DateFormat
- MessageFormat
- NumberFormat
Code java : | Sélectionner tout |
1 2 3 4 5 6 | // champ de saisie depourcentages JFormattedTextField champPourcentage = new JFormattedTextField(NumberFormat.getPercentInstance()); // champ de saisie de dates JFormattedTextField champDate = new JFormattedTextField(DateFormat.getDateInstance()); // Dec 31, 2000 JFormattedTextField(DateFormat.getDateInstance(DateFormat.SHORT)); // 12/31/2000 |
Un MaskFormatter convient aux motifs à taille fixe (n° de téléphone, n° de sécurité social, n° de série...).
Code java : | Sélectionner tout |
1 2 3 4 5 | // pour un n° de téléphone en France new MaskFormatter("## ## ## ## ##"); // pour un n° de sécurité social new MaskFormatter("#-##-##-##-###-###-##"); |
- # => un chiffre
- ' => un caractère d'échappement pour include un symbole dans le motif
- U => une lettre (les minuscules sont changées en majuscules)
- L => une lettre (les majuscules sont changées en minuscules)
- A => un chiffre ou une lettre
- ? => une lettre
- * => tout caractère
- H => tout caractère hexadécimal (0-9, a-f ou A-F)
On peut limiter les caractères valides en appelant l'une des méthodes suivantes : setValidCharacters(), setInvalidCharacters().
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | // Champ de saisie d'une case d'un échiquier (A1 à H8) try { MaskFormatter mask = new MaskFormatter("U#"); mask.setValidCharacters("ABCDEFGH12345678"); JFormattedTextField noteField = new JFormattedTextField(mask); } catch (ParseException e) { } |
Pour personnaliser un formateur, il faut créer une classe dérivée de DefaultFormatter et redéfinir les méthodes.
- String valueToString (Object value) throws ParseException
- Object StringToValue (String text) throws ParseException
La première méthode transforme la valeur du champ en chaîne qui s'affiche.
La deuxième méthode analyse le texte tapé et le transforme en objet.
Quel composant choisir ? Vous avez le choix entre JTextPane et JEditorPane. En effet, ce sont les seuls à utiliser comme "Model" (Cf Model-View-Controller Architecture) un composant dérivant de AbstractDocument et implémentant l'interface StyledDocument.
Mise en page à la création : si la mise en page est fixée lors de la création du document, il suffit de récupérer le Model du composant texte.
Code java : | Sélectionner tout |
1 2 3 | JTextPane monComposantTexte = new JTextPane (); DefaultStyledDocument doc = (DefaultStyledDocument) monComposantTexte.getDocument (); doc.insertString (offset, "texte à ajouter", /** [un style d'écriture] */); |
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** Redéfini pour choisir l'effet de style à utiliser */ public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { try { /** si le texte inséré est égal à HELP le texte s'écrit * avec le style "styleOp" */ if ( str.equals ("HELP") ) { super.insertString (offs, str, getStyle ("styleOp")); } else { /** Sinon le texte est écrit avec le style "styleNormal" */ super.insertString (offs, str, getStyle ("styleNormal")); } } catch (BadLocationException e) { System.out.println ("Tuuuttt erreur Insere"); } } |
Modifier le style après l'insertion : pour cela il faut soit récupérer le Model du composant Texte, soit créer sa propre classe dérivant de DefaultStyledDocument.
Code java : | Sélectionner tout |
1 2 3 | JTextPane monComposantTexte = new JTextPane (); DefaultStyledDocument doc = (DefaultStyledDocument) monComposantTexte.getDocument (); doc.setCharacterAttributes (positionDeDepart, longueur, style, true); |
Deux solutions possibles :
On peut déplacer le "caret" :
Code java : | Sélectionner tout |
monTextArea.setCaretPosition(monTextArea.getDocument().getLength ());
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 | try { int longueur = monTextArea.getDocument().getLength(); Rectangle rectangle = monTextArea.modelToView(longueur); monTextArea.scrollRectToVisible(rectangle); } catch (javax.swing.text.BadLocationException err) { } |
Avant d'utiliser une police de caractères, il est fortement recommandé de vérifier qu'elle est présente sur le système. Les systèmes alternatifs disposent rarement des mêmes polices que Windows.
Code java : | Sélectionner tout |
1 2 3 4 5 | GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); /** Liste de toutes les polices : */ Font[ ] polices = environment.getAllFonts(); /** Liste des noms de toutes les polices : */ String[ ] nomPolices = environment.getAvailableFontFamilyNames(); |
Pour aligner un texte dans JSpinner, il faut d'abord récupérer son textField. Ensuite, il faut modifier l'alignement de ce dernier. Voici un exemple avec tous les alignements possibles :
Code java : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | JSpinner spinner = new JSpinner(); JTextField textField = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); //Aligner texte à gauche textField .setHorizontalAlignment(JTextField.LEFT); //Aligner texte à droite (par défault) textField .setHorizontalAlignment(JTextField.RIGHT); //Aligner le texte au centre textField .setHorizontalAlignment(JTextField.CENTER); |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.