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
Version imprimable
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 faitCode:
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:
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.
Citation:
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:
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 ... :king: