bonjour,
j'utilise une bufferedimage et je trace à l'intérieur des lignes, le problème c'est que l'image s'efface à chaque nouvel appel pour dessiner des lignes ? ça peut venir d'où ?
Merci
Greg
bonjour,
j'utilise une bufferedimage et je trace à l'intérieur des lignes, le problème c'est que l'image s'efface à chaque nouvel appel pour dessiner des lignes ? ça peut venir d'où ?
Merci
Greg
où trouve t-on une boule de cristale ? j'en veux une !!!! lol
sinon je crois que je me plante complètement de méthode, je dois dessiner des lignes au fur et à mesure avec cadence à l'écran, je dessine zone par zone, un peu comme des lettres... je sais pas si je suis bien clair !!
à l'écran je n'ai que soit la dernière partie soit rien du tout ! j'ai simplifié abcd c'est calculé en fait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public void paintComponent(Graphics g) { super.paintComponent(g); Dimension dim = getSize(); int w = dim.width; int h = dim.height; bi = (BufferedImage)createImage(w, h); big = bi.createGraphics(); big.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); big.setColor(Color.RED); for (int t= 1; t< nblines; t++){ big.draw(new Line2D.Double(a,b,c,d); g.drawImage(bi,a,b,c,d,a,b,c,d,this); } } }
merci
à chaque passage dans paint j'ai de nouvelle ligne à afficher, je ne désire pas effacer les anciennes
Procédure générale, parmi d'autres :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 1. créer une image (BufferedImage par exemple) 2. extraire l'objet Graphics associé à l'image 3. dans un Thread, faire successivement : 3.1 afficher un trait sur le Graphics 3.2 appel de repaint sur l'objet contenant la méthode "paintComponent" 3.3 faire une pause 3.4 a la fin du Thread, faire un "dispose" sur le Graphics 4. dans paintComponent, afficher uniquement l'image créée à l'étape 1.
je comprends pas à quoi sert le Thread ? tu as un lien pour exemple ?
Pense à la FAQ du site
cela veut dire qu'il faut enregistrer toutes les formes dans des éléments comme des taleaux puis les afficher ? on ne peut pas écrire dans une bufferedimage sans qu'elle ne s'efface ?
L'image ne peut pas s'effacer sauf si tu la reinitialises ou si tu effaces son contenu manuellement. Au nouveau pas de temps, tu te contentes de dessiner la nouvelle ligne. A priori la seule chose que tu as besoin de stocker c'est l'endroit ou dessiner la nouvelle ligne (voir carrement pas du tout si ceci peut se calculer en fonction du pas de temps et du temps actuel).
La Thread sert a faire l'ajout de ligne a un pas de temps regulier, ce qui est ce que tu demandes dans la description de ton probleme.
je dois dessiner des lignes au fur et à mesure avec cadence à l'écran
Voici un exemple trivial. Un clic dans la fenêtre démarre le dessin, un autre clic met l'animation en pause. Comme tu peux le voir, toute la logique de construction du dessin se trouve dans le Thread (méthode "run") :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.swing.JFrame; import javax.swing.JPanel; public class Dessin extends JPanel implements Runnable { public static void main( String[] arg ) { Dessin inter = new Dessin(); JFrame frame = new JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); frame.getContentPane().add( inter ); frame.pack(); frame.setVisible( true ); } private Thread animator; private BufferedImage image; private Graphics2D graph; private final static int largeur = 800; private final static int hauteur = 600; private boolean pause = true; public Dessin() { animator = new Thread( this ); image = new BufferedImage( largeur, hauteur, BufferedImage.TYPE_INT_ARGB ); graph = image.createGraphics(); graph.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); animator.start(); addMouseListener( new MouseAdapter() { public void mouseClicked( MouseEvent event ) { swap(); } }); } @Override public Dimension getPreferredSize() { return new Dimension( largeur, hauteur ); } public synchronized void swap() { pause = !pause; notify(); } public void run() { Thread current = Thread.currentThread(); int x = 0; int xOld = 0; int y = 0; int yOld = 0; graph.setColor( Color.BLACK ); while( animator == current ) { if( pause ) { synchronized( this ) { while( pause ) { try { wait(); } catch( InterruptedException ex ) {} } } } x = (int) ( Math.random() * largeur ); y = (int) ( Math.random() * hauteur ); graph.drawLine( xOld, yOld, x, y ); repaint(); xOld = x; yOld = y; try { Thread.sleep( 200 ); } catch( InterruptedException exc ) {} } } public void paintComponent( Graphics g ) { super.paintComponent( g ); g.drawImage( image, 0, 0, this ); } }
c'est super sympa, je galère depuis 3 jours là dessus ...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager