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.


SommaireAWT et SwingComposants textuels (9)
précédent sommaire suivant
 

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>");
Le composant texte : il est également possible d'utiliser un javax.swing.JTextArea, plus pratique à mettre en place que la version HTML si le texte n'est pas fixé dans le code... Cette solution est néanmoins plus contraignante sur la mise en page et sur la gestion de l'apparence (par défaut le JTextArea n'a pas les mêmes couleurs qu'un JLabel).
(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);
La solution de la brute : empiler deux ou trois JLabel les uns au-dessus des autres devrait faire l'affaire :-).

À noter que la solution avec HTML marche également avec d'autres composants Swing tels que le JButton.

Mis à jour le 24 mars 2002 Baptiste Wicht Clement Cunin

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);

Mis à jour le 1er janvier 2004 Clement Cunin

Awt

Code java : Sélectionner tout
1
2
TextField txt = new TextField (); 
txt.setEchoChar ('*');
Swing

Code java : Sélectionner tout
1
2
JPasswordField txt = new JPasswordField (); 
txt.setEchoChar ('*')

Mis à jour le 5 juin 2002 Johann.Heymes

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.

Mis à jour le 23 mars 2002 Baptiste Wicht d-jo Johann.Heymes

Model-View-Controller Architecture
Exemple d'implémentation de la solution 2
Exemple d'implémentation de la solution 3

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
JFormattedTextField et MaskFormatter (depuis le JDK 1.4)

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("#-##-##-##-###-###-##");
Liste des symboles :

  • # => 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) 
{ 
}
Formatteurs personnalisés

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.

Mis à jour le 20 octobre 2006 bigboomshakala

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] */);
Style déterminé a l'insertion : si le style est connu lors de l'insertion, il faut créer une classe qui hérite de DefaultStyledDecument et redéfinir la méthode insertString(). Exemple pour écrire tout le texte avec le style nomme styleNormal sauf si l'on insère le mot 'HELP' :

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"); 
        }  
}
(Voir l'exemple fourni.)

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);
(Voir l'exemple fourni.)

Mis à jour le 24 mars 2002 Johann.Heymes

Deux solutions possibles :

On peut déplacer le "caret" :

Code java : Sélectionner tout
monTextArea.setCaretPosition(monTextArea.getDocument().getLength ());
On demande au JTextComponent de transmettre à son parent les coordonnées d'un point qui doit être visible.

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) { 
  
}

Mis à jour le 11 juin 2002 Johann.Heymes

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();

Mis à jour le 10 novembre 2002 Clement Cunin

Comment dessiner en Java ?

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);

Mis à jour le 21 décembre 2009 Baptiste Wicht sinpay

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 ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les 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 © 2016 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.

 
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -