La création d'un composant directement à partir de la classe codice_1 nécessite de définir une méthode pour redessiner le composant quand il est visible.
Ce chapitre décrit comment le faire en détails.
Le dessin d'un composant Swing est effectué par la méthode publique codice_2.
Cette méthode délègue le travail à trois autres méthodes protégées appelées dans l'ordre suivant :
Cet ordre assure que les composants contenus soit affichés au-dessus du composant.
Pour définir l'apparence du composant, une sous-classe ne doit redéfinir que la méthode codice_3.
Celle-ci doit éviter de dessiner dans la zone définie par les marges de type codice_5 qui est réservée aux bords (codice_10).
Contexte graphique.
Un objet de classe codice_11 est passé aux méthodes d'affichage du composant.
Il s'agit du contexte graphique, gérant les attributs courants de dessin (couleur, style des lignes, police de caractères, transformations...) et possédant des méthodes de tracé de formes, de texte, d'images...
La classe réelle du contexte graphique passé aux méthode d'affichage est codice_12 possédant des méthodes supplémentaires améliorant l'affichage en 2D.
Il est donc nécessaire de convertir l'objet fourni pour pouvoir appeler ces méthodes avancées.
Attributs courants de dessin.
Le contexte graphique possède des accesseurs de lecture et écriture pour les attributs de dessin à utiliser par les prochaines méthodes appelées :
Attributs supplémentaires ajoutés par la classe codice_12 :
Exemple :
@Override
protected void paintComponent(Graphics graphics)
 Graphics2D g = (Graphics2D)graphics;
 g.setColor(Color.BLUE);
// ... dessiner en bleu
 g.setColor(Color.WHITE);
// ... dessiner en blanc
 g.setStroke(new BasicStoke(1.5f));
// ... dessiner des lignes d'un pixel et demi d'épaisseur
Dessin de formes.
Dans les exemples suivants, g représente le contexte graphique de classe codice_11.
Les formes fermées possèdent à la fois une méthode de tracé du contour et une méthode de tracé de la forme remplie.
Dessin de forme quelconque.
L'interface codice_47 définit les méthodes communes des formes pour tester l'appartenance d'un point ou d'un rectangle, tester si la forme intersecte un rectangle, obtenir le rectangle englobant, et obtenir un itérateur de chemin parcourant le contour de la forme.
Ce dernier groupe de méthodes est utilisé pour le dessin de la forme.
Différentes classes du package codice_50 implémentent cette interface.
Celles dont le nom se termine par "2D" sont des classes abstraites possédant deux sous-classes concrètes statiques internes appelées codice_51 et codice_52 permettant d'utiliser des coordonnées de type codice_53 et codice_54 respectivement.
Dessin de texte.
Les méthodes de tracé de texte utilisent la couleur et la police de caractères courantes du contexte graphique.
Les coordonnées spécifiées sont celles du point du début de ligne (à gauche pour le sens d'écriture de gauche à droite, ou à droite pour l'autre sens) situé au niveau de la ligne de base des caractères.
Police de caractères.
La police de caractères utilisée est celle définie par la méthode codice_94 du contexte graphique.
Elle est initialisée avec celle assignée au composant.
Gras, italique, soulignement et barré.
Les styles gras et italiques sont gérés par la classe codice_95 (constantes PLAIN, BOLD, ITALIC, BOLD_ITALIC).
Le soulignement doit être géré par le code de dessin après ou avant avoir tracé le texte.
La classe codice_95 fournit des informations pour le soulignement (distance et épaisseur de trait) via une instance de la classe codice_97.
Le code ci-dessous affiche un texte souligné, en exploitant ces informations et en utilisant l'objet codice_98 pour mesurer le texte et obtenir la longueur de la ligne de soulignement du texte.
String texte_souligne = "Voici comment souligner le texte."
int tx = 10, ty = 20;
g.drawString(texte_souligne, tx, ty);
FontMetrics fm = g.getFontMetrics();
int tw = fm.stringWidth(texte_souligne);
LineMetrics lm = g.getFont().getLineMetrics(texte_souligne, g.getFontRenderContext());
float line_offset = lm.getUnderlineOffset();
float line_thickness = lm.getUnderlineThickness();
int ly = (int)(ty+line_offset + line_thickness /2); // Position
g.setStroke(new BasicStroke(line_thickness)); // Épaisseur
g.drawLine(tx, ly, tx+tw, ly);
Le style barré utilise le même principe en exploitant les informations retournées par les méthodes codice_99 et codice_100.
Dans le code précédent, il suffit de remplacer les valeurs affectées aux variables codice_101 et codice_102 :
float line_offset = lm.getStrikethroughOffset();
float line_thickness = lm.getStrikethroughThickness();
Les styles souligné et barré ne sont pas gérés directement par la classe codice_95 car il s'agit d'éléments graphiques (lignes) séparés du texte, pouvant avoir une couleur différente du texte, ou une épaisseur différente de celle indiquée par la classe codice_97.
Afficher une image.
Le contexte graphique possède plusieurs variantes de la méthode codice_105 permettant d'afficher une image (instance de codice_106) :
Avec ces méthodes, les pixels transparents laissent voir ce qui était dessiné avant.
Paramètres communs :
Exemple :
// Image chargée auparavant, en dehors de toute méthode paint, par exemple :
URL url_fond = new URL("https://upload.wikimedia.org/wikipedia/commons/a/a6/VST_image_of_the_Hercules_galaxy_cluster.jpg");
Image image_fond = ImageIO.read(url_fond);
g.drawImage(image_fond, 10, 10, null);
Ces méthodes possèdent une variante acceptant une couleur à afficher comme couleur de fond pour les images transparentes.
Composant transparent.
Par défaut, un composant est opaque, ce qui signifie qu'il doit dessiner toute la zone rectangulaire correspondant à sa taille.
Si la méthode codice_7 ou la méthode codice_124 ne dessine pas toute la zone, pour laisser paraître le fond du contenant (un composant non rectangulaire, comme un bouton arrondi par exemple), des artifacts peuvent apparaître de manière sporadique ou non car Swing réutilise le même contexte graphique pour peindre plusieurs composants.
Dans ce cas, il ne faut pas oublier de déclarer le composant comme transparent pour indiquer qu'il faut un contexte graphique propre pour peindre le composant, dans le constructeur de la classe du composant :
setOpaque(false);
Qualité de l'affichage.
Par défaut, les algorithmes de dessin des méthodes du contexte graphique privilégient la vitesse de rendu à la qualité.
La méthode codice_125 de la classe codice_12 permet de changer différentes options pour améliorer la qualité.
Le paramètre codice_127 est un dictionnaire associant des clés définies par les constantes codice_128 de la classe codice_129 à des valeurs définies par les constantes codice_130.
Quand les paramètres de qualité ne changent pas, il est recommandé de créer le dictionnaire une seule fois, comme dans l'exemple suivant :
protected static final HashMap<Key, Object> QUALITY_HINTS =
 new HashMap<RenderingHints.Key, Object>();
static
 QUALITY_HINTS.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
 QUALITY_HINTS.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
 QUALITY_HINTS.put(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
 QUALITY_HINTS.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
 QUALITY_HINTS.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
 QUALITY_HINTS.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
 QUALITY_HINTS.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
Ce dictionnaire est ensuite utilisable dans la méthode d'affichage du composant :
@Override
protected void paintComponent(Graphics graphics)
 Graphics2D g = (Graphics2D)graphics;
 g.addRenderingHints(QUALITY_HINTS);
// ... dessin du composant avec qualité améliorée
Propriétés générales de qualité.
Les propriétés générales de qualités s'appliquent quand aucune autre propriété équivalente plus spécifique n'est applicable.
Qualité des lignes.
Une partie des propriétés de qualité concerne le tracé des lignes par les méthodes dessinant un contour : codice_24, codice_25, codice_39, codice_137...
Cela concerne les méthodes dont le nom commence par codice_22 sauf codice_105, codice_140, codice_141 et codice_88, codice_143, codice_92.
Qualité du texte.
Trois autres propriétés de qualité concerne le tracé de texte, qu'il soit sous forme de chaîne de caractère (codice_88), d'un tableau d'octets (codice_143) ou d'un tableau de caractères (codice_92).
Le réglage de l'antialiasing du texte dont le nom de la valeur contient LCD est réservé aux écrans LCD ou assimilés où les pixels voisins sont tellement proches qu'il est possible que la composante bleue du pixel se mélange à la rouge du pixel voisin.
Ce mélange permettant d'augmenter artificiellement la densité de pixels est la technique utilisée pour l'antialiasing LCD du texte, avec différentes variantes selon la disposition des composantes de couleur composant les pixels de l'écran.
La valeur à utiliser dépend donc du modèle de l'écran.
Dans l'image ci-dessus, l'antialiasing de texte est codice_153 : H pour Horizontal, RGB représentant l'ordre des composants des pixels de gauche à droite : rouge, vert, bleu.
La couleur rouge borde le côté gauche des lettres en noir pour se mélanger au fond blanc, tandis que du bleu borde le côté opposé des lettres.
Les côtés des couleurs rouges et bleues serait inversés pour un texte blanc sur fond noir.
Sur un écran LCD dont l'ordre des composants correspond, la composante bleue se mélange au rouge et vert à proximité, idem pour le rouge à droite avec les composantes bleue et verte.
Sur un écran LCD dont l'ordre des composants serait l'ordre inverse cela donnerait un effet indésirable de tracé parallèle rendant le texte flou :
Il faut dans ce cas utiliser l'ordre inverse :
Sur un écran non LCD, où les pixels seraient trop éloignés pour que la composante d'un pixel puissent se mélanger au pixel voisin, ou dont les pixels n'ont pas une haute densité, l'effet ne fonctionne pas correctement et un bord rouge ou bleu est visible.
Pour ce cas, il est recommandé d'utiliser codice_154.
Aperçu de l'antialiasing et des mesures fractionnaires.
Un aperçu de l'effet des différentes valeurs (lignes) pour codice_151 (sans le préfixe commun codice_156, et pour le contraste par défaut) est présenté ci-dessous, combiné aux effets de codice_150 (colonnes).
Aperçu de l'ajustement du contraste.
Différentes valeurs d'ajustement du contraste pour codice_158 
Qualité des images.
Les autres propriétés de qualité concerne l'affichage des images par les méthodes codice_105, codice_140 et codice_141.