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. #1
    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 Je n'arrive pas à utiliser le Double buffering
    Bonsoir,

    J'ai fait une petite application qui simule le déplacement de voitures sur une route.

    Voici à quoi ca ressemble :



    Problème :
    Le thread étant rafraichi toute les 20ms, ca rame beaucoup, l'image scintille, et le déplacement les voitures n'est vraiment pas fluide.
    Cela fait au moins une semaine que j'essai de mettre en place un double buffering mais çà ne fonctionne pas. Ca parait pourtant simple à faire mais je n'y arrive pas.

    Voilà comme mon programme est structuré :
    - une classe PanelRoute (extends JPanel) ou je dessine mon dessin.
    - une classe PanelCommandes ou j'ai les bouton pour contrôler le dessin.
    - une classe Fenetre où j'affiche ces 2 Panels

    Détails des classes :

    Classe PanelRoute:
    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
     
    public class PanelRoute extends javax.swing.JPanel {
     
        private TexturePaint texture_herbe, texture_asphalte;
     
        public PanelRoute() {      
            initComponents();
            setOpaque(true);
            texture_herbe = CreerTexture("herbe.jpg");
            texture_asphalte = CreerTexture("asphalte.jpg");
        }
     
        public Dimension getPreferredSize(){
            return new Dimension(Main.autoroute.longueur()+70, 100);
        }
     
        public Graphics2D DessinerTextures(Graphics g){
            //Dessine les textures
            ...
            return g2d;
        }
     
        public Graphics2D DessinerRoute(Graphics g) {
            //Dessine la route
            ...
            return g2d;
        }
     
        public Graphics2D DessinerPeages(Graphics g) {
            //Dessine les péages
            ...
            return g2d;
        }
     
        public Graphics2D DessinerVehicules(Graphics g) {
            //Dessine les véhicules
            ...
            DessinerPeages(g);
            return g2d;
        }
     
        public void update(Graphics g) 
        { 
             paint(g); 
        }
     
        public void paint(Graphics g) {  
            DessinerTextures(g);
            DessinerRoute(g);
            DessinerVehicules(g);
           }
    }
    Classe PanelCommande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class PanelCommandes extends javax.swing.JPanel {
     
        public PanelCommandes() {
            super();
            initComponents();
            jComboBox2.addItem("Rouge");
            jComboBox2.addItem("Jaune");
            jComboBox3.addItem("2");
            jComboBox3.addItem("3");
            jComboBox3.addItem("4");
            jPanel1.setPreferredSize(new Dimension(200, 180));
        }
    Classe Fenetre :
    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
     
    public class Fenetre extends javax.swing.JFrame {
     
        public static JScrollPane jScrollPane1;
        private JPanel jPanel1;
        private JPanel jPanel2;
     
        public Fenetre(Autoroute r) {
            setTitle("Simulation");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setSize(1190,633);
            this.setLayout(new BorderLayout());
            //création du jscrollpane contenant le dessin de la route
            this.jScrollPane1 = new JScrollPane(new PanelRoute());
            this.jScrollPane1.setPreferredSize(new Dimension(900,592));
            this.jScrollPane1.setWheelScrollingEnabled(true);
            //création jpanel contenant le Paneau de commandes
            this.jPanel1 = new JPanel();
            this.jPanel1.add(new PanelCommandes());
            //création jpanel contenant le jScrollPane
            this.jPanel2 = new JPanel();
            jPanel2.setSize(600,600);
            this.jPanel2.add(this.jScrollPane1);
            //ajout des 2 panel dans la fenetre principale
            this.getContentPane().add("West",jPanel1);
            this.getContentPane().add(jPanel2);
            this.setResizable(false);
            setVisible(true);
        }
    J'ai fait beaucoup de recherches sur le net mais je ne voit pas ou placer le code qu'on me dit de mettre...
    Si quelqu'un peut m'aider ça serait super.

    Merci d'avance.

  2. #2
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Ca fait un moment que j'ai utilisé le double buffering et je ne me rappelle plus totalement.

    Mais en tous cas le principe est de dessiner sur un Graphics qui n'est pas celui affiché à l'écran avant de l'afficher.

    Tu dois donc avoir 2 Graphics.

    En gros chaque fois que tu dois raffraichir l'image (update) tu appelles le paint sur le Graphic qui n'est pas affiché à l'écran.

    Je te conseille de décortiquer cet exemple : http://www.realapplets.com/tutorial/...Buffering.html
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  3. #3
    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
    Merci d'avoir répondu.

    J'ai déjà essayer cet exemple qui n'est pas compliquer mais qui ne fonctionne pas cher moi !

    Ca me déclenche un NullPointerException sur "bufferGraphics = offscreen.getGraphics();" si je le met dans mon constructeur. Et je ne vois pas ou le mettre à part dans le constructeur.

    Dans l'exemple il est placé dans une méthode init(), je ne comprend pas...

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

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Tu peut aussi regarder dans la faq :

    http://java.developpez.com/faq/gui/?...oublebuffering

    Ca te servira peut-être

  5. #5
    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
    Oui ca a bien sûr été le premier exemple que j'ai suivi, mais impossible d'y faire fonctionner, j'ai toujours ce nullPointerException.

    Je dois bien faire le doubleBuffering dans ma class PanelRoute ?

  6. #6
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Comment est-ce que tu initialises ta variable "offscreen" ?

    Pour info, la méthode init est une méthode de la classe Applet (avec rien dedans) qui est appelée lorsque l'applet s'initialise. A surcharger lorsqu'on veut faire qqch à l'initialisation d'une applet.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  7. #7
    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
    Oui même en mettant une méthode init() ca ne fonctionne pas.

    Voici ce que j'ai (class PanelRoute), j'ai mis en vert ce que j'ai rajouté pour le doublebuffering :
    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
    public class PanelRoute extends javax.swing.JPanel {
     
        private TexturePaint texture_herbe, texture_asphalte;
        
        Graphics bufferGraphics; 
        Image offscreen;
     
        public PanelRoute() {      
            initComponents();
            setOpaque(true);
            texture_herbe = CreerTexture("herbe.jpg");
            texture_asphalte = CreerTexture("asphalte.jpg");
            offscreen = createImage(Main.autoroute.longueur()+1000,this.getHeight()); 
            bufferGraphics = offscreen.getGraphics(); 
        }
     
        public Dimension getPreferredSize(){
            return new Dimension(Main.autoroute.longueur()+70, 100);
        }
     
        public Graphics2D DessinerTextures(Graphics g){
            //Dessine les textures
            ...
            return g2d;
        }
     
        public Graphics2D DessinerRoute(Graphics g) {
            //Dessine la route
            ...
            return g2d;
        }
     
        public Graphics2D DessinerPeages(Graphics g) {
            //Dessine les péages
            ...
            return g2d;
        }
     
        public Graphics2D DessinerVehicules(Graphics g) {
            //Dessine les véhicules
            ...
            DessinerPeages(g);
            return g2d;
        }
     
        public void update(Graphics g) 
        { 
             paint(g); 
        }
     
        public void paint(Graphics g) {
            Graphics2D g2d = (Graphics2D)g;  
            DessinerTextures(bufferGraphics);
            DessinerRoute(bufferGraphics);
            DessinerVehicules(bufferGraphics);
            g2d.drawImage(offscreen,1,1,this);
           }
    }
    Je ne vois pas ou est le problème...

  8. #8
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Tu peux nous donner la stackTrace de l'exception ?

    EDIT : Normal que ça ne marche pas avec init() puisque c'est une méthode qui est appelée pour les applets, pas pour les panels.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  9. #9
    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 quoi exactement le stackTrace de l'exception ?

    J'a ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Exception in thread "main" java.lang.NullPointerException
            at projet.PanelRoute.<init>(PanelRoute.java:40)
            at projet.Fenetre.<init>(Fenetre.java:33)
            at projet.Main.main(Main.java:24)
    Java Result: 1

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 669
    Points : 756
    Points
    756
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try {
     
        // .....
     
    }
    catch (IOException e) {
     
        // ici tu mets ton StackTrace
        e.printStackTrace();
     
    }
    "Le calendrier, c'est la bureaucratie du temps." Quino

  11. #11
    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
    Désolé mais je ne vois pas où mettre le try catch exactement.
    Le problème étant dans le constructeur il ne veut pas de mon try catch dans le constructeur, j'ai essayé des autres endroits mais j'ai toujours "exception java.io.IOException is never thrown in body of corresponding try statement".

    Je suis perdu là...

  12. #12
    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

    J'ai remarqué que la plupart des exemples présents sur le net sont utilisés dans une classe qui dérive de Applet...
    Peu être que ca ne marche pas avec JPanel ? Si ?

    Je suis désespéré, il faut que je rende ce projet Lundi et il me reste plus que ça à règler. Si quelqu'un à une idée et pouvais regarder un coup mon code je lui en serait vraiment reconnaissant.


    Merci déjà à ceux qui ont répondu.

  13. #13
    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
    D'après Romain Guy, le double buffering est "par défaut", contrairement à ce qui est écrit dans la faq:
    http://java.developpez.com/faq/gui/?...oublebuffering

  14. #14
    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
    Juste pour signaler, Swing est DoubleBuffered de base...

    Code du constructeur par défaut d'un JPanel:

    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
     
        /**
         * Creates a new <code>JPanel</code> with <code>FlowLayout</code>
         * and the specified buffering strategy.
         * If <code>isDoubleBuffered</code> is true, the <code>JPanel</code>
         * will use a double buffer.
         *
         * @param isDoubleBuffered  a boolean, true for double-buffering, which
         *        uses additional memory space to achieve fast, flicker-free 
         *        updates
         */
        public JPanel(boolean isDoubleBuffered) {
            this(new FlowLayout(), isDoubleBuffered);
        }
     
        /**
         * Creates a new <code>JPanel</code> with a double buffer
         * and a flow layout.
         */
        public JPanel() {
            this(true);
        }
    [EDIT] Grillé[/edit]
    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.

  15. #15
    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
    Ah bon !

    Alors pourquoi mon image scintille et le déplacement de mes voitures est saccadé ?

    Si ma petite appli n'est pas fluide même sur un bon PC alors comment font certain avec leurs grosse appli.

    Il y a d'autre solutions ?

  16. #16
    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 après environ 3 458 542 essais je crois que ca fonctionne.

    L'image ne scintille plus mais le déplacement des voitures n'est toujours pas fluide. Ca vient peu etre qu'elles se déplacent dans un tableau pour s'afficher à l'écran.

    Enfin ca veut bien aller comme çà merci à tous.

  17. #17
    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
    En fait non l'image s'est remise à scintiller etc c'est même pire qu'avant ...

    J'en ai ras le c.. j'arrête

    Si quelqu'un se sent la force de regarder un coup je le laisse volontier moi j'abandonne j'ai pas de temps à perdre avec des conneries comme ça...

    Bye merci à tous.

  18. #18
    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
    2 suggestions :
    - surcharge paintComponent plutot que paint. Je ne suis pas sûr, mais il se peut que le double buffering soit géré dans la méthode paint, donc si tu la surcharges, tu le perds. De manière générale, les gens qui s'y connaissent disent qu'il faut surcharger paintComponent. Moi je répète comme un mouton.
    - Il faudrait savoir à quelle ligne précisément arrive la NullPointerException, mais mon petit doigt me dit que c'est la variable Main.autoroute qui n'est pas encore initialisée. Tu construis l'interface avant les données ?
    "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.

  19. #19
    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
    Je surcharge bien la méthode PaintComponent maintenant.
    Et je n'ai plus le nullpointerException mais ca ne fait rien, l'affichage et même encore plus saccadé.

    Voici exactement ma classe PanelRoute qui dessine le dessin :
    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
     
    public class PanelRoute extends javax.swing.JPanel {
     
       // 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 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);
            panelC.jScrollPane1.revalidate();
            //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 ) {} 
             }
          }
       }
    Et mon 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public class Main {
     
        public Main() {
        }
     
        public static Autoroute autoroute;
        public static Vehicule toto;
     
        public static void main(String[] args) {
            autoroute = new Autoroute(3,800);
            Fenetre f = new Fenetre(autoroute);
            boolean ajout;
     
    	while (true) {           
                if (Math.random() < 0.01) {
                    //On vérifie si il y a une voiture sur les 28 1er "mètres" (longueur d'une voiture)
                    ajout = autoroute.existeVehiculeDebut();
                    if (ajout == true) {
                        toto = new Vehicule(autoroute.nbVoies()-1,10,autoroute);
                        autoroute.ajouteVehicule(toto.VehiculeAleatoire(autoroute));
                    }
                }   
                     //Fait avancer les voitures
    	    for (int voie = 0; voie < autoroute.nbVoies(); voie++)
    		for (int i = 0; i < autoroute.longueur(); i++){
    		    if (autoroute.existeVehicule(voie,i) != null) autoroute.existeVehicule(voie,i).RouleVehicule();
                    }
    	}
        }
    }
    Ya un problème quelquepart ?

  20. #20
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Et en virant tous ces "g2d.setreder....." ?

    A tout hasard, c'est pas un truc qu'on a besoin de faire une seule fois et pas a chaque refresh ?
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 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, 13h36
  2. J'arrive pas à utiliser JProgressBar !
    Par med_anis_dk dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/06/2007, 07h22
  3. Réponses: 2
    Dernier message: 12/04/2007, 08h42
  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, 13h15
  5. Réponses: 4
    Dernier message: 22/05/2006, 11h46

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