Redessiner
• Les mé thodes pré cé dentes sont appelé es :
Chapitre 9 –lorsque le systè me le juge né cessaire
• le composant est rendu visible
• le composant a changé de taille
Dessiner avec Java • un autre composant a bougé et a rendu visible une
portion du composant
=> [Link]
–Lorsque l’application le juge né cessaire via un
appel à une mé thode repaint
16/03/04 Dessiner avec Java page 1 16/03/04 Dessiner avec Java page 5
Plan Mé thodes repaint
• Introduction • repaint()
• Classe Graphics –redessine tout le composant
• Classe Graphics2D • repaint(long milliSeconds)
–demande que le composant soit redessine avant
milliSeconds
• repaint (int x, int y, int width, int height)
–redessine la portion du composant
• …
16/03/04 Dessiner avec Java page 2 16/03/04 Dessiner avec Java page 6
paint vs paintComponent
• Swing en fait implé mente paint pour tout
Introduction objet JComponent en faisant appel à :
–paintComponent
–paintBorder
–paintChildren
• Il ne faut pas chercher (en gé né ral) à
redé finir paintBorder et paintChildren.
16/03/04 Dessiner avec Java page 3 16/03/04 Dessiner avec Java page 7
Dessiner dans un composant paintComponent
• Pour tout composant, il est possible de public class MyPanel extends JPanel {
dé finir comment celui-ci doit être dessiné protected void paintComponent(Graphics g) {
en redé finissant une mé thode. // Let UI delegate paint first including
• AWT // background filling, if I'm opaque)
public void paint(Graphics g) [Link](g);
• Swing // paint my contents next....
public void paintComponent(Graphics g) }
}
16/03/04 Dessiner avec Java page 4 16/03/04 Dessiner avec Java page 8
Dessiner incré mentalement Exemple
• Redessiner (systé matiquement) tout un composant • Pour redessiner toutes les 20ms un composant
– perte de temps donné , on é crira :
– scintillement possible Timer t = new Timer(20, new ActionListener()
• Il est pré fé rable : {
– d’utiliser la mé thode repaint(x,y,width,height) public void actionPerformed(ActionEvent e)
– de ré cupé rer un contrô leur graphique et de l’utiliser {
– d’utiliser un timer [Link]();
}
});
16/03/04 Dessiner avec Java page 9 16/03/04 Dessiner avec Java page 13
Ré cupé rer un contrô leur graphique
• Il suffit d’appeler la mé thode getGraphics
(dé finie dans la classe Component). Classe Graphics
• On peut alors utiliser ce contrô leur.
• Toutefois, les modifications apporté es au
graphisme sont perdues (à moins qu’elles ne
soient gé ré es) lors d’un nouveau paint
• => [Link]
16/03/04 Dessiner avec Java page 10 16/03/04 Dessiner avec Java page 14
Relâ cher un contrô leur graphique Classe Graphics
• Un contrô leur graphique peut être obtenu : • Propose un ensemble de fonctionnalité s simple
–automatiquement : argument des mé thodes mais limité .
paint ou paintComponent • Les proprié té s du controleur sont dé finies par :
–À la demande : mé thode getGraphics – void setColor(Color c)
• Dans le premier cas, il est relâ ché – void setFont(Font font)
automatiquement à la fin de la mé thode – void setPaintMode()
• Dans le second cas, il faut le relâ cher avec – void setXORMode(Color c1)
la mé thode dispose. – void setClip(int x, int y, int width, int height)
–…
16/03/04 Dessiner avec Java page 11 16/03/04 Dessiner avec Java page 15
Utiliser un Timer Modes de dessin
• Un Timer permet d’effectuer une action à • PaintMode : mode (par dé faut) qui permet de
intervalle ré gulier. remplacer les pixels existants par ceux qui sont
tracé s.
• Il suffit d’enregistrer un ActionListener
• XORMode : mode qui permet de combiner les
auprè s de lui. pixels existants avec ceux qui sont tracé s.
• On peut donc redessiner tout un composant – on utilise en gé né ral la couleur de fond à l’appel
de façon ré guliè re. – un second tracé efface toujours le pré cé dent
=> [Link]
16/03/04 Dessiner avec Java page 12 16/03/04 Dessiner avec Java page 16
Clipping Obtenir un contrô leur Graphics2D
• Toute opé ration de dessin en dehors de la • De façon automatique :
clipping area est sans effet. protected void paintComponent(Graphics g) {
• A comparer avec la mé thode repaint prenant [Link](g);
les mêmes arguments. Graphics2D g2D = (Graphics2D)g;
• [Link] … // dessiner avec g2D
• A la demande :
Graphics2D g2D = (Graphics2D)getGraphics();
16/03/04 Dessiner avec Java page 17 16/03/04 Dessiner avec Java page 21
Fonctions de dessin Fonctions principales
• drawRectangle • fillRectangle • void draw(Shape s)
• drawRoundRect • fillRoundRect –Dessiner une forme
• draw3DRect • fillDRect • void fill(Shape s)
• drawPolygon • fillPolygon –Remplir une forme
• drawOval • fillOval
• Et shape ?
• drawArc • fillArc
• drawLine • drawChars
• drawImage • drawString
16/03/04 Dessiner avec Java page 18 16/03/04 Dessiner avec Java page 22
Shape
• Une classe gé né rale qui repré sente toute
Classe Graphics2D forme.
• Cette classe abstraite possè de de
nombreuses sous-classes.
• Chaque sous-classe repré sente un type de
formes dont certaines pouvaient être
dessiné es directement avec Graphics.
16/03/04 Dessiner avec Java page 19 16/03/04 Dessiner avec Java page 23
Utiliser Graphics2D Formes é lé mentaires
• Il est possible de manipuler des objets Graphics2D Shape
pour toute version de Java compatible Java 2D. QuadCurve2D
• Pour utiliser ces objets, il suffit d’effectuer un Line2D
transtypage car de nombreuses fonctions de Java CubicCurve2D
manipule des ré fé rences Graphics. RectangularShape
• Or Graphics2D est une sous-classe de Graphics et
pour toute version Java compatible Java 2D, les
Arc2D Ellipse2D Rectangle2D RoundRectangle2D
objets retourné s sont issus de cette sous-classe.
16/03/04 Dessiner avec Java page 20 16/03/04 Dessiner avec Java page 24
Formes 2D à virgule flottante Lignes
• Avec Java 2D, il est possible effectuer des
conversions entre une mesure naturelle (en
Graphics2D g2 = (Graphics2D)g:
mè tres par exemple) et une mesure en Point2D p1 = [Link](100,0);
pixels. Point2D p2 = [Link](0,300);
• Pour cette raison, les coordonné es sont Line2D line = new [Link](p1,p2);
[Link](line);
donné es en virgule flottante, c’est à dire en
float ou double.
16/03/04 Dessiner avec Java page 25 16/03/04 Dessiner avec Java page 29
Consé quence Rectangles
[Link]([Link]);
• La plupart des classes repré sentant des [Link](new BasicStroke(2.0f));
formes possè dent deux sous-classes Rectangle2D r = new [Link](0,0,
200,50);
statiques. [Link](r);
[Link]([Link]);
• L’une permet d’utiliser des coordonné es de [Link](r);
type float
[Link]([Link]);
• L’autre permet d’utiliser des coordonné es float[] dash = new Float(10.0f,10.0f};
[Link](new BasicStroke(1.0f,
de type double. BasicStroke.CAP_ROUND,
BasicStroke.JOIN_MITER,10.0f,dash,0.0f);
RoundRectangle2D r = new
[Link](0,0, 180,50,5,5);
[Link](r);
16/03/04 Dessiner avec Java page 26 16/03/04 Dessiner avec Java page 30
Point2D Stroke
• Point2D qui n’est pas sous-classe de Shape • Il s’agit du trait utilisé .
utilise aussi cette technique. • Les caracté ristiques les plus inté ressantes
• Pour cré er un point, il faut é crire : sont :
–la largeur du trait employé (premier argument)
Point2D p = new [Link](5.0f,10.0f);
–le motif du trait (cinquiè me argument)
ou encore :
• Le motif du trait correspond à un tableau
Point2D p = new [Link](5.0,10.0); donnant alternativement la largeur du tiret
puis la largeur d’un espace etc…
16/03/04 Dessiner avec Java page 27 16/03/04 Dessiner avec Java page 31
Line2D Ellipses et arcs
• Pour Line2D sous-classe de Shape, on [Link]([Link]);
[Link](new BasicStroke(1.0f));
é crira : Ellipse2D e = new [Link](0,0,
200,50);
Line2D line = new [Link](p1,p2);
[Link](e);
ou encore : [Link]([Link]);
[Link](e);
Line2D line = new [Link](p1,p2);
[Link]([Link]);
où p1 et p2 repré sentent deux points.
[Link](new BasicStroke(8.0f,));
• De même pour les autres sous-classes. Arc2D a = new [Link](0,0,
180,50,90,135,[Link]);
[Link](a);
16/03/04 Dessiner avec Java page 28 16/03/04 Dessiner avec Java page 32
Arcs Exemple 1
• Lors de la int xs[] = {x, x+width, x, x+width};
int ys[] = {y, y+height, y+height, y};
construction; on
GeneralPath polygon = new
pré cise : GeneralPath(GeneralPath.WIND_EVEN_ODD);
Angle de dé part
Ange de l’arc – l’angle de dé part [Link](xs[0], ys[0]);
– l’angle de l’arc for (int i = 1; i < [Link]; i++)
[Link](xs[i], ys[i]);
– le type de fermeture
[Link]();
[Link]([Link]);
[Link](polygon);
16/03/04 Dessiner avec Java page 33 16/03/04 Dessiner avec Java page 37
Courbe quadratique Exemple 2
[Link]([Link]); public GeneralPath createPath(int x, int y)
[Link](new BasicStroke(4.0f)); {
QuadCurve2D q = new [Link](startX,startY, GeneralPath path = new GeneralPath();
controlX, controlY, stopX, stopY); x2 = x; y2 = y;
[Link](q); [Link](x, y);
x -= 100; [Link](x, y);
y += 50; [Link](x, y);
x += 100; [Link](x, y);
x += 10; y -= 10; x1 = x - 20; y1 = y - 20;
[Link](x, y, x1, y1, x2, y2);
return path;
}
16/03/04 Dessiner avec Java page 34 16/03/04 Dessiner avec Java page 38
Courbe cubique Remplissage
[Link]([Link]); • Lorsqu’on remplit une forme, il est possible
[Link](new BasicStroke(4.0f)); d’utiliser :
CubicCurve2D q = new [Link](startX,startY,
control1X, control1Y, control2X, control2Y,stopX, stopY); – un objet Color
[Link](q); [Link]([Link]);
– un objet GradientPaint
[Link](new GradientPaint(p1,[Link],p2,[Link]);
– un objet TexturePaint
[Link](new TexturePaint(bufferedImagep1,anchor));
16/03/04 Dessiner avec Java page 35 16/03/04 Dessiner avec Java page 39
GeneralPath Exemple
• GeneralPath, sous-classe de Shape, permet Ellipse2D e = new [Link](0,0,
200,50);
d’effectuer un tracé gé né ral. GradientPaint gp = new
• On utilise alors les mé thodes : GradientPaint(p1,[Link],p2,[Link]);
[Link](gp);
–moveTo [Link](e);
–lineTo
–quadTo
–curveTo
–closePath
16/03/04 Dessiner avec Java page 36 16/03/04 Dessiner avec Java page 40