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

Interfaces Graphiques en Java Discussion :

Rafraichissement Infini "JPanel"


Sujet :

Interfaces Graphiques en Java

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Par défaut Rafraichissement Infini "JPanel"
    Bonjour,

    J'essaie de créer un plateau de jeu dérivant d'un JPanel. Lorsque je lui demande de choisir aléatoirement une case, le programme s'emballe et tourne à l'infini... Je ne vois vraiment pas d'ou vient l'erreur mais mes compétences dans le côté graphique et les méthodes paint et compagnie et assez limitée... Ca ressemble beaucoup à une boucle infinie mais je ne comprends pas pourquoi...

    Voici mon code, si une bonne âme pouvait m'aiguiller. Merci (beaucoup ^^) d'avance :

    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
    package quizz; 
     
    import java.awt.Color; 
    import java.awt.Dimension; 
    import java.awt.Graphics; 
     
    import java.awt.Graphics2D; 
    import java.awt.Image; 
    import java.awt.Rectangle; 
    import java.awt.TexturePaint; 
     
    import java.awt.image.BufferedImage; 
     
    import javax.imageio.ImageIO; 
     
    import javax.swing.JFrame; 
    import javax.swing.JPanel; 
    import java.awt.Toolkit; 
     
    import java.io.FileReader; 
     
    import java.util.Random; 
     
    public class Plate extends JPanel { 
    public Plate () { 
    } 
     
     
    public void paint(Graphics g) { 
    Image bleu = Toolkit.getDefaultToolkit().getImage("Images/casebleuerd.jpg"); 
    Image violet = Toolkit.getDefaultToolkit().getImage("Images/casemoradord.jpg"); 
    Image orange = Toolkit.getDefaultToolkit().getImage("Images/caseorangerd.jpg"); 
    Image rouge = Toolkit.getDefaultToolkit().getImage("Images/caserougerd.jpg"); 
    Image vert = Toolkit.getDefaultToolkit().getImage("Images/caseverterd.jpg"); 
    Image depart = Toolkit.getDefaultToolkit().getImage("Images/casedepartrd.jpg"); 
    Image arrivee = Toolkit.getDefaultToolkit().getImage("Images/casearriveerd.jpg"); 
     
    for (int i=0;i<5;i++) { 
    for(int j=0;j<7;j++) { 
    java.util.Random rand = new java.util.Random(); 
    int couleur = rand.nextInt(5); 
    Image kase=null; 
     
    if (couleur==0) 
    {kase=bleu;} 
    if (couleur==1) 
    {kase=violet; } 
    if (couleur==2) 
    {kase=rouge; } 
    if (couleur==3) 
    {kase=orange; } 
    if (couleur==4) 
    {kase=vert; } 
    g.drawImage(kase, 10+60*j, 10+60*i, null); } } 
    Image [][] plateau = new Image[5][7]; 
    plateau[0][0]=depart; 
    g.drawImage(plateau[0][0], 10, 10, null); 
    plateau[2][3]=arrivee; 
    g.drawImage(plateau[2][3], 10+60*3, 10+60*2, null); 
    repaint(); 
    } 
     
    }

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    d'abord, il est recommandé de surcharger paintComponent, plutot que paint. Ensuite, retire cet appel à repaint(), ca force awt à constement redessiner ton composant.

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 2
    Par défaut
    Merci pour ce quelques renseignements mais la présence de repaint, je n'obtiens aucun résultat. Mon "plateau" ne se dessine pas.

  4. #4
    Membre émérite Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Par défaut
    pense à instancier tes images en dehors en dehors de paint ( ou plutôt paintComponent ), car à chaque fois que ton panel est dessiné il faudra recréer les images, ce qui n'est pratique

    et puis, montre le code ou tu crée le panel et l'ajoutes au jframe

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 2
    Par défaut
    Oui le code de mon fichier frame :

    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
    package quizz;
     
    import java.awt.Dimension;
     
    import java.awt.Panel;
     
    import java.awt.Rectangle;
     
    import javax.swing.JFrame;
    import javax.swing.JPanel;
     
    public class Frame1 extends JFrame {
     
        private Plate Plate1 = new Plate();
     
        public Frame1() {
            try {
                jbInit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        private void jbInit() throws Exception {
            this.getContentPane().setLayout( null );
            this.setSize(new Dimension(536, 372));
            Plate1.setBounds(new Rectangle(0, 0, 535, 345));
            this.getContentPane().add(Plate1, null);
        }
    }

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Comme cela a été dit, pour un composant Swing il est préférable d'utilier paintComponent() plutôt que paint()...


    Sinon, il faut bien comprendre que l'objectif de paintComponent() est UNIQUEMENT de dessiner le composant (selon son état).


    Les problèmes de ton code :
    • Tu charges les images dans la méthode paint() Elles seront rechargées à chaque mise à jour de l'affichage (ce qui peut être fréquent).
    • Tu initialises tes données dans la méthode paint() Ton composant n'a pas d'état propre à lui et il est très variable...
    • Tu appelles repaint() dans paint(), ce qui te fait boucler à l'infini



    Il faudrait plutôt que tu gères l'état de ton composant dans ta classe, et que la méthode paintComponent se contente de l'afficher. Quelque chose comme cela :
    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
    class Plate extends JPanel {
    	/**
             * On utilise un tableau d'image, mais selon le besoin
             * on utilisera plutôt un autre type plus adapté...
             */
    	private Image[][] plateau = new Image[5][7];
     
    	/**
             * Le constructeur initialise nos données :
             */
    	public Plate() {
    		// On charge les images :
    		Image bleu = Toolkit.getDefaultToolkit().getImage("Images/casebleuerd.jpg"); 
    		Image violet = Toolkit.getDefaultToolkit().getImage("Images/casemoradord.jpg"); 
    		Image orange = Toolkit.getDefaultToolkit().getImage("Images/caseorangerd.jpg"); 
    		Image rouge = Toolkit.getDefaultToolkit().getImage("Images/caserougerd.jpg"); 
    		Image vert = Toolkit.getDefaultToolkit().getImage("Images/caseverterd.jpg"); 
    		Image depart = Toolkit.getDefaultToolkit().getImage("Images/casedepartrd.jpg"); 
    		Image arrivee = Toolkit.getDefaultToolkit().getImage("Images/casearriveerd.jpg"); 
     
    		// On génère le tableau d'image :
    		java.util.Random rand = new java.util.Random();
    		for (int i = 0; i < 5; i++) {
    			for (int j = 0; j < 7; j++) {
    				Image couleur = null;
    				switch(rand.nextInt(5)) {
    				case 0:	couleur = bleu; break;
    				case 1:	couleur = violet; break;
    				case 2:	couleur = rouge; break;
    				case 3:	couleur = orange; break;
    				case 4:	couleur = vert; break;
    				default: couleur = vert; break;
    				}
    				plateau[i][j] = couleur;
    			}
    		}
    		plateau[0][0] = depart;
    		plateau[2][3] = arrivee;
     
    	}
     
    	/**
             * paintComponent() se contente de dessiner le composant 
             */
    	@Override
    	protected void paintComponent(Graphics g) {
    		// Pour dessiner le background :
    		super.paintComponent(g);
    		// Pour dessiner les images :
    		for (int i = 0; i < 5; i++) {
    			for (int j = 0; j < 7; j++) {
    				g.drawImage(plateau[i][j], 10 + 60 * j, 10 + 60 * i, this);
    			}
    		}
    	}
     
    	/**
             * On renseigne la taille préféré du composant
             * (afin d'améliorer son support par les layouts)
             */
    	@Override
    	public Dimension getPreferredSize() {
    		if (isPreferredSizeSet()) {
    			return super.getPreferredSize();
    		}
    		// Sinon on calcule la taille préféré du composant :
    		return new Dimension( (60*8) + 20, (60*5) + 20);
    	}
     
    }

    On pourrait améliorer cela en utilisant un modèle de donnée séparé, et/ou en utilisant un UI pour desssiner le composant

    a++

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