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 :

Fonction JPanel.repaint() utilise 100% du processeur


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut Fonction JPanel.repaint() utilise 100% du processeur
    Salut,

    j'ai un problème dans mon application, elle utilise 100% du processeur j'ai mis tout en commentaire au niveau des traitements et je me suis apercu que c'est la fonction repaint(); qui me fait ca.

    Je simplifie mon application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Display extends JPanel implements WindowListener, ActionListener{
        public Display() {}
         public void paint(Graphics g) 
         {
                repaint();
         }
          public void finalize()
         {
     
         }
    }
    Je me demandais si quelqu'un a deja eu le même problème, et si pour rafraichir le contenu d'un jpanel il y aurait un autre moyen.

    Merci d'avance

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pour te pésenter ton erreur:

    La méthode repaint lance une de mande au composant pour se redessiner. Pour se redessiner le composant fait appel à sa méthode paint.

    Or tu redéfinis la méthode paint pour qu'elle appelle repaint qui appelle paint qui appelle repaint qui appelle paint et ainsi de suite....

    Donc vires moi cet appel à repaint manu militari çà ira mieux.


    Sinon pour la redéfinitiond e composants Swing, il vau mieux redéfinir la méthode painComponent que la méthode paint.

    En effet la méthode qui s'occuppe réellement du dessin est paintComponent, la méthode paint elle occupe un autre rôle (plus d'ordonnanceur). Donc il vaut mieux ne pas la redéfinir.

    ++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut
    Merci je comprend mieux, je vais voir ca pour la redefinition ^^.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut
    Ca va mieu car la ca ne le fait plus en boucle, mais lorsque je me déplace dans le contenu du jpanel grâce à un jscrollpane, lutilisation de mon processeur repasse a 100% puis redescend

    les modif apportés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
     
     
        }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut
    Un petit up, dans ce jpanel je fait juste une boucle repété 100 fois environ avec quelque petit calcul pour afficher un carré grâce à la fonction polyline(donc en gros afficher 100 fois un carré). C'est pas à cause de ceci que ca fait travailler le processeur quand même ?

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    C'est possible, un JScrollPane déclenche plusieurs repaint.

    Essaie d'externaliser le calcul de ton carré: fais le une fois et une seule - enfin si c'est possible - au lieu de le faire à chaque appel de paintComponent, par exemple au niveau du contructeur de ton JPanel.

    Sinon il te faudra prévoir un thread s'occupant uniquement du calcul du carré, et qui calculera une carré dans son coin, et une fois le calcul fini remplacera le carré actuel par le carré qu'il a calculé

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut
    j'essaye de mettre le calcul dans init() . j'ai essayé de déclarer un nouvel objet graphics en global mais ca ne marche pas, on dirait que mon nouvel objet graphics n'est pas initialisé.

    Des que je touche à g2 j'ai une erreur, j'ai essayé de linitialiser en faisant g2.create() mais ca ne marche pas non plus.

    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
    public class Display extends JPanel implements WindowListener, ActionListener{
        private Graphics g2;
        public Display() {
           //g2.create();
             int i,j;
         for(j = 0; j < 10;j++) {
                for(i = 0; i < 10;i++) {
                    this.dessinercase(i,j);
                }
            }
       }
         public void paintComponent(Graphics g) {
            super.paintComponent(g);            
            g = g2;
         }
         public void dessinercase()
         {
             //ici g2 recoit le carré à dessiner
         }
     }

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Les Graphics correpondent à un contexte en fait (celui de l'écran, celui d'une image ou quelquechose dans ce style). Donc ils ne peuvent être crées à partir ce rien.

    Dans ton cas fais tes dessins sur une image puis dans le paintComponent dessine cette image sur ton composant

    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
     
    public class MyClass extends JComponent {
      private BufferedImage im;
     
      public MyClass() {
         init();
      }
     
      private void init() {
          Graphics2D g2d = im.createGraphics();
          for(int i=0; i<10; i++) {
             for(int j = 0; i<10; i++) {
                 dessinerCase(g2d, i ,j);
             }
          }
          g2d.dispose();
      }
     
      protected void paintComponent(Graphics g) {
          g.drawImage(im,0,0,null);
      }

    En faisant ensorte que ta méthode dessinerCase prenne en paramètre des graphics et dessine dessus.

    Voiloù

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut
    merci, ca fonctionne. Aucun lag juste outof memory quand je met un peu trop de case genre 150*150;

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 914
    Billets dans le blog
    54
    Par défaut
    La ca depend de ce que fait ta methode dessinerCase(). Crees-tu beaucoup d'objets temporaires ? Si c'est le cas peux-tu optimiser en evitant de re-creer de nouveaux objets ou en re-utilisant toujours le(s) meme(s) ?
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2006
    Messages : 81
    Par défaut
    il faut que chaque case soit un objet car elles contiennent toutes leurs propres propriétés. Ici case et une classe que j'ai creer, qui contient les coordonnées et une image qu'elle peut contenir.

Discussions similaires

  1. Eclipse CDT Completion: Utilisation 100% CPU
    Par XeN-Lo dans le forum Eclipse C & C++
    Réponses: 6
    Dernier message: 04/03/2008, 18h00
  2. Utiliser 100% du processeur
    Par joKED dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 18/04/2007, 02h42
  3. [Maven2] Maven utilise 100% de l'UC
    Par mat360 dans le forum Maven
    Réponses: 1
    Dernier message: 16/03/2007, 11h56
  4. Réponses: 1
    Dernier message: 09/05/2006, 21h01
  5. Utiliser que le processeur
    Par Neilos dans le forum OpenGL
    Réponses: 5
    Dernier message: 31/07/2005, 12h24

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