Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de repaint

    30 novembre 2008 à 11:48:55

    Salut !

    Je ne pense pas participer au concours mais pour ne pas trop oublier le java, je me suis lancée dans l générateur de labyrinthes.(Et puis c'est dimanche et il va neiger alors c'est le bon moment lol)

    Pas de problème de ce côté là, l'algorithme marche bien.
    J'ai affiché la construction de mon labyrinthe pas à pas dans un JFrame (à chaque tour de boucle, un repaint et un sleep de 200ms pour qu'on ait le temps de voir quelque chose).

    Maintenant j'ai voulu donner des options de paramétrage dans le jframe (la taille du labyrinthe par exemple).
    Donc dans mon JFrame, j'ai un JPanel où j'affiche mon labyrinthe (sur le même principe qu'à l'étape d'avant, je demande toujours au Jframe de se repaint et pas au JPanel directement).
    Et j'ai ajouté un 2e JPanel pour mettre des jtextfield, un bouton de démarrage...

    Et là... c'est le drame.
    L'algorithme fonctionne toujours mais le labyrinthe ne s'affiche pas tant qu'il n'est pas terminé.Je ne vois plus le pas à pas en gros, mais seulement le résultat final.

    J'ai essayé de forcer le repaint des JPanels à l'intérieur du JFrame :
    public void paintComponent(Graphics g){
    		principal.repaint();
    		menu.repaint();
    		super.repaint();
    	}
    

    principal est le JPanel où doit s'afficher le labyrinthe. Sa méthode paintComponent est redéfinie pour l'affichage.
    menu est le JPanel avec les options de paramétrage.
    Mais ça ne change rien.

    Est-ce que j'ai oublié quelque chose ?
    Merci de votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      30 novembre 2008 à 12:44:33

      Salut,


      Essai avec la méthode revalidate (principal.revalidate();)

      mais surtout pourquoi un super.repaint() ??


      A tester.
      • Partager sur Facebook
      • Partager sur Twitter
        30 novembre 2008 à 13:20:16

        Pour super.repaint, c'est ce que j'avais trouvé qui était sensé résoudre mon problème (Google est mon ami). Ils disaient de forcer le Jframe à se repaindre ainsi que tous ses composants (donc pour moi principal et menu).
        Au final, ça n'avait rien changé par rapport à principal.repaint tout seul.

        En suivant ton conseil, ma méthode paintComponent pour le JFrame devient :
        public void paintComponent(Graphics g){
        		principal.revalidate();
        	}
        


        ça ne marche pas mieux.
        En faisant des println dans la console, je me suis rendue compte qu'en fait cette méthode n'est jamais appelée.

        Dans ma classe Labyrinthe, j'ai une méthode print qui force le repaint du Jframe :

        public void printLaby(){
        		System.out.println("printlaby");
        		ihm.repaint();
        		try {
        			Thread.sleep(200);
        		} catch (InterruptedException e) {
        			// TODO Auto-generated catch block
        			e.printStackTrace();
        		}
        }
        


        Cette méthode est sensé appelé paintComponent que j'ai écrit en haut. Et j'ai mis un println dans le paintcomponent donc je devrais avoir
        printlaby
        paint
        printlaby
        paint...

        dans ma console. et en pratique j'ai que
        printlaby
        printlaby
        ...




        EDIT :

        J'AI TROUVE !!!

        J'ai utilisé la fonction paintImmediately sur le JPanel principal.
        Apparemment repaint ne force pas vraiment l'exécution de paintComponent (en tout cas, pas à tout prix).
        Alors que paintImmediately le fait.

        Donc voilà.
        En tout cas, merci patouche pour ton aide.

        (j'ai pas trouvé la case résolu, on y a peut-être pas accès quand on édite ?).
        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2008 à 17:44:13

          Salut j'ai le même problème que toi, comment as tu utiliser la fonction paintImmediately?
          • Partager sur Facebook
          • Partager sur Twitter

          Problème de repaint

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown