IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Graphique, Jpanel et JScrollpane


Sujet :

AWT/Swing Java

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut 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 Nom : image initiale.JPG
Affichages : 79
Taille : 8,2 Ko et après Nom : image après scroll.JPG
Affichages : 88
Taille : 11,2 Ko
    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 : 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);
                }
            });
    	}
    }
    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
    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.
    C'est en respectant les autres que l'on se fait respecter.

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 464
    Points : 332
    Points
    332
    Par défaut
    J'ai compris (Merci Sylvain).
    En fait cela ressemble à un problème de rafriachissement, mais non cela provient de mon paint (ou paintComponent). Je modifie la couleur à chaque repaint() et il est appelé plusieurs fois quand on utilise les scrollBars. La solution : calculer la couleur à partir du rectangle. par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Color c = couleurRectangle(R);
     
    private Color couleurRectangle(REctangle R)
    {
         return new Color(R.x modulo 256, R.y modulo 256, R.width modulo 256);
    }
    C'est en respectant les autres que l'on se fait respecter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme JPanel dans JScrollPane
    Par hbar01 dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 30/05/2008, 19h37
  2. JPanel et JScrollPane
    Par bellemlih dans le forum Composants
    Réponses: 4
    Dernier message: 22/04/2008, 15h53
  3. JPanel et JScrollPane
    Par akrobat dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 01/06/2007, 10h38
  4. Probleme [SWING]: JPanel dans JscrollPane
    Par malandro dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/05/2006, 21h02
  5. [Débutant] JPanel dans JScrollPane
    Par Nicolas_75 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 06/04/2005, 09h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo