Bonjour.
J'ai un JPanel inscrit dans un JScrollPane. Je dessine des rectangles dans mon JPanel. L'affichage est bon sauf dés que l'utilise les scrollBars. Le dessin bave
avant scroll et après
C'est un problème récurrent et je me rappelle y avoir été déjà confronté mais je ne sais plus comment j'avais résolu.
J'ai consulté la FAQ et autre sur Internet : le problème est souvent évoqué mais je n'ai pas vu de solutions (souvent la réponse est très éloignée du problème, et dans tous les cas inopérante).
Voici mon code que j'ai simplifié au maximum pour reproduire le problème.
La méthode main()
La classe Mosaique
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 package mosaique; import javax.swing.JFrame; import javax.swing.JScrollPane; public class TestMosaique { public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame frame = new JFrame("Test de dessin sur JPanel"); frame.setExtendedState (JFrame.MAXIMIZED_BOTH); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JScrollPane jsp = new JScrollPane(new Mosaique(2000,1500)); frame.add(jsp); frame.setVisible(true); } }); } }
J'ai essayé de remplacer paint par paintComponent sans succès.
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 package mosaique; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import javax.swing.JPanel; public class Mosaique extends JPanel { List<Rectangle> rectangles = new ArrayList<Rectangle>(); public Mosaique(int largeur, int hauteur) { Dimension dimension = new Dimension(largeur, hauteur); setPreferredSize(dimension); setBackground(Color.WHITE); int x,y, w,h; for (int i = 0; i < 10 ; i++) { x = (int) (largeur * 0.4 * Math.random()); y = (int) (hauteur * 0.4 * Math.random()); w = (int) (largeur * (0.1 + 0.5 *Math.random())); h = (int) (hauteur * (0.1 + 0.5 *Math.random())); rectangles.add(new Rectangle(x,y,w,h)); } } public void paint(Graphics g) { super.paint(g); Color c = g.getColor(); Graphics2D g2 = (Graphics2D) g; for (Rectangle r : rectangles) { g2.setColor(couleurAleatoire()); int x = r.x, y = r.y, w = r.width, h = r.height; g2.fillRect(x, y, w, h); } g.setColor(c); } private Color couleurAleatoire() { int r = (int) (256 * Math.random()), v = (int) (256 * Math.random()), b = (int) (256 * Math.random()); //si la couleur est jaune on la change if ((r == 255)&&(v == 255)&&(b == 255)) { r = 128; } return new Color(r,v,b); } }
Merci d'avance.
Partager