Java AWT Dessin Java et Java 2 D

  • Slides: 49
Download presentation
Java AWT Dessin Java et Java 2 D o Java 2 D et Swing

Java AWT Dessin Java et Java 2 D o Java 2 D et Swing o Graphics o repaint(), et en Swing o Composants de base o Chaîne de traitement o Les formes (Shape) o Les courbes, les aires o Transformations affines Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 1

Java AWT 2 D et Swing : deux avantages n Pour les composants :

Java AWT 2 D et Swing : deux avantages n Pour les composants : AWT et Swing n Pour l’affichage : Graphics et Graphics 2 D Swing AWT Graphics 2 D Affichage de base: Texte, formes géométriques simples Concepts nouveaux: Shape, Transformations, Path Affichage sophistiqué: double buffering par défaut, calcul de la zone de rafraîchissement Concepts nouveaux + affichage sophistiqué Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 2

Le dessin de base n Les outils de dessin sont assez rudimentaires : l

Le dessin de base n Les outils de dessin sont assez rudimentaires : l l l n des méthodes draw*() et fill*() pour lignes, rectangles, ovales, polygone; choix de deux modes de dessin : direct ou xor; une zone de découpe (clipping) rectangulaire. Java 2 propose des possibilités très sophistiquées: l l n Java AWT des méthods draw(Shape) et fill(Shape) Choix des 8 modes de dessin des zones de découpe arbitraires (en principe) des transformations géométriques complexes En Swing, le “double buffering” est automatique par défaut. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 3

Contexte graphique n Java AWT L'outil de dessin est le contexte graphique, objet de

Contexte graphique n Java AWT L'outil de dessin est le contexte graphique, objet de la classe Graphics. Il encapsule l'information nécessaire, sous forme d'état graphique. Celui-ci comporte l l l l n la zone de dessin (le composant), pour les méthodes draw*() et fill*() une éventuelle translation d'origine le rectangle de découpe (clipping) la couleur courante la fonte courante l'opération de dessin (simple ou xor) la couleur du xor, s'il y a lieu. Chaque composant peut accéder implicitement et explicitement à un contexte graphique. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 4

Obtenir un contexte graphique n Java AWT On obtient un contexte graphique l l

Obtenir un contexte graphique n Java AWT On obtient un contexte graphique l l l implicitement, dans une méthode paint() ou update(): AWT construit un contexte graphique passé en paramètre, explicitement, dans un composant ou dans une image, par get. Graphics(), explicitement encore, en copiant un objet Graphics existant. n Un contexte graphique utilise des ressources systèmes. L'acquisition explicite doit être accompagnée, in fine, par une libération explicite au moyen de dispose(). n L'acquisition explicite d'un contexte graphique est - dit-on - signe d'une programmation maladroite. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 5

Java AWT Un exemple public class Bonjour. Gribouille extends Applet { int xd, yd;

Java AWT Un exemple public class Bonjour. Gribouille extends Applet { int xd, yd; public void init() { add. Mouse. Listener(new Appuyeur()); add. Mouse. Motion. Listener(new Dragueur()); } class Appuyeur extends Mouse. Adapter { public void mouse. Pressed(Mouse. Event e) { xd = e. get. X(); yd = e. get. Y(); } } class Dragueur extends Mouse. Motion. Adapter { public void mouse. Dragged(Mouse. Event e) { int x = e. get. X(), y = e. get. Y(); Graphics g = get. Graphics(); g. draw. Line(xd, yd, x, y); xd = x; yd = y; g. dispose(); } } n Accès explicite à un contexte graphique. n A chaque get. Graphics(), un nouveau contexte est fourni, ne connaissant rien du précédent. } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 6

Sans appel explicite : AWT n Fait appel à la triplette magique seulement public

Sans appel explicite : AWT n Fait appel à la triplette magique seulement public class Bonjour. Gribouille 2 extends Applet { int xd, yd, x, y; repaint update paint public void init() { idem } demande un rafraîchissement. Appelle update(), en lui fournissant un contexte graphique. n repaint() n update() n paint() n Ici public void update(Graphics g) { paint(g); } public void paint(Graphics g) { g. draw. Line(xd, yd, x, y); xd = x; yd = y; } class Appuyeur extends Mouse. Adapter { public void mouse. Pressed(Mouse. Event e) { xd = e. get. X(); yd = e. get. Y(); } } class Dragueur extends Mouse. Motion. Adapter { public void mouse. Dragged(Mouse. Event e) { x = e. get. X(); y = e. get. Y(); repaint(); } } par défaut efface le dessin et appelle paint(). l l l Java AWT par défaut ne fait rien. repaint() appelle update(); update() n'efface pas; paint() trace la ligne. } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 7

Java AWT repaint() n C'est la méthode par excellence pour rafraîchir un affichage !

Java AWT repaint() n C'est la méthode par excellence pour rafraîchir un affichage ! Code simplifié de Component. java public void Component. update(Graphics g) { g. set. Color(get. Background()); g. fill. Rect(0, 0, width, height); g. set. Color(get. Fore. Ground()); paint(g); } public void Component. paint(Graphics g){} n repaint()poste un appel à update(). Plusieurs appels peuvent être groupés. n update() effectue les opérations suivantes: l l l efface le composant en le remplissant avec la couleur de fond définit la couleur du contexte à la couleur de dessin appelle paint(). n paint() ne fait rien par défaut. n repaint() est appelé automatiquement à la retaille d'une fenêtre. n Pour dessiner, on redéfinit paint() ou update() (ou les deux). Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 8

Java AWT repaint() en Swing n Reste la méthode par excellence pour rafraîchir un

Java AWT repaint() en Swing n Reste la méthode par excellence pour rafraîchir un affichage ! Code simplifié de Component. UI. java public void update(Graphics g, JComponent c) { if (c. is. Opaque()) { g. set. Color(c. get. Background()); g. fill. Rect(0, 0, c. get. Width(), c. get. Height()); } paint(g, c); } n repaint()poste un appel à update(). Plusieurs appels peuvent être groupés. n update() appelle paint(). n paint() appelle successivement l l l paint. Component() pour le dessin (le paint() en AWT) paint. Border() paint. Children(). n paint. Component() par défaut appelle Component. UI. update() qui efface et redessine le fond si le composant est opaque (JPanel l’est par défaut). n Pour dessiner, on redéfinit paint. Component() et il est utile d’appeler super. paint. Component(). Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 9

Lignes, rectangles, ovales Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT

Lignes, rectangles, ovales Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT n Le contour est dessiné par draw, l'intérieur est rempli par fill. n Tracer une ligne, une ovale, un rectangle est sans surprise. n L'interaction draw et fill est usuelle : si l'on veut voir le contour, il faut le tracer après. 10

Java AWT Polygônes n Un polygône est une ligne polygonale fermée, donnée par la

Java AWT Polygônes n Un polygône est une ligne polygonale fermée, donnée par la suite de ses points. Les premier et dernier points sont joints. n Deux constructeurs, et possibilité d'ajouter un point. n Remplissage selon la "even-odd rule". Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Constructeurs Polygon() Polygon(int[] xp, int[] yp, int np) Données npoints xpoints ypoints Méthodes add. Point(int x, int y) contains(Point p) contains(int x, int y) get. Bounds() translate(int dx, int dy) 11

Java AWT Exemple public void paint(Graphics g) { int largeur = get. Size(). width;

Java AWT Exemple public void paint(Graphics g) { int largeur = get. Size(). width; int hauteur = get. Size(). height; int dl = largeur/2, dh = hauteur/2; int [] polx = { 0, dl, largeur, dl}; int [] poly = {dh, 0, dh, hauteur}; Polygon pol = new Polygon(polx, poly, 4); g. set. Color(Color. black); g. fill. Rect(0, 0, largeur, hauteur); g. set. Color( Color. yellow); g. fill. Polygon(pol); g. set. Color( Color. red); g. fill. Rect(dl/2, dh/2, dl, dh); g. set. Color( Color. green); g. fill. Oval(dl/2, dh/2, dl, dh); g. set. Color( Color. blue); g. fill. Arc(dl/2, dh/2, dl, dh, th, del); } public class Losange extends Applet{ int th = 45, del =45; public void init(){ add. Mouse. Listener(new Mouse. Adapter() { public void mouse. Pressed(Mouse. Event e){ th = (th +10)%360; repaint(); } }); } public void paint(Graphics g) {. . . } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 12

Java AWT Et en Swing class Dessin extends JPanel { int theta = 45,

Java AWT Et en Swing class Dessin extends JPanel { int theta = 45, del =45; public void paint. Component(Graphics g) { int largeur = get. Size(). width; int hauteur = get. Size(). height; int dl = largeur/2, dh = hauteur/2; int [] polx = { 0, dl, largeur, dl}; int [] poly = {dh, 0, dh, hauteur}; Polygon pol = new Polygon(polx, poly, 4); g. set. Color(Color. black); g. fill. Rect(0, 0, largeur, hauteur); g. set. Color( Color. yellow); g. fill. Polygon(pol); g. set. Color( Color. red); g. fill. Rect(dl/2, dh/2, dl, dh); g. set. Color( Color. green); g. fill. Oval(dl/2, dh/2, dl, dh); g. set. Color( Color. blue); g. fill. Arc(dl/2, dh/2, dl, dh, theta, del); }. . . public class Losange extends JApplet public void init(){ set. Content. Pane(new Dessin()); } } { . . . public Dessin() { add. Mouse. Listener( new Mouse. Adapter() { public void mouse. Pressed(Mouse. Event e){ theta = (theta + 10)%360; repaint(); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 13

Java AWT Chaîne de traitement 2 D n Le processus de traitement est en

Java AWT Chaîne de traitement 2 D n Le processus de traitement est en plusieurs étapes l l n déterminer ce qui doit être affiché (formes, textes, images) appliquer les transformations géométriques et le clipping déterminer la couleur combiner avec ce qui se trouve sur la surface Pour chacune de ces étapes, des multiples possibilités existent. Primitives graphiques Opérations de rendu Formes Textes Images Transformations Clipping Composition Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Affichage Ecran Imprimante 14

Détails n Java AWT On obtient un objet Graphics 2 D par conversion public

Détails n Java AWT On obtient un objet Graphics 2 D par conversion public void paint. Component(Graphics g) { Graphics 2 D g 2 = (Graphics 2 D) g; . . . n On améliore l’affichage par antialiasing etc Rendering. Hints hints =. . . ; g 2. set. Rendering. Hints(hints); n On choisit l’outil de dessin au trait (contours) Stroke stroke =. . . ; g 2. set. Stroke(stroke); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 15

Détails (suite) n Java AWT On choisit l’outil de remplissage (couleur, dégradé, motif) Paint

Détails (suite) n Java AWT On choisit l’outil de remplissage (couleur, dégradé, motif) Paint paint =. . . ; g 2. set. Paint(paint); n On définit la forme de découpage Shape clip =. . . ; g 2. set. Clip(clip); n On définit une transformation géométrique entre l’espace utilisateur et espace d’écran Affine. Transfrom at =. . . ; g 2. transform(at); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 16

Détails (fin) n Java AWT On ompose le dessin résultant avec le dessin existant

Détails (fin) n Java AWT On ompose le dessin résultant avec le dessin existant Composite composite =. . . ; g 2. set. Composite(composite); n On définit la forme à dessiner Shape dessin =. . . ; n On l’affiche g 2. fill(dessin); g 2. draw(dessin); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 17

Java AWT Les formes (1) n Dans le paquetage java. awt. geom n Mais

Java AWT Les formes (1) n Dans le paquetage java. awt. geom n Mais Polygon inchangé n La classe Point 2 D n’est pas une forme Shape Polygon Rectangular. Shape Line 2 D Area n un point n’est pas tracé Cubic. Curve 2 D Float Double Quad. Curve 2 D General. Path Float Point 2 D Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Double Point 18

Java AWT Les formes (2) Rectangular. Shape est la classe n abstraite de base

Java AWT Les formes (2) Rectangular. Shape est la classe n abstraite de base des formes qui sont décrites par un rectangle Float Arc 2 D Double Float Rectangular. Shape Line 2 D Double Float Ellipse 2 D Double Float Round. Rectangle 2 D Double Rectangle Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 19

Usage avec Graphics 2 D Java AWT n La classe Graphics 2 D est

Usage avec Graphics 2 D Java AWT n La classe Graphics 2 D est une classe dérivée de Graphics n La méthode JComponent. paint. Component(Graphics g) reçoit en fait un Graphics 2 D. De même pour paint(). n On convertit g par Graphics 2 D g 2 n = (Graphics 2 D) g; On utilise des méthodes fill(Shape s) draw(Shape s) n Exemple g 2. fill(new Rectangle 2 D. Double(x, y, 100)); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 20

Java AWT Traits n Les traits se dessinent avec une plume de la l’interface

Java AWT Traits n Les traits se dessinent avec une plume de la l’interface Stroke, implémentée par Basic. Stroke. n Les attributs sont l l l’épaisseur (width) fins de traits (end caps) CAP_BUTT, CAP_ROUND, CAP_SQUARE l lien entre traits (join caps) JOIN_BEVEL, JOIN_MITER, JOIN_ROUND l n pointillé (dash) Par défaut l trait continue d’épaisseur 1, JOIN_MITER, miter limit 10 CAP_SQUARE, g 2. set. Stroke(new Basic. Stroke(14, Basic. Stroke. CAP_ROUND, Basic. Stroke. JOIN_BEVEL)); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 21

Détails n Java AWT Cet exemple contient l’illustration de plusieurs aspects public void paint.

Détails n Java AWT Cet exemple contient l’illustration de plusieurs aspects public void paint. Component(Graphics g) { Graphics 2 D g 2 = (Graphics 2 D) g; g 2. set. Rendering. Hint(Rendering. Hints. KEY_ANTIALIASING, Rendering. Hints. VALUE_ANTIALIAS_ON); g 2. set. Rendering. Hint(Rendering. Hints. KEY_RENDERING, Rendering. Hints. VALUE_RENDER_QUALITY); super. paint. Component(g 2); g 2. translate(get. Width()/2, get. Height()/2); g 2. set. Color(Color. green); g 2. fill. Oval(-taille/2, taille, taille); g 2. set. Color(Color. black); g 2. set. Stroke(new Basic. Stroke(14, Basic. Stroke. CAP_ROUND, Basic. Stroke. JOIN_BEVEL)); g 2. draw. Oval(-taille/2, taille, taille); double angle. H = 2*Math. PI* (minutes - 3*60) / (12*60); double angle. M = 2*Math. PI* (minutes - 15) / 60; General. Path gp = new General. Path(); gp. move. To((int)(0. 3*taille*Math. cos(angle. H)), (int)(0. 3*taille*Math. sin(angle. H))); gp. line. To(0, 0); gp. line. To((int)(0. 4*taille*Math. cos(angle. M)), (int)(0. 4*taille*Math. sin(angle. M))); g 2. draw(gp); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 22

Courbes de Bézier n Elles sont quadratiques ou cubique. n Elles ont trois ou

Courbes de Bézier n Elles sont quadratiques ou cubique. n Elles ont trois ou quatre points deux contrôle, dont deux sont des extrémités. n La courbe est contenue dans le polygône de contrôle formé des trois ou quatre points. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Java AWT 23

Construction n Java AWT Un constructeur de courbe cubique, en double: Cubic. Curve 2

Construction n Java AWT Un constructeur de courbe cubique, en double: Cubic. Curve 2 D. Double(double x 1, double y 1, double ctrlx 1, double ctrly 1, double ctrlx 2, double ctrly 2, double x 2, double 2) n Variantes utiles Cubic. Curve 2 D. Double() // initialisée à zéro Cubic. Curve 2 D. set. Curve(double[] coords, int offset) // affecte les valeurs Cubic. Curve 2 D. set. Curve(Point 2 D[] pts, int offset) Cubic. Curve 2 D. set. Curve(Point 2 D p 1, Point 2 D cp 2, Point 2 D p 2) n les mêmes valent pour les courbes quadratiques. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 24

Aires n Formes que l’on peut composer par des opérations booléennes (constructive solid geometry

Aires n Formes que l’on peut composer par des opérations booléennes (constructive solid geometry en 2 D) n Toute forme est un composant n Les opérations sont l l Java AWT add subtract intersect exclusiveor Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 25

Aires : opérateurs Java AWT public void paint. Component(Graphics g) { Graphics 2 D

Aires : opérateurs Java AWT public void paint. Component(Graphics g) { Graphics 2 D g 2 = (Graphics 2 D)g; . . . Area area. One = new Area(ellipse); Area area. Two = new Area(rectangle); if (option. equals("add")) area. One. add(area. Two); else if (option. equals("intersection")) area. One. intersect(area. Two); else if (option. equals("subtract")) area. One. subtract(area. Two); else if (option. equals("exclusive or")) area. One. exclusive. Or(area. Two); g 2. set. Paint(Color. orange); g 2. fill(area. One); g 2. set. Paint(Color. black); g 2. draw(area. One); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 26

Découpage n On peut restreindre la zone à (re)dessiner de deux manières l l

Découpage n On peut restreindre la zone à (re)dessiner de deux manières l l n par la définition d'une forme de découpe (clipping) par la spécification d'un rectangle de rafraîchissement dans la méthode repaint(). Un contexte graphique contient un rectangle de découpe l l n Java AWT initialement toute la zone de dessin modifiable par set. Clip() le rectangle ne peut que diminuer La méthode repaint() de Component peut prendre en argument un rectangle, et limiter ainsi l'action à ce rectangle. repaint() repaint(long tm) repaint(int x, int y, int width, int height) repaint(long tm, int x, int y, int width, int height) Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 27

Java AWT Un exemple n Dans le rectangle bleu, on "repeint" des petits carrés,

Java AWT Un exemple n Dans le rectangle bleu, on "repeint" des petits carrés, faisant ainsi apparaître le fond blanc. class Repeindre extends Frame { Repeindre() { set. Title("Repeindre"); add. Mouse. Listener(new Reveleur()); set. Size(300, 300); set. Visible(true); Graphics g = get. Graphics(); g. set. Color(Color. blue); g. fill. Rect(0, 0, get. Size(). width, get. Size(). height); g. dispose(); } class Reveleur extends Mouse. Adapter { public void mouse. Pressed(Mouse. Event e) { repaint(e. get. X(), e. get. Y(), 30); } } public static void main(String[] args) { new Repeindre(); } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 28

Un deuxième exemple n On choisit une ellipse comme Java AWT région de découpage.

Un deuxième exemple n On choisit une ellipse comme Java AWT région de découpage. On dessine une image qui paraît être partiellement révélée. n L’usage de la propriété opaque donne d’autres effets. class Image. Panel extends JPanel { private Image image; private Ellipse 2 D oeil = new Ellipse 2 D. Double(); private boolean pressed = false; public Image. Panel() { image = new Image. Icon("mandrill. jpg"). get. Image(); set. Preferred. Size( new Dimension(image. get. Width(this), image. get. Height(this))); . . . set. Background(Color. black); }. . . Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 29

L’affichage n Java AWT On ne peint que la partie qui est visible à

L’affichage n Java AWT On ne peint que la partie qui est visible à travers l’oeil public void paint. Component(Graphics g) { super. paint. Component(g); int width = get. Size(). width; int height = get. Size(). height; if (pressed) { g. set. Clip(oeil); g. draw. Image(image, 0, 0, this); } } n et on modifie l’ellipse en fonction de position de la souris public void mouse. Dragged(Mouse. Event e) { oeil. set. Frame. From. Center(e. get. X(), e. get. Y(), e. get. X() + 100, repaint(); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée e. get. Y() + 50); 30

Découverte n Java AWT La modification de l’opacité empêche le rafraîchissement de la fenêtre

Découverte n Java AWT La modification de l’opacité empêche le rafraîchissement de la fenêtre : c’est comme dans un jeu où on gratte. public void mouse. Pressed(Mouse. Event e) { pressed = true; oeil. set. Frame. From. Center(e. get. X(), e. get. Y(), e. get. X() + 100, if ((e. get. Modifiers() & Mouse. Event. BUTTON 3_MASK)!=0) set. Opaque(!is. Opaque()); repaint(); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée e. get. Y() + 50); 31

Couleurs n Java AWT La classe Color permet de gérer les couleurs. Constantes black,

Couleurs n Java AWT La classe Color permet de gérer les couleurs. Constantes black, blue, cyan, dark. Gray, green, light. Gray, magenta, orange, pink, red, white, yellow. n Constructeurs rgb, p. ex. Color(int r, int g, int b); n Conversion RGBto. HSB (hue, saturation, brightness) et vice-versa. n La classe dérivée System. Color contient des noms symboliques pour les couleurs du système: contrôle, fenêtre active, menu, ombre (inspiré de Windows). n Le coefficient alpha indique la transparence (0 = opaque, 1 = transparent) Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 32

Gribouilleur Java AWT public class JGribouille { public static void main(String[] args) { JFrame

Gribouilleur Java AWT public class JGribouille { public static void main(String[] args) { JFrame f = new JFrame("Gribouille"); f. set. Content. Pane(new Gribouilleur()); f. pack(); f. set. Visible(true); f. set. Background(Color. yellow); f. add. Window. Listener(new Fermeur()); } } class Gribouilleur extends JPanel { int xd, yd, x, y; Gribouilleur() { set. Preferred. Size(new Dimension(400, 250)); add. Mouse. Listener(new Appuyeur()); add. Mouse. Motion. Listener(new Dragueur()); set. Opaque(false); } public void paint. Component(Graphics g) { Graphics 2 D g 2 = (Graphics 2 D) g; g 2. set. Stroke(new Basic. Stroke(3)); g 2. draw. Line(xd, yd, x, y); xd = x; yd = y; }. . . Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée . . . class Appuyeur extends Mouse. Adapter { public void mouse. Pressed(Mouse. Event e) { xd = e. get. X(); yd = e. get. Y(); } } class Dragueur extends Mouse. Motion. Adapter { public void mouse. Dragged(Mouse. Event e) { x = e. get. X(); y = e. get. Y(); repaint(); } } } 33

Color. Choose r n Un composant de sélection de couleur est fourni. Il opère

Color. Choose r n Un composant de sélection de couleur est fourni. Il opère en plusieurs modèles par défaut, et peut être configuré. n Ici, initialisé avec couleur de fond. n Le bouton qui appelle le sélectionneur est dans un panneau. Java AWT JButton color. Button = new JButton("Couleurs. . . "); color. Button. add. Action. Listener(new Action. Listener() { public void action. Performed(Action. Event ae) { Color c = JColor. Chooser. show. Dialog(Panneau. this, "Sélection. . . ", get. Background()); if (c != null) set. Background(c); } }); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 34

public class Gribouille 3 extends Applet { int xd, yd, x, y; Color c

public class Gribouille 3 extends Applet { int xd, yd, x, y; Color c = Color. black; Button nettoyer; Choice couleurs; public Gribouille 3() { set. Background(Color. blue); nettoyer = new Button("effacer"); nettoyer. set. Foreground(Color. black); nettoyer. set. Background(Color. light. Gray); couleurs = new Choice(); couleurs. add. Item("black"); couleurs. add. Item("red"); couleurs. add. Item("yellow"); couleurs. add. Item("green"); couleurs. set. Foreground(Color. black); couleurs. set. Background(Color. light. Gray); } public void init() { add(nettoyer); add(new Label("coloris: ")); add(couleurs); add. Mouse. Listener(new Appuyeur()); add. Mouse. Motion. Listener(new Dragueur()); nettoyer. add. Action. Listener(new Nettoyeur()); couleurs. add. Item. Listener(new Coloreur()); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée Exemple Java AWT public void update(Graphics g) { g. set. Color(c); paint(g); } public void paint(Graphics g) { g. draw. Line(xd, yd, x, y); xd = x; yd = y; } 35

Java AWT Exemple n(suite) Le Nettoyeur efface tout n class Appuyeur extends Mouse. Adapter

Java AWT Exemple n(suite) Le Nettoyeur efface tout n class Appuyeur extends Mouse. Adapter { public void mouse. Pressed(Mouse. Event e) { xd = e. get. X(); yd = e. get. Y(); } } class Nettoyeur implements Action. Listener { public void action. Performed(Action. Event e) { Graphics g = get. Graphics(); g. clear. Rect(0, 0, get. Size(). width, get. Size(). height); g. dispose(); } } n n Le Dragueur relève la nouvelle position et demande le dessin class Dragueur extends Mouse. Motion. Adapter { public void mouse. Dragged(Mouse. Event e) { x = e. get. X(); y = e. get. Y(); repaint(); } } L'Appuyeur relève la position Le Coloreur relève la nouvelle couleur class Coloreur implements Item. Listener { public void item. State. Changed(Item. Event e) { String a = (String) e. get. Item(); if (a. equals("black")) c = Color. black; else if (a. equals("red")) c = Color. red; else if (a. equals("yellow")) c = Color. yellow; else if (a. equals("green")) c = Color. green; else c = Color. pink; } } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 36

Dégradés et textures n Gradient. Paint et Texture. Paint implémentent Paint n Gradient. Paint

Dégradés et textures n Gradient. Paint et Texture. Paint implémentent Paint n Gradient. Paint crée un dégradé entre deux couleurs données en deux Java AWT points Paint paint = new Gradient. Paint(0, 0, Color. red, (float)get. Width()/2, (float)get. Height()/2, Color. blue); g 2. set. Paint(paint); g 2. fill(ellipse); n répète une image plaquée dans un rectangle jusqu’à remplir la forme. Texture. Paint Rectangle 2 D anchor = new Rectangle 2 D. Double(0, 0, 4 * buffered. Image. get. Width(), 4 * buffered. Image. get. Height()); Paint paint = new Texture. Paint(buffered. Image, anchor); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 37

La composition Java AWT n Il y a 8 modes de composition de l’image

La composition Java AWT n Il y a 8 modes de composition de l’image construite avec l’image existante, numérotées par des constantes de la classe Alpha. Composite. n Le coefficient alpha ne change pas ces modes, mais atténue seulement l’impact de l’image construite. n s = alpha de source, d = alpha de destination, le coefficient final du mélange est s(1 -d) ou d(1 -s). n On choisit le style de composition par Composite composite = Alpha. Composite. get. Instance(rule, alpha); g 2. set. Composite(composite); n Encore faut-il que l’écran accepte une “couche alpha”. En général c’est non, et on dessine dans une image que l’on affiche. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 38

Illustration (1) n Le programme dessine une ellipse rouge en Java AWT alpha =

Illustration (1) n Le programme dessine une ellipse rouge en Java AWT alpha = 1 et, selon le choix de la règle de composition, la compose avec un rectangle bleu. n De dessin se fait dans une Buffered. Image, pour profiter de la couche alpha. public void paint. Component(Graphics g) { super. paint. Component(g); Graphics 2 D g 2 = (Graphics 2 D)g; if (image == null) image = new Buffered. Image(get. Width(), get. Height(), Buffered. Image. TYPE_INT_ARGB); Graphics 2 D g. I = image. create. Graphics(); g. I. set. Paint(Color. red); g. I. fill(ellipse); Alpha. Composite composite = Alpha. Composite. get. Instance(rule, alpha); g. I. set. Composite(composite); g. I. set. Paint(Color. blue); g. I. fill(rectangle); g 2. draw. Image(image, null, 0, 0); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 39

Java AWT Illustration (2) n Le choix de la règle se fait par lecture

Java AWT Illustration (2) n Le choix de la règle se fait par lecture de la combo. Box if (r. equals("CLEAR)) rule = Alpha. Composite. CLEAR; else if (r. equals("SRC")) rule = Alpha. Composite. SRC; else if (r. equals("SRC_OVER")) rule = Alpha. Composite. SRC_OVER; else if (r. equals("DST_OVER")) rule = Alpha. Composite. DST_OVER; etc. n le calcul de alpha se fait par lecture dans le curseur (et division par 100) a = curseur. get. Value(); alpha = (float)a / 100. 0 F; Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 40

Transformations affines n Les transformations affines servent à modifier les coordonnées utilisateur avant affichage

Transformations affines n Les transformations affines servent à modifier les coordonnées utilisateur avant affichage n Par exemple, le repère peut être centré au milieu de la zone de dessin. n Les transformations sont l l n Java AWT rotation translation dilatation cisaillement (shear) La class Affine. Transform permet de créer et de composer des transformations affines. De nombreuses méthodes existent. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 41

Java AWT Opérations n Mathématiquement, une transformation affine est représentée par une matrice 3

Java AWT Opérations n Mathématiquement, une transformation affine est représentée par une matrice 3 x 3 dont la dernière ligne est toujours (0 0 1). n Seuls les 6 autres coefficients sont conservés. On peut donner ces coefficients explicitement, ou les faire calculer en fonction de la nature de l’opération recherchée. n Créations: Affine. Transform t = new Affine. Transform(); t. set. To. Rotation(angle); t. set. To. Translation(dx, dy); t. set. To. Scale(sx, sy); t. set. To. Shear(cx, cy); n Compositions: t. rotate(angle); t. translate(dx, dy); t. scale(sx, sy); t. shear(cx, cy); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 42

Utilisation: exemple n Java AWT Quand la transformation est définie, on l’utilise en l’ajoutant

Utilisation: exemple n Java AWT Quand la transformation est définie, on l’utilise en l’ajoutant à la transformation courante par public void paint. Component(Graphics g) { super. paint. Component(g); Graphics 2 D g 2 = (Graphics 2 D)g; g 2. translate(get. Width() / 2, get. Height() / 2); g 2. set. Paint(Color. gray); g 2. draw(square); g 2. transform(t); g 2. set. Paint(Color. red); g 2. fill(smallsquare); g 2. set. Paint(Color. black); g 2. draw(square); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 43

Exemple n Java AWT Ici, composer est une variable booléenne qui conserve l’état de

Exemple n Java AWT Ici, composer est une variable booléenne qui conserve l’état de la coche. public void action. Performed(Action. Event event) { JToggle. Button source = (JToggle. Button) event. get. Source(); // le bouton String source. Action = source. get. Action. Command(); // son libellé if (source. Action. equals("composer")) { // la coche composer = source. is. Selected(); return; } if (!composer) t. set. To. Identity(); // composer ou non ? if (source. Action. equals("rotation")) t. rotate(Math. to. Radians(30)); else if (source. Action. equals("translater")) t. translate(20, 15); else if (source. Action. equals("dilater")) t. scale(2. 0, 1. 5); else if (source. Action. equals("cisailler")) t. shear(-0. 2, 0); repaint(); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 44

Transformation affine implicite Java AWT n L’affichage, lors de l’exécution d’un paint. Component, est

Transformation affine implicite Java AWT n L’affichage, lors de l’exécution d’un paint. Component, est optimisé. Seule la zone qui doit être rafraîchie l’est vraiment, et cela dépend bien sûr de l’événement qui a provoqué l’affichage. n Le context graphique maintient une transformation affine qui contient la translation du composant d’affichage par rapport au rectangle de réaffichage. Cette transformation implicite ne doit pas être ignorée, mais utilisée. n On ajoutera donc des transformations, au lieu de les remplacer. n Moyennant cette précaution, le décalage est transparent à l’utilisateur. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 45

Exemple Java AWT n Toute opération graphique se fait relativement au panneau jaune. n

Exemple Java AWT n Toute opération graphique se fait relativement au panneau jaune. n L’origine est le coin supérieur gauche du panneau. n Les valeurs numériques donnent la position de la souris relativement à l’origine (elle est à l’origine de la zone bleue). n La transformation affine affichée indique la translation de l’origine du panneau jaune par rapport à l’origine de la zone qui a été redessinée. Dans le cas présent, cette origine est la zone de texte. Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 46

Java AWT Exemple n Ici, l’origine est la zone grise, (suite) après un déplacement

Java AWT Exemple n Ici, l’origine est la zone grise, (suite) après un déplacement de la barre verticale du panneau mouvant. n Une déiconification, ou le lancement, donnent l’origine dans la zone bleue, un déplacement du panneau horizontal dans la zone blanche. n Les informations s’obtiennent par public void paint. Component(Graphics g) { Graphics 2 D g 2 = (Graphics 2 D) g; . . . Affine. Transform at = g 2. get. Transform(); txt. set. Text(at. to. String()); . . . g 2. draw(new Ellipse 2 D. Float(w/4, h/4, w/2, h/2)); } Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 47

Rendu Java AWT n Le rendu est amélioré (au dépens de la rapidité) par

Rendu Java AWT n Le rendu est amélioré (au dépens de la rapidité) par un ensemble de “hints” (conseils). n Chaque conseil concerne un aspect et indique un souhait. n Un conseil se présentent donc comme un couple: clé d’une propriété et valeur de cette propriété. g 2. set. Rendering. Hint(Rendering. Hints. KEY_ANTIALIASING, Rendering. Hints. VALUE_ANTIALIAS_ON); g 2. set. Rendering. Hint(Rendering. Hints. KEY_RENDERING, Rendering. Hints. VALUE_RENDER_QUALITY); n On peut aussi écrire Rendering. Hints r =. . . ; g 2. set. Rendering. Hints(r); Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 48

Rendu : suite n Java AWT Les aspects du rendu concernent l’anti-aliasing, la couleur,

Rendu : suite n Java AWT Les aspects du rendu concernent l’anti-aliasing, la couleur, l’interpolation KEY_ANTIALIASING VALUE_ANTIALIAS_DEFAULT VALUE_ANTIALIAS_OFF VALUE_ANTIALIAS_ON KEY_RENDERING VALUE_RENDER_DEFAULT VALUE_RENDER_QUALITY VALUE_RENDER_SPEED KEY_ALPHA_INTERPOLATION KEY_COLOR_RENDERING KEY_DITHERING KEY_INTERPOLATION VALUE_ALPHA_INTERPOLATION_DEFAULT VALUE_ALPHA_INTERPOLATION_QUALITY VALUE_ALPHA_INTERPOLATION_SPEED KEY_FRACTIONALMETRICS KEY_TEXT_ANTIALIASING Jean Berstel - Institut Gaspard Monge, Université de Marne-la-Vallée 49