2 pièce(s) jointe(s)
Graphique, Jpanel et JScrollpane
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 Pièce jointe 155325 et après Pièce jointe 155326
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()
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
|
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);
}
});
}
} |
La classe Mosaique
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
|
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);
}
} |
J'ai essayé de remplacer paint par paintComponent sans succès.
Merci d'avance.