Textes et graphiques
Déterminer la position du texte
Jusqu’ici, nous avons utilisé la méthode drawString en lui fournissant les coordonnées de début d’affichage d’un texte comme dans : drawString (« Bonjour », 50, 100) ; Mais nous n’avons pas été très précis sur ce que représentaient ces coordonnées. Par ailleurs, nous n’avons jamais affiché plusieurs textes consécutifs sur une même ligne, ni un texte formé de plusieurs lignes consécutives. Pour cela, vous devez disposer d’informations supplémentaires concernant la police utilisée ainsi que sa taille. A travers deux exemples simples, nous allons voir comment y parvenir en recourant à la méthode getFontMetrics, que nous examinerons ensuite d’une façon plus approfondie. 1.1 Deux textes consécutifs sur une même ligne Nous savons que, dans la méthode paintComponent d’un composant quelconque (par exemple un panneau), si g désigne son argument, l’appel : g.drawString (« Bonjour », 20, 30) ; affiche le texte « Bonjour », à partir du point de coordonnées 20, 30. Pour l’instant nous savons que 20 correspond à la position horizontale du premier caractère affiché ; nous verrons plus tard la signification exacte du 30. Si nous souhaitons afficher un autre texte à la suite du précédent, nous savons que la position verticale 30 restera la même. En revanche, nous ne connaissons pas la position horizontale de début de notre nouveau texte, qui est fonction de la longueur occupée par l’affichage précédent du texte « Bonjour ». Pour déterminer cette position, vous disposez d’une méthode nommée getFontMetrics : appliquée à un contexte graphique, elle fournit un objet de type FontMetrics encapsulant les informations relatives à sa « fonte courante » (police et taille) : FontMetrics fm = g.getFontMetrics() ; // fm contient les caractéristiques // de la fonte courante employée par le contexte graphique g Cet objet dispose, entre autres, d’une méthode stringWidth fournissant la longueur en pixels d’un texte donné lorsqu’il est affiché avec la fonte courante : int lg = fm.stringWidth (« Bonjour ») ; // lg contient la longueur (en pixels) // du texte « Bonjour » Voici un petit programme qui montre comment procéder pour afficher (ici dans un panneau occupant toute la fenêtre) deux textes consécutifs (« Bonjour », puis » monsieur ») sur une même ligne : 1 – Déterminer la position du texte 485 import javax.swing.* ; import java.awt.* ; class MaFenetre extends JFrame { MaFenetre () { setTitle (« Essai texte ») ; setSize (300, 150) ; pan = new Paneau() ; getContentPane().add(pan) ; } private JPanel pan ; } class Paneau extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g) ; int x = 20, y = 30 ; String ch1 = « bonjour » ; String ch2 = » monsieur » ; // espace au debut g.drawString (ch1, x, y) ; FontMetrics fm = g.getFontMetrics() ; x += fm.stringWidth (ch1) ; g.drawString (ch2, x, y) ; } } public class PremTxt1 { public static void main (String args[]) { MaFenetre fen = new MaFenetre() ; fen.setVisible(true) ; } } Affichage de deux textes consécutifs sur une même ligne Remarque Les caractères d’une police n’ont pas tous la même étendue horizontale, à l’exception des polices dites « à espacement fixe ». On ne peut donc pas déterminer la taille exacte d’un texte en multipliant sa longueur (nombre de caractères) par la taille d’un caractère.
Affichage de deux lignes consécuti es
Ici, nous devons connaître la distance à prévoir entre deux lignes. Nous pourrions la choisir arbitrairement, mais il est préférable de s’appuyer sur une information fournie par la méthode getHeight de l’objet de type FontMetrics dont nous avons parlé, à savoir la hauteur de la fonte courante. Celle-ci tient compte d’un nécessaire espace (dit interligne) entre les lignes. Bien entendu, elle est, cette fois, indépendante du texte lui-même. Le programme suivant montre comment procéder pour afficher deux textes donnés sur deux lignes consécutives : import javax.swing.* ; import java.awt.* ; class MaFenetre extends JFrame { MaFenetre () { setTitle (« Essai texte ») ; setSize (300, 150) ; pan = new Paneau() ; getContentPane().add(pan) ; } private JPanel pan ; } class Paneau extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g) ; int x = 20, y = 30 ; String ch1 = « bonjour » ; String ch2 = « monsieur » ; g.drawString (ch1, x, y) ; FontMetrics fm = g.getFontMetrics() ; y += fm.getHeight() ; g.drawString (ch2, x, y) ; } } public class PremTxt2 { public static void main (String args[]) { MaFenetre fen = new MaFenetre() ; fen.setVisible(true) ; } } Affichage de texte sur deux lignes consécutives 1 –
Les différentes informations relatives à une fonte
D’une manière générale, à un instant donné, un composant dispose d’une « fonte courante ». En Java, une fonte se définit par : • un nom de famille de police1 (Helvetica, Arial, Times Roman…) ; • un style : romain (normal), gras ou italiques ; • une taille, exprimée en « points typographiques » (et non en pixels). La fonte courante d’un composant est retransmise par le contexte graphique qui lui est associé et qu’on reçoit en argument de paintComponent. Nous verrons plus loin qu’on peut modifier la fonte courante et donc afficher sur un même composant des textes dans différentes fontes. Dans ce cas, il va de soi qu’il faudra disposer de plus d’informations que dans l’exemple précédent où nous nous contentions d’utiliser une seule fonte. Voici les différentes informations que peuvent nous fournir les méthodes de l’objet de type FontMetrics, fourni par la méthode getFontMetrics. Celles-ci se réfèrent à la ligne de base du texte, au-dessus de laquelle s’écrivent la plupart des caractères2 (a, b, d, d, e, f, h, i, j, k, l, m…). D’autre part, on définit un jambage ascendant qui correspond à la distance entre la ligne de base et le haut d’une lettre telle que b, f ou h. De la même manière, on définit un jambage descendant qui correspond à la distance entre la ligne de base et le bas d’une lettre telle que g, j ou p.}Déterminer la position du texte Jusqu’ici, nous avons utilisé la méthode drawString en lui fournissant les coordonnées de début d’affichage d’un texte comme dans : drawString (« Bonjour », 50, 100) ; Mais nous n’avons pas été très précis sur ce que représentaient ces coordonnées. Par ailleurs, nous n’avons jamais affiché plusieurs textes consécutifs sur une même ligne, ni un texte formé de plusieurs lignes consécutives. Pour cela, vous devez disposer d’informations supplémentaires concernant la police utilisée ainsi que sa taille. A travers deux exemples simples, nous allons voir comment y parvenir en recourant à la méthode getFontMetrics, que nous examinerons ensuite d’une façon plus approfondie. 1.1 Deux textes consécutifs sur une même ligne Nous savons que, dans la méthode paintComponent d’un composant quelconque (par exemple un panneau), si g désigne son argument, l’appel : g.drawString (« Bonjour », 20, 30) ; affiche le texte « Bonjour », à partir du point de coordonnées 20, 30. Pour l’instant nous savons que 20 correspond à la position horizontale du premier caractère affiché ; nous verrons plus tard la signification exacte du 30. Si nous souhaitons afficher un autre texte à la suite du précédent, nous savons que la position verticale 30 restera la même. En revanche, nous ne connaissons pas la position horizontale de début de notre nouveau texte, qui est fonction de la longueur occupée par l’affichage précédent du texte « Bonjour ». Pour déterminer cette position, vous disposez d’une méthode nommée getFontMetrics : appliquée à un contexte graphique, elle fournit un objet de type FontMetrics encapsulant les informations relatives à sa « fonte courante » (police et taille) : FontMetrics fm = g.getFontMetrics() ; // fm contient les caractéristiques // de la fonte courante employée par le contexte graphique g Cet objet dispose, entre autres, d’une méthode stringWidth fournissant la longueur en pixels d’un texte donné lorsqu’il est affiché avec la fonte courante : int lg = fm.stringWidth (« Bonjour ») ; // lg contient la longueur (en pixels) // du texte « Bonjour » Voici un petit programme qui montre comment procéder pour afficher (ici dans un panneau occupant toute la fenêtre) deux textes consécutifs (« Bonjour », puis » monsieur ») sur une même ligne : 1 – Déterminer la position du texte 485 import javax.swing.* ; import java.awt.* ; class MaFenetre extends JFrame { MaFenetre () { setTitle (« Essai texte ») ; setSize (300, 150) ; pan = new Paneau() ; getContentPane().add(pan) ; } private JPanel pan ; } class Paneau extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g) ; int x = 20, y = 30 ; String ch1 = « bonjour » ; String ch2 = » monsieur » ; // espace au debut g.drawString (ch1, x, y) ; FontMetrics fm = g.getFontMetrics() ; x += fm.stringWidth (ch1) ; g.drawString (ch2, x, y) ; } } public class PremTxt1 { public static void main (String args[]) { MaFenetre fen = new MaFenetre() ; fen.setVisible(true) ; } } Affichage de deux textes consécutifs sur une même ligne Remarque Les caractères d’une police n’ont pas tous la même étendue horizontale, à l’exception des polices dites « à espacement fixe ». On ne peut donc pas déterminer la taille exacte d’un texte en multipliant sa longueur (nombre de caractères) par la taille d’un caractère. Textes et graphiques CHAPITRE 18 486 1.2 Affichage de deux lignes consécuti es Ici, nous devons connaître la distance à prévoir entre deux lignes. Nous pourrions la choisir arbitrairement, mais il est préférable de s’appuyer sur une information fournie par la méthode getHeight de l’objet de type FontMetrics dont nous avons parlé, à savoir la hauteur de la fonte courante. Celle-ci tient compte d’un nécessaire espace (dit interligne) entre les lignes. Bien entendu, elle est, cette fois, indépendante du texte lui-même. Le programme suivant montre comment procéder pour afficher deux textes donnés sur deux lignes consécutives : import javax.swing.* ; import java.awt.* ; class MaFenetre extends JFrame { MaFenetre () { setTitle (« Essai texte ») ; setSize (300, 150) ; pan = new Paneau() ; getContentPane().add(pan) ; } private JPanel pan ; } class Paneau extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g) ; int x = 20, y = 30 ; String ch1 = « bonjour » ; String ch2 = « monsieur » ; g.drawString (ch1, x, y) ; FontMetrics fm = g.getFontMetrics() ; y += fm.getHeight() ; g.drawString (ch2, x, y) ; } } public class PremTxt2 { public static void main (String args[]) { MaFenetre fen = new MaFenetre() ; fen.setVisible(true) ; } } Affichage de texte sur deux lignes consécutives 1 – Déterminer la position du texte 487 1.3 Les différentes informations relatives à une fonte D’une manière générale, à un instant donné, un composant dispose d’une « fonte courante ». En Java, une fonte se définit par : • un nom de famille de police1 (Helvetica, Arial, Times Roman…) ; • un style : romain (normal), gras ou italiques ; • une taille, exprimée en « points typographiques » (et non en pixels). La fonte courante d’un composant est retransmise par le contexte graphique qui lui est associé et qu’on reçoit en argument de paintComponent. Nous verrons plus loin qu’on peut modifier la fonte courante et donc afficher sur un même composant des textes dans différentes fontes. Dans ce cas, il va de soi qu’il faudra disposer de plus d’informations que dans l’exemple précédent où nous nous contentions d’utiliser une seule fonte. Voici les différentes informations que peuvent nous fournir les méthodes de l’objet de type FontMetrics, fourni par la méthode getFontMetrics. Celles-ci se réfèrent à la ligne de base du texte, au-dessus de laquelle s’écrivent la plupart des caractères2 (a, b, d, d, e, f, h, i, j, k, l, m…). D’autre part, on définit un jambage ascendant qui correspond à la distance entre la ligne de base et le haut d’une lettre telle que b, f ou h. De la même manière, on définit un jambage descendant qui correspond à la distance entre la ligne de base et le bas d’une lettre telle que g, j ou p.