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 :

Problème de rafraichissement d'un dessin


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut Problème de rafraichissement d'un dessin
    Bonjour à tous,
    je développe actuellement un petit logiciel ou j'ai des objets runnable qui ont une position définie dans leur classe.
    Ces objets sont dessinés dans un JPanel en récupérant le graphics.
    Dans ma méthode run de l'objet, j'efface le dernier point de l'objet avant de dessiner le nouveau point.
    Seul hic, des fois le précédent point est mal effacé et reste malgré le rafraichissement.
    Honnetement, je vois pas trop d'où cela peut venir: une idée?
    Pour illustrer cela, voici le bout de code de ma méthode run() de ma classe:

    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
    public void run() {
    		while(true){
    			//Beginning of the process
    			//First part of Display Management
    			Graphics g=this.getJp().getGraphics();
    			Color c = g.getColor();
    			g.drawOval(this.getX(),this.getY(),1,1);
     
     
    			//Move management
    			int dx,dy;
    			dx=(int) (Math.round((this.getSpeed()*Math.random()-this.getSpeed()*Math.random())));
    			dy=(int) (Math.round((this.getSpeed()*Math.random()-this.getSpeed()*Math.random())));
    			this.setX(this.getX()+dx);
    			this.setY(this.getY()+dy);
    			System.out.println("Id: "+this.getId()+" Ship: "+this.getName()+" X: "+this.getX()+" Y: "+this.getY());
     
    			//Second part of Display Management
    			g.setColor(Color.red);
    			g.drawOval(this.getX(),this.getY(),1,1);
    			g.setColor(c);
     
    			//End of the process
    			try {
    				//Wait 1 second
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    Merci pour votre aide.

  2. #2
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    			Graphics g=this.getJp().getGraphics();
    			// remplir le graphics avec la couleur de fond
    			Color c = g.getColor();
    			g.setColor(couleurDeFond);
    			g.fillRect(0, 0, largeur, hauteur);
     
    			g.setColor(c);
    			g.drawOval(this.getX(),this.getY(),1,1);

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut
    Non, le phénomène est pire encore je trouve.

    J'ai l'impression que cela arrive moins souvent avec un seul objet qu'avec plusieurs

    Deux,trois choses à préciser sur le code:

    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
     
    public void run() {
    		while(true){
    			//Beginning of the process
    			//First part of Display Management
                                          //Je récupère les graphics de mon JPanel
    			Graphics g=this.getJp().getGraphics();
                                          //Je récupère la couleur de fond de mon JPanel
    			Color c = g.getColor();
                                          //J'efface l'ancien point
    			g.drawOval(this.getX(),this.getY(),1,1);
     
     
    			//Move management
    			int dx,dy;
    			dx=(int) (Math.round((this.getSpeed()*Math.random()-this.getSpeed()*Math.random())));
    			dy=(int) (Math.round((this.getSpeed()*Math.random()-this.getSpeed()*Math.random())));
    			this.setX(this.getX()+dx);
    			this.setY(this.getY()+dy);
    			System.out.println("Id: "+this.getId()+" Ship: "+this.getName()+" X: "+this.getX()+" Y: "+this.getY());
     
    			//Second part of Display Management
                                          //Je change la couleur de dessin
    			g.setColor(Color.red);
                                          //Je dessine en rouge
    			g.drawOval(this.getX(),this.getY(),1,1);
                                          //Je remets la couleur initiale 
    			g.setColor(c);
     
    			//End of the process
    			try {
    				//Wait 1 second
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Ah c'est plus clair !
    Des pistes :
    le code de la méthode run() doit être appelé depuis la méthode paintComponent() de ton panel
    enlever le Thread.sleep(1000)
    gérer le rafraichissement via un timer javax.swing.Timer qui effectuera un repaint() du panel toutes les secondes

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 6
    Par défaut
    Ok, je vais tester les trois demain:
    -le run() de mon objet runnable est actuellement appelé lors d'un clic sur un bouton. Avec ma maigre expérience, je vois pas comment goupiller l'appel avec le paintComponent() de mon jPanel?
    -si j'enleve le thread.sleep(1000), ma cadence va augmenter sans résoudre le problème et peut être faire ramer le pc non?
    -ta solution du timer me parait la plus adapté. Il faut encore que je trouve comment comment synchroniser mes threads à un timer qui affiche tous les points de mon JPanel en même temps. A moins de lister les données de tous mes objets runnable/thread() dans un tableau et de procéder à une boucle de lecture et d'affichage non?

    Tout çà pour afficher des points qui bougent...

  6. #6
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    En gros...
    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
    interface Paintable {
        void paint(Graphics g);
    }
     
    class PaintablePoint implements Paintable {
     
       Color fg;
       Color bg;
     
       public PaintablePoint(Color fg, Color bg) {
          this.fg = fg;
          this.bg = bg;
       }
     
       public void paint(Graphics g) {
    	Color c = g.getColor();
     
    	g.setColor(bg);
    	g.drawOval(this.getX(),this.getY(),1,1);
     
    	int dx,dy;
    	dx=(int) (Math.round((this.getSpeed()*Math.random()-this.getSpeed()*Math.random())));
    	dy=(int) (Math.round((this.getSpeed()*Math.random()-this.getSpeed()*Math.random())));
    	this.setX(this.getX()+dx);
    	this.setY(this.getY()+dy);
     
    	g.setColor(fg);
    	g.drawOval(this.getX(),this.getY(),1,1);
     
    	g.setColor(c);
       }
     
       ...
    }
     
     
    class MyJPanel extends JPanel {
     
      Collection paintables;
     
      public void setPaintables(Collection paintables) {
          this.paintables = paintables;
      }
     
      public void paintComponent(Graphics g) {
          super.paintComponent(g);
          for (Iterator it = paintables.iterator(); it.hasNext();) {
             ((Paintable) it.next()).paint(g);
          }
      }
    }
     
    // quelque part...
    Timer timer = new Timer(1000, new ActionListener() {
       public void actionPerformed(ActionEvent e) {
          myJPanel.repaint();
       }
    });
    timer.start();

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/09/2011, 12h59
  2. Réponses: 3
    Dernier message: 11/03/2008, 12h25
  3. [SWING] Problème de rafraichissement
    Par david71 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 24/05/2004, 16h38
  4. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 15h06
  5. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 14h15

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