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

2D Java Discussion :

Mise à jour de l'affichage


Sujet :

2D Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut Mise à jour de l'affichage
    Bonjour,

    Je souhaite réaliser une simulation de déplacement d'un point. J'ai organisé mon projet java en deux classes (je simplifie le probleme):

    la premiere calcul la position du point à chaque temps de simulation :
    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
     
    class Simulation{
    int x ,y,temps
     
    Simulation() {
    x = 0 ; y = 0 ; temps = 0 ;
    } 
     
    public go(){
    while temps<100{
       temps = temps +1 ;
       x = temps *2 ;
       y = temps +4 ;
    }
    }
    et la deuxieme classe qui se charge d'afficher régulierement la position du point dans une JPanel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class SimPed extends Component {
    Simulation sim
     
    SimPed() {
    this.sim = new Simulation();
    this.sim.go()
    }
     
    public void paint(Graphics g){
    //ici affichage en tout genre + position du point
    g.drawOval(sim.x , sim.y,1,1);
    }
    La simulation est lancée depuis le main qui se trouve dans un fichier separée (qui se charge d'ajouter le composant SimPed à une JFrame)

    Ma question est la suivante : pensez vous que c'est une organisation tres judicieuse ? mon probleme maintenant c'est que l'affichage n'est pas actualisé. Le point change de position mais graphiquement ça reste à l'etat initial.
    Quelqu'un peu me donner un coup de pouce svp ?
    Merci !

  2. #2
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 245
    Par défaut
    Juste une idée à tester :

    tonComposantSwing.repaint(); pour rafraichir le composant.

    A+

  3. #3
    Membre chevronné Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Par défaut
    Dans ta boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while temps<100{
       temps = temps +1 ;
       x = temps *2 ;
       y = temps +4 ;
    }
    tu devrais ajouter une pause ! Sinon, la boucle est bouclé avant même le 1er affichage à l'écran : 100 itérations pareilles, ça se fait en un rien de temps ! Ce que tu vois ce n'est pas la position initiale, mais la position finale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while temps<100{
       temps = temps +1 ;
       x = temps *2 ;
       y = temps +4 ;
       try { Thread.sleep( 20 ) ; } // Pause de 20ms entre chaque déplacement
       catch( Exception e ) {}
    }

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut
    salut !

    Le probleme du repaint , c'est que je ne sais pas trop où le mettre, a quel moment ? Dans la methode paint ?


    Sinon le sleep ça ne marche pas. j'ai toujours l'affichage final qui apparait d'un coup , sauf qu'avec le sleep la fenetre met plus de temps à apparaitre (je suppose, le temps que l'execution de la simulation soit finie).


    Je pense que mes classes sont mal organisées, mais je suis un peu paumé !

  5. #5
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Faut aussi faire attention à ne pas bloquer l'EDT, dans ton cas, je pense que tu le bloques et donc si tu rajoutes des sleeps, tu bloques l'EDT encore plus longtemps...

    Plus d'infos : http://gfx.developpez.com/tutoriel/j...ing-threading/

  6. #6
    Membre chevronné Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Par défaut
    Citation Envoyé par wichtounet
    Faut aussi faire attention à ne pas bloquer l'EDT, dans ton cas, je pense que tu le bloques et donc si tu rajoutes des sleeps, tu bloques l'EDT encore plus longtemps...

    Plus d'infos : http://gfx.developpez.com/tutoriel/j...ing-threading/
    C'est vrai, le mieux serait donc de faire :

    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
    class Simulation extends Thread{
    int x ,y,temps ;
     
    Simulation() {
    x = 0 ; y = 0 ; temps = 0 ;
    } 
     
    public void run(){
    while temps<100{
       try { Thread.sleep( 20 ) ; } // Pause de 20ms entre chaque déplacement
       catch( Exception e ) {}
       temps = temps +1 ;
       x = temps *2 ;
       y = temps +4 ;
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class SimPed extends Component {
    Simulation sim ;
     
    SimPed() {
    this.sim = new Simulation();
    this.sim.start() ; // start, et non plus go
    }
     
    public void paint(Graphics g){
    //ici affichage en tout genre + position du point
    g.drawOval(sim.x , sim.y,1,1);
    }

  7. #7
    Membre extrêmement actif Avatar de Mister Nono
    Homme Profil pro
    Ingénieur Mathématiques et Informatique
    Inscrit en
    Septembre 2002
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur Mathématiques et Informatique
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2002
    Messages : 2 245
    Par défaut
    Citation Envoyé par piteon
    salut !

    Le probleme du repaint , c'est que je ne sais pas trop où le mettre, a quel moment ? Dans la methode paint ?
    Si mes souvenirs sont bons (en ce moment je ne fais pas de Swing), la méthode repaint() appelle paint() : regarde le javadoc.
    Nota : la méthode paint() est aussi appelée autrement, par exemple quand la fenêtre est redimentionnée.

    A toi de choisir quand tu désires raffraîchir l'achiffage et tu sauras où mettre repaint() dans ton programme.

    Salut.

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut
    Bon finalement j'ai trouvé la solution en rajoutant une nouvelle classe qui implemente un timer.
    à intervalle régulier le timer provoque un repaint() de ma fenetre pendant que la simulation tourne en tache de fond.
    Merci pour votre aide
    a+

  9. #9
    Membre émérite
    Avatar de sironimo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Par défaut
    Un petit alors ?

Discussions similaires

  1. Mise à jour de l'affichage
    Par Chris_Ewoks dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/10/2008, 16h05
  2. Dessiner en Wpf et mise à jour de l'affichage
    Par Orc_Fayeh dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 11/04/2008, 11h51
  3. Mise à jour de l'affichage des messages
    Par emmy99 dans le forum Langage
    Réponses: 8
    Dernier message: 28/01/2008, 19h36
  4. Mise à jour de l'affichage de la fenêtre
    Par YuGiOhJCJ dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 21/12/2006, 10h55
  5. [JTree] Mise à jour de l'affichage
    Par freddy766 dans le forum Composants
    Réponses: 3
    Dernier message: 16/10/2006, 10h39

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