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 :

Scroll sur un JPanel trop lent


Sujet :

AWT/Swing Java

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Points : 53
    Points
    53
    Par défaut Scroll sur un JPanel trop lent
    Bonjour à tous
    Voila j'ai un panel que j'ai mis dans un JScrollPane. Je dessine sur le Jpanel avec la méthode paintComponent de mon JPanel. Quand je scroll le panel se redessinne à chaque fois ce qui fait que le scroll est super lent. Déjà que pour afficher une fois tous les élements sur le Panel ca prend du temps... comment faire un scroll rapide ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Sans le code de la méthode paintComponent que tu as redéfinie on ne pourra pas t'aider...
    Désolé mais la divinitaion ne fait pas partie de mes super pouvoirs...
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    Voila le code:
    Ma fonction 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
     
    public static void main(String[] args) {
     
    		View tnv=new View(tnm);
    		JFrame fenetre=new JFrame("Titre");
    		fenetre.setPreferredSize(new Dimension(800,600));
     
    		JScrollPane jsp=new JScrollPane(tnv,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
    		JScrollPane jScrollPane=new JScrollPane(tnv);
     
    		fenetre.setBackground(Color.WHITE);
    		fenetre.getContentPane().add(jScrollPane);
    		fenetre.pack();
    		fenetre.setVisible(true);
    	}
    Et donc le panel avec la fonction drawComponent ou je fais dedans tout un tas de Linde2D, de clip...
    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
     
    public class View extends JPanel {
     
    	public View(ThermiqueNucleaireModel model)
    	{
    		super();
    		this.setBackground(Color.WHITE);
    		this.setPreferredSize(new Dimension(2048,2048));
    		this.model=model;
    	}
     
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponents(g);
     
    		Graphics2D g2d=(Graphics2D) g ;
     
    		ArrayList<Bo> centrales=model.getAll();
    		Iterator<Bo>iter=centrales.iterator();
    		int i=0;
     
    		while(iter.hasNext()){
    			Bo centrale=(Bo)iter.next();
    			Courbe courbe=new Courbe(g2d,centrale,...);
    			courbe.draw();
    			i++;
    		}
     
    	}
     
    }
    Et donc mon soucis, quand je scroll c'est que tout est redesinner et donc scroller prend énormement de temps. comment faire ?

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Préparer une BufferedImage (grosso merdo un buffer) sur laquelle tu dessines toute tes courbes puis dessiner l'image sur ton JPanel. Et ne mettre a jour l'image que si besoin est (changement de de données & cie).

    Ainsi le code du paintComponent sera simplissime et relativement rapide
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  5. #5
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 79
    Points : 53
    Points
    53
    Par défaut
    J'ai trouvé a solution tout seul. Je fais du double buffering comme indiqué dans la faq. Car les élements dessinés ne sont modifiés, je dessinne tout dans un buffer.
    La méthode paintComponent devient alors:
    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
     
    	public void paintComponent(Graphics g)
    	{
    		super.paintComponents(g);
    		System.out.println("paintComponent");
     
    		if(image==null)
    		{
    			// Je crée le buffer et dessine dedans
    			image=createImage(2048,2048*2);
    			Graphics2D g2d=(Graphics2D)image.getGraphics();
     
    			// Tous les drawLine que je veux
    		}
     
    	    // finalement, le buffer mémoire est dessiné dans le buffer d'affichage
    	    g.drawImage(image, 0, 0, this);
    	}
    En espérant que ca puisse aider quelqu'un.

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    Est-ce que tu ne dessine que ce qui est dans le clip rectangle pour commencer ?
    Romain Guy
    Android - Mon livre - Mon blog

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/01/2015, 15h04
  2. [XL-2007] Fichier trop lent : 1048576 lignes sur 5000 utilisées
    Par Ced17 dans le forum Excel
    Réponses: 7
    Dernier message: 22/12/2014, 15h44
  3. Code trop lent pour une écriture sur disque
    Par Anarchy64 dans le forum C
    Réponses: 6
    Dernier message: 12/12/2013, 19h54
  4. [2.x] Site trop lent sur un mutualisé OVH, html statique ?
    Par Corei7 dans le forum Symfony
    Réponses: 9
    Dernier message: 24/12/2012, 15h47
  5. Rafraichissement JPanel trop lent
    Par Risike dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 24/07/2007, 17h23

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