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

 Java Discussion :

Mettre une animation derrière les composants


Sujet :

Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Mettre une animation derrière les composants
    Bonjour,
    Je fais un petit jeu et à la fin de la partie je souhaiterais une petite animation qui remplit progressivement le fond d'écran de "Bravo !" mais que le fond, pas sur les boutons. C'est bien là mon problème, mes boutons sont surchargés par les écritures, on ne les voit plus.
    Autre chose : Cette animation s'arrête lorsqu'on clique n'importe où sur l'écran.

    J'obtiens bien ce résultat si j'abandonne l'animation : en mettant la boucle à l'intérieur de paintComponent. Mais comment y ajouter la thread et voir progressivement les "Bravo !" s'inscrire un par un progressivement ?

    Je ne peux pas non plus faire une animation ponctuée de repaint() car sinon je n'ai que le dernier "Bravo !" et je perds tous les précédents.

    Je vous joins mon code (une version très très simplifiée).
    Merci pour toute l'aide que vous voudrez bien m'apporter.

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    public class essai extends JApplet {
    	private static final long serialVersionUID = 1L;
     
    	class MaThread extends Thread {    //=========== Classe MaThread
    		int r = 0, x = 0, y = 0;
    	    boolean finir;
    	    JPanel panneauDisque;
     
    	    MaThread(JPanel panneauDisque) { //----------- Constructeur
    	    	this.panneauDisque = panneauDisque;
    	    }
     
    	   synchronized void stopper() {  //------------ Pour arreter la Thread
    		  finir = true;
    		  notify();
    	    }
     
    	    public void run() {   //------------------- Démarrage de la Thread
    		int L = panneauDisque.getSize().width;
    		int H = panneauDisque.getSize().height;
    		Graphics g = panneauDisque.getGraphics();
    		Graphics2D g2d = ( Graphics2D ) g.create();
    	        g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
    		finir = false;
    		    //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
    		    //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
    		 for (int i = 0; i < 30; i++) {   
    		    	try { sleep(200); }
    		    		catch (InterruptedException exc) {}
    		    	if (finir) break;  
    		    	g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
    		    	r += 10 ;
    		    	x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées selon une spirale
    		    	y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
    		    	g2d.drawString( "Bravo !", x, y );
    		 }
    	    }  // Fin de la méthode run de la thread
    	} //Fin de la classe MaThread
     
    	class PanneauCentre extends JPanel {  //== Classe PanneauCentre
    		private static final long serialVersionUID = 1L;
    		JButton boutonGagné;
    		JButton[] pion = new JButton[15]; 
    		boolean bravo = false, finir = false;
    		MaThread thread = null;
    		JPanel panneau;
     
    		public PanneauCentre () {   //------------------- Constructeur
    			setLayout(new FlowLayout());	
    			//Remplissage de la grille avec des boutons et des labels
    			for (int k=0 ; k<pion.length; k++) {
    				pion[k] = new JButton("bouton"+k);
    				pion[k].setEnabled(false);
    				add(pion[k]);
    				JPanel vide = new JPanel();
    				add(vide);
    			}
    			boutonGagné = new JButton ("Valider la partie");
    			add(boutonGagné);
    			this.panneau = this;
    			jeu();  //on lance le jeu
    		} // Fin du constructeur PanneauCentre 
     
    		public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
    			int L = this.getSize().width;
    			int H = this.getSize().height;
    			super.paintComponent(g);
    			Graphics2D g2d = ( Graphics2D ) g.create();
    		        /*
    			 *   (diverses instructions)
    			 */
    		} // Fin de PaintComponent
     
    		public void jeu() {   //----------------- Une partie de jeu
    			/*
    			 *   le déroulement du jeu (diverses instructions)
    			 */
     
    			boutonGagné.addActionListener(new ActionListener() {
    					public void actionPerformed(ActionEvent e) {
                                                   //validation de la partie
    						bravo = true;
    						if ((thread == null)||(!thread.isAlive())) {
    						     thread = new MaThread(panneau);
    						     thread.start(); // animation
    							}
    		       getContentPane().addMouseListener(new MouseAdapter(){
    				        public void mousePressed(MouseEvent e){
                                          //arrêt de l'animation dès qu'on clique sur l'écran
    				                if (thread != null) thread.stopper();
    				                 thread = null;				             		
    				                 }
    				       public void mouseReleased(MouseEvent e){
    				                if (thread != null) thread.stopper();
    				             	    thread = null;
    				                }
     
    				        public void mouseEntered(MouseEvent e) { }
     
    				        public void mouseExited(MouseEvent e) { }
    					});
    					}
    				});
    		} //Fin de la méthode "jeu"
    }//Fin de la classe PanneauCentre
     
    	public void init() {
    		this.setSize(250, 250);
    		JPanel panneau = new PanneauCentre();
    		getContentPane().add(panneau);
    	}
    }
    Images attachées Images attachées  

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    tu devrais plutôt créé une BufferedImage, que tu dessines dans ton panel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
    			int L = this.getSize().width;
    			int H = this.getSize().height;
    			super.paintComponent(g);
    			if ( imageHandler.getImage()!=null ) g.drawImage(imageHandler.getImage(), 0, 0, null);
    		} // Fin de PaintComponent
    j'utilise ici une classe ImageHandler car il faut créer une image qui fait la dimension du panel, or lorsqu'il fait 0,0 on ne peut pas créé de BufferedImage

    le dessin de l'image est fait après l'appel de super.paintComponent(g) qui dessine le fond du panel, donc "efface" le fond en dessinant un rectangle plein de la taille du panel

    les boutons seront déssinés eux dans paintChildren(Graphics g) : donc on interfère pas avec le dessin des boutons, qui sont dessinés après donc au dessus de l'image


    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
    public static class ImageHandler {
    		private BufferedImage image;
    		public BufferedImage getImage() {
    			return image;
    		}
    		public BufferedImage getImage(int width, int height) {
    			if ( (width>0 && height>0 ) && (image==null || image.getWidth()<width || image.getHeight()<height) ) {
                                    // si la taille du panel est > 0, si l'image n'existe pas ou que l'image précédente était plus petite, on créé une nouvelle image
    				BufferedImage newimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    				if (image!=null) {
                                            // on dessine l'image précédente dans la nouvelle image, pour ne pas perdre les "bravos" précédents
    					Graphics2D g=newimage.createGraphics();
    					g.drawImage(image, 0,0, null);
    					g.dispose();
    				}
    				image=newimage;
    			}
    			return image;
    		}
     
    	}
    je créé une image de type BufferedImage.TYPE_INT_ARGB, pour qu'elle soit transparent, ainsi elle laissera le fond du panel tel quel

    tu passes à ton thread la référence du panel juste pour connaitre sa taille au moment ou tu dessine, et la référence du ImageHandler, pour dessiner (voir en bleu ci-après)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaThread(JPanel panel,ImageHandler image) { //----------- Constructeur
    	    	this.panneauDisque=panel;
    	    	this.image = image;
    	    }
    voilà ta méthode run modifiée

    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
    	    public void run() {   //------------------- Démarrage de la Thread
    		finir = false;
    		    //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
    		    //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
    		 for (int i = 0; i < 30; i++) {   
                       	try { sleep(200); }
    		    		catch (InterruptedException exc) {}
    		    	if (finir) break;  
    				int L = panneauDisque.getSize().width;
    				int H = panneauDisque.getSize().height;
    				Graphics2D g2d = image.getImage(L,H).createGraphics();
    			        g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
    		    	g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
    		    	r += 10 ;
    		    	x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées selon une spirale
    		    	y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
    		    	g2d.drawString( "Bravo !", x, y );
    
    				 g2d.dispose();
    				 repaint();
    		 }
    	    }  // Fin de la méthode run de la thread
    attention : pense toujours à disposer un graphics que tu créés (voir en orange)

    dans ton catch pour le sleep, je mettrais finir=true (ou break):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                       	try { sleep(200); }
    		    		catch (InterruptedException exc) {
    finir=true;}
    ceci évitera qu'en cas d'arrêt forcé de ton appli, la boucle continue de dessiner alors qu'on devrait s'arrêter
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Candidat au Club
    Femme Profil pro
    Enseignant
    Inscrit en
    Avril 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Re-Bonjour,

    Super !!!! Merci ça fonctionne ...
    (J'ai un peu buggé sur une instanciation mais c'est ma faute .. mon petit niveau avec les objets.)

    Merci beaucoup pour ton aide.

    Voici le code corrigé pour les futurs débutants et je mets le sujet en "Résolu".

    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    public class essai2 extends JApplet {
    	private static final long serialVersionUID = 1L;
     
    	class MaThread extends Thread {    //============================= Classe MaThread
    		int r = 0, x = 0, y = 0;
    	    boolean finir;
    	    JPanel panneauDisque;
    	    ImageHandler image;
     
    	    MaThread(JPanel panel,ImageHandler image) { //----------- Constructeur
    	    	this.panneauDisque=panel;
    	    	this.image = image;
    	    }
     
    	   synchronized void stopper() {  //------------ Pour arreter de la Thread
    		  finir = true;
    		  notify();
    	    }
     
     
    	    public void run() {   //------------------- Démarrage de la Thread
    		finir = false;
    		    //Animation = Ecrire pleins de "Bravo !" dans le fond d'écran
    		    //Cette Animation s'arrête si on clic sur l'écran (finir -> false)
    		 for (int i = 0; i < 30; i++) {   
    			 	try { sleep(200); }
    	    		catch (InterruptedException exc) {finir=true; break;}
    		    	if (finir) break;  
    				int L = panneauDisque.getSize().width;
    				int H = panneauDisque.getSize().height;
    				Graphics2D g2d = image.getImage(L,H).createGraphics();
    			    g2d.setFont( new Font( "Tiresias PCFont Z", Font.BOLD, 40 ) );
    		    	g2d.setColor(new Color((528424*i)%Integer.MAX_VALUE)); //variation de couleur
    		    	r += 10 ;
    		    	x = (int) (L/2 + r*Math.cos(i*Math.PI/6)); //coordonnées d'une spirale
    		    	y = (int) (H/2 - r*Math.sin(i*Math.PI/6));
    		    	g2d.drawString( "Bravo !", x, y );
    				g2d.dispose();
    				repaint();
    		 }
    	    }  // Fin de la méthode run de la thread
    	} //Fin de la classe MaThread
     
    	public class ImageHandler  {
    		BufferedImage image = null;
     
    		public BufferedImage getImage() {
    			return image;
    		}
    		public BufferedImage getImage(int width, int height) {
    			if ( (width>0 && height>0 ) && (image==null || image.getWidth()<width || image.getHeight()<height) ) {
                    // si la taille du panel est > 0, si l'image n'existe pas ou que l'image précédente était plus petite, on créé une nouvelle image
    				BufferedImage newimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    				if (image!=null) {
                    // on dessine l'image précédente dans la nouvelle image, pour ne pas perdre les "bravos" précédents
    					Graphics2D g=newimage.createGraphics();
    					g.drawImage(image, 0,0, null);
    					g.dispose();
    				}
    				image=newimage;
    			}
    			return image;
    		}
     
    	}
     
    	class PanneauCentre extends JPanel 	{  //======================= Classe PanneauCentre
    		private static final long serialVersionUID = 1L;
    		JButton boutonGagné;
    		JButton[] pion = new JButton[15]; 
    		boolean bravo = false, finir = false;
    		MaThread thread = null;
    		JPanel panneau;
    		ImageHandler imageHandler = new ImageHandler() ;
     
    		public PanneauCentre () {   //-------------------------------------- Constructeur
    			setLayout(new FlowLayout());
     
    			//Remplissage de la grille avec des boutons et des labels
    			for (int k=0 ; k<pion.length; k++) {
    				pion[k] = new JButton("bouton"+k);
    				pion[k].setEnabled(false);
    				add(pion[k]);
    				JPanel vide = new JPanel();
    				add(vide);
    			}
    			boutonGagné = new JButton ("Valider la partie");
    			add(boutonGagné);
    			this.panneau = this;
    			jeu();  //on lance le jeu
    		} // Fin du constructeur PanneauCentre 
     
    		public void paintComponent(Graphics g) {  //----- Toile de fond paintComponent
    			int L = this.getSize().width;
    			int H = this.getSize().height;
     
    			super.paintComponent(g);
    			if (imageHandler.getImage() != null) g.drawImage(imageHandler.getImage(), 0, 0, null);
     
    		} // Fin de PaintComponent
     
    		public void jeu() {   //----------------- Une partie de jeu
    			/*
    			 *   le déroulement du jeu (diverses instructions)
    			 */
     
    			boutonGagné.addActionListener(new ActionListener() {
    					public void actionPerformed(ActionEvent e) { //validation de la partie
    							bravo = true;
    							if ((thread == null)||(!thread.isAlive())) {
     
    									    thread = new MaThread(panneau,imageHandler);
    									    thread.start(); // déclenchement de l'animation
    							}
     
    							getContentPane().addMouseListener(new MouseAdapter(){
    				                     public void mousePressed(MouseEvent e){   //arrêt de l'animation dès 
    				                    	 if (thread != null) thread.stopper(); //qu'on clique sur l'écran
    				             		    thread = null;				             		
    				                     }
    				                     public void mouseReleased(MouseEvent e){
    				                    	 if (thread != null) thread.stopper();
    				             		    thread = null;
    				                     }
     
    				                     public void mouseEntered(MouseEvent e) { }
     
    				                     public void mouseExited(MouseEvent e) { }
    							});
    					}
    				});
    		} //Fin de la méthode "jeu"
    }//Fin de la classe PanneauCentre
     
    	public void init() {
    		this.setSize(250, 250);
    		JPanel panneau = new PanneauCentre();
    		getContentPane().add(panneau);
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/03/2007, 16h52
  2. [c#] Mettre une fenêtre derrière les icones du bureau
    Par MoTUmBo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/03/2007, 12h56
  3. une question sur les composants
    Par m14w dans le forum Delphi
    Réponses: 2
    Dernier message: 17/05/2006, 19h26
  4. Réponses: 6
    Dernier message: 14/12/2004, 02h47
  5. [Swing] Mettre une police à tous les composants
    Par MrEddy dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 02/05/2004, 15h21

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