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 :

Je n'arrive pas à utiliser le Double buffering


Sujet :

AWT/Swing Java

  1. #21
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    OK oui en effet peut-être pas besoin d'y faire à chaque refresh, c'est toujours ça de gagné mais ca ne change rien

    Merci !

  2. #22
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    L'affichage est parfait. Tu as juste le thread main qui est en boucle en while true, donc il bouffe 100% du processeur. Forcément, le thread graphique, il doit se battre pour accéder au processeur, donc il fonctionne comme il peut, et c'est saccadé.

    Un petit Thread.sleep(100) dans ta boucle (avec le try catch qui va avec) ça devrait beaucoup aider.

    Enfin, tu utilises deux threads : un qui déplace les voitures, et un qui actualises l'affichage. Tu peux en utiliser un seul qui déplace les voitures puis actualise l'affichage (puis dort pendant quelques millisecondes).
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #23
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    OK j'ai touché à 2/3 trucs et ca va un poil mieux.
    Je ne peut pas mettre une valeur de sleep() trop élevée car cela influ sur la vitesse de déplacement des véhicules, il me faut au maximum un sleep(30).

    J'ai plus le temps de réétudier tout ça car je dois rendre le projet pour lundi mais je m'y pencherai peu-être ultérieurement. C'est juste un peu domage de rendre un truc qui rame un peu .

    En tout cas merci à tous pour votre patience.

    Sinon juste pour info est-ce possible de transcrire ça en utilisant OpenGL ou autres afin que ça soit vraiment fluide comme les jeux? c'est difficile? il faut des prérequis?

  4. #24
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Yann39
    Je ne peut pas mettre une valeur de sleep() trop élevée car cela influ sur la vitesse de déplacement des véhicules, il me faut au maximum un sleep(30).
    La vitesse d'exécution d'une simulation (modèle) ne doit jamais être influencée par son affichage dans la vue...
    Mais bon, tout refaire pour lundi, ça va être short

  5. #25
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Enfin c'est juste le rapport que je dois rendre lundi, je présente mon projet la semaine d'après, mais si le rapport ne correspond pas avec l'appli ca serait dommage.

    Sinon, avant que j'y pense, comment je peut faire pour rafraichir mon PanelCommande. En effet lorsque mon PanelRoute s'exécute, je change des valeur de mon PanelCommande (par ex : PanelCommande.jTextField7.setText("salut"); ). Je voudrais par exemple qu'a chaque rafraichissement mon Panel recoive la vitesse courante de la voiture.
    J'ai essayer revalidate() mais ca ne fonctionne pas.
    Il faut pas que je fasse un thread qui rafraichi mon PanelCommande quand même ?

  6. #26
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Yann39
    Enfin c'est juste le rapport que je dois rendre lundi, je présente mon projet la semaine d'après, mais si le rapport ne correspond pas avec l'appli ca serait dommage.

    Sinon, avant que j'y pense, comment je peut faire pour rafraichir mon PanelCommande. En effet lorsque mon PanelRoute s'exécute, je change des valeur de mon PanelCommande (par ex : PanelCommande.jTextField7.setText("salut"); ). Je voudrais par exemple qu'a chaque rafraichissement mon Panel recoive la vitesse courante de la voiture.
    J'ai essayer revalidate() mais ca ne fonctionne pas.
    Il faut pas que je fasse un thread qui rafraichi mon PanelCommande quand même ?
    Tu voulais dire "pendant que j'y pense" ?

    Pour cela, il faut utiliser des listeners:
    http://rom.developpez.com/java-listeners

    La solution que tu proposes "Il faut pas que je fasse un thread qui rafraichi..." est exactement ce qui est décrit dans "III. Mauvaise approche"

  7. #27
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    lol OK je te remerci

    Je vais étudier ça.

  8. #28
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Bon décidément je n'arrive plus rien à faire.

    Ca fait plus d'une heure que je suis dessus et je ne voit pas du tout comment fonctionne ces listeners.

    Ya pas une autre solution ?

  9. #29
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Yann39
    Bon décidément je n'arrive plus rien à faire.

    Ca fait plus d'une heure que je suis dessus et je ne voit pas du tout comment fonctionne ces listeners.
    Qu'est-ce qui te pose problème?

    Ya pas une autre solution ?
    C'est la solution à utiliser ici...

  10. #30
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    C'est le fonctionnement que je ne comprend pas.

    J'ai fait une interface InterfaceCommande comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public interface InterfaceCommande extends EventListener {
        void NbVoituresChange(double nouveauNbVoitures);
        void NbDepassementsChange(double nouveauNbDepassements);
        void VitesseMoyenneChange(double nouvelleVitesseMoyenne);
    }
    J'implémente cette interface dans ma classe PanelCommandes, où je redéfini les méthode de l'interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public void NbVoituresChange(double nouveauNbVoitures){
            jTextField8.setText(""+nouveauNbVoitures);
        }
        public void NbDepassementsChange(double nouveauNbDepassements){
            jTextField2.setText(""+nouveauNbDepassements);
        }
        public void VitesseMoyenneChange(double nouvelleVitesseMoyenne){
            jTextField5.setText(""+nouvelleVitesseMoyenne);
        }
    Et c'est là que je comprend plus, qu'est-ce que je doit mettre dans PanelRoute pour qu'a chaque rafraichissement la vitesse de la voiture s'affiche dans mon jTextField ?
    j'ai essayé comme ceci mais ca ne change rien (ce que j'ai rajouté est en rouge) :
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    public class PanelRoute extends javax.swing.JPanel {
     
       private final EventListenerList listeners = new EventListenerList();
       // boucle d'affichage
       RenderingThread renderingThread = new RenderingThread();
       // buffer mémoire (2eme buffer)
       Graphics buffer;
       // image mémoire correspondante au buffer
       Image image; 
        
        PanelCommandes panelC = new PanelCommandes();
        private TexturePaint texture_herbe, texture_asphalte;
     
        public PanelRoute() {
                    
            initComponents();
            setOpaque(true);
            texture_herbe = CreerTexture("herbe.jpg");
            texture_asphalte = CreerTexture("asphalte.jpg");
            this.setSize(Main.autoroute.longueur()+60,700);
            renderingThread.start();
        }
    
        public InterfaceCommande[] getInterfaceCommande() {
            return listeners.getListeners(InterfaceCommande.class);
        }
     
        public TexturePaint CreerTexture(String UrlImage) {...}
        public Graphics2D DessinerTextures(Graphics g) {...}
        public Graphics2D DessinerRoute(Graphics g) {...}
        public Graphics2D DessinerPeages(Graphics g) {...}
        public Graphics2D DessinerVehicules(Graphics g) {...}
     
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            if(buffer==null){
            image = createImage(Main.autoroute.longueur()+1000,this.getHeight());
            buffer = image.getGraphics();
            }
            DessinerTextures(buffer);
            DessinerRoute(buffer);
            DessinerVehicules(buffer);
            for(InterfaceCommande listener : getInterfaceCommande())
               listener.NbVoituresChange(4);
            //Création d'un graphics 2d
            Graphics2D g2d = (Graphics2D)g;
            //Enlève l'antialiasing pour les shapes
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                 RenderingHints.VALUE_ANTIALIAS_OFF);
            //Enlève l'antialiasing pour le texte
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                                 RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
            /** Demande de rendu rapide */
            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
            g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_SPEED);
            g2d.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_OFF);
            g2d.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
            //On dessine le buffer mémoire dans le buffer d'affichage
            g2d.drawImage(image,1,1,this);
        }
        
        public void update(Graphics g) 
         { 
            paintComponent(g);
         } 
        
        class RenderingThread extends Thread {
     
          public void run(){
             while(true){
                try {
                   repaint(); 
                   sleep(20);
                } catch ( Exception e ) {} 
             }
          }
       }
    A mon avis j'ai fait n'importe quoi, je n'arrive pas à comprendre les exemples même avec beaucoup de bonne volonté...

  11. #31
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Il te manque les méthodes addXXXListener(...) et removeXXXListener(...) dans ton PanelRoute...

    Et sinon, il suffit une fois que tu les auras définies, d'appeler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonPanelRoute.addInterfaceCommande(tonPanelCommande);
    À partir du moment où cette instruction aura été exécutée, ton "panel commande" écoutera ton "panel route"... (grâce aux méthodes définies dans l'interface commande)

  12. #32
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Yann39
    A mon avis j'ai fait n'importe quoi, je n'arrive pas à comprendre les exemples même avec beaucoup de bonne volonté...
    Grâce à ta remarque, j'ai remarqué que je n'avais pas précisé comment ajouter un écouteur à un objet écouté (en l'occurence dans l'exemple, la météo).
    C'est maintenant chose faite, j'ai rajouté 3 lignes à la fin de la section IV-A...

  13. #33
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Bon soit je suis mauvais soit je suis pas bon mais ya un problème ...

    J'ai rajouter les 2 méthode dans PanelRoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      public void addInterfaceCommande(InterfaceCommande listener) {
            listeners.add(InterfaceCommande.class, listener);
        }
     
        public void removeInterfaceCommande(InterfaceCommande listener) {
            listeners.remove(InterfaceCommande.class, listener);
        }
    Et après je le met ou le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addInterfaceCommande(new PanelCommandes());
    Si je le met dans le PaintComponent ca ne fait rien, c'est pourtant là qu'il faudrais qu'il soit, non ?

  14. #34
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Yann39
    Bon soit je suis mauvais soit je suis pas bon mais ya un problème ...

    J'ai rajouter les 2 méthode dans PanelRoute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      public void addInterfaceCommande(InterfaceCommande listener) {
            listeners.add(InterfaceCommande.class, listener);
        }
     
        public void removeInterfaceCommande(InterfaceCommande listener) {
            listeners.remove(InterfaceCommande.class, listener);
        }
    Et après je le met ou le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    addInterfaceCommande(new PanelCommandes());
    Si je le met dans le PaintComponent ca ne fait rien, c'est pourtant là qu'il faudrais qu'il soit, non ?
    Tu le mets où tu veux, l'important c'est que tu passes en paramètre ton bon PanelCommandes, pas un nouveau avec new PanelCommandes()...

  15. #35
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    lol désolé de t'embêter mais je ne voit vraiment pas.

    Comment passer mon PanelCommande sans en créer un nouveau.

    Je peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PanelCommandes PanelC = new PanelCommande();
    ....
    addInterfaceCommande(PanelC);
    Mais c'est pareil.

    On va y arrivé !

  16. #36
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Yann39
    lol désolé de t'embêter mais je ne voit vraiment pas.

    Comment passer mon PanelCommande sans en créer un nouveau.

    Je peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PanelCommandes PanelC = new PanelCommande();
    ....
    addInterfaceCommande(PanelC);
    Mais c'est pareil.

    On va y arrivé !
    Il faut que ça soit ton panelcommande que tu as ajouté à ton interface graphique...

  17. #37
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Ah excuse (mais tu n'avais pas mis la classe en entier), mais PanelCommandes n'étends pas JPanel?
    C'est le nom qui m'a induit en erreur...
    Donc si c ça c bon ok...

  18. #38
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    pfwaa ca marche !

    J'ai du faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static PanelCommandes PanelC = new PanelCommandes();
    et ensuite faire "this.jPanel1.add(PanelC);" au lieu de "this.jPanel1.add(new PanelCommandes);" dans ma classe Fenetre.

    Comme ça je peut y accéder depuis PanelRoute.

    Vraiment merci ®om longue vie à toi.

    Je vais pouvoir dormir tranquille.

  19. #39
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 255
    Points : 100
    Points
    100
    Par défaut
    Par contre là à force de rajouter des trucs c'est devenu vraiment lent, lorsqu'il commence à avoir plus de 3 ou 4 voitures sur la route ca rame vraiment et on ne voit même plus les voitures bouger.

    Je vais voir pour changer l'architecture du truc, si vous avez une idée je suis preneur.

    Merci !

  20. #40
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Du code ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. je n'arrive pas à utiliser mysqld
    Par JinJu dans le forum Débuter
    Réponses: 12
    Dernier message: 20/07/2007, 14h36
  2. J'arrive pas à utiliser JProgressBar !
    Par med_anis_dk dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/06/2007, 08h22
  3. Réponses: 2
    Dernier message: 12/04/2007, 09h42
  4. J'arrive pas à utiliser l'authentification par clé sur ma debian
    Par biglittlekiss dans le forum Sécurité
    Réponses: 2
    Dernier message: 11/12/2006, 14h15
  5. Réponses: 4
    Dernier message: 22/05/2006, 12h46

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