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 :

Changer couleur d'une figure avec Timer


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 64
    Par défaut Changer couleur d'une figure avec Timer
    Bonsoir, je vous explique mon soucis:

    J'aimerais pouvoir dessiner à l'aide de Graphics2D et avec le timer pouvoir changer de couleur à ma figure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g.setColor(Color.BLUE);
    		((Graphics2D) g).setStroke(new BasicStroke(8));
    		g.drawLine(300, 200,10,200);
    J'essaye de faire un peu la même chose que cela mais cet exemple est avec un JLabel


    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
    /*
     * BlinkingLabel.java  1.0
     * 
     * Copyright (c) 1999 Emmanuel PUYBARET - eTeks.
     * All Rights Reserved.
     *
     */
     
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
     
    // Classe de label clignotant en utilisant 
    // alternativement la couleur par défaut du label 
    // et une autre couleur passée au constructeur 
    public class BlinkingLabel extends JLabel
    {  
      Color defaultColor;   // Couleur par défaut du label
      Color blinkingColor;  // Couleur de clignotement
      Timer timer;          // Timer déclenchant des tics
     
      // Constructeur 
      public BlinkingLabel (String text, 
                            Color  blinkingColor) 
      {	
        super (text);    
        this.blinkingColor = blinkingColor;
        this.defaultColor  = getForeground ();
     
        // Création et lancement du timer
        timer = createTimer ();
        timer.start ();
      }
     
      // Méthode renvoyant un timer prêt à démarrer
      private Timer createTimer ()
      {
        // Création d'une instance de listener 
        // associée au timer
        ActionListener action = new ActionListener ()
          {
            // Méthode appelée à chaque tic du timer
            public void actionPerformed (ActionEvent event)
            {
              // Inversion de la couleur
              if (getForeground ().equals (defaultColor))            
                setForeground (blinkingColor);
              else
                setForeground (defaultColor);
            }
          };
     
        // Création d'un timer qui génère un tic
        // chaque 500 millième de seconde
        return new Timer (500, action);
      }  
     
      // Méthode main () d'exemple de mise en oeuvre.
      // Utilisation : java BlinkingLabel
      public static void main (String [] args)
      {
        // Création de deux labels
        JLabel label1 = new BlinkingLabel ("Label 1", Color.blue);
        JLabel label2 = new BlinkingLabel ("Label 2", Color.red.darker ());
     
        // Ajout des labels à une fenêtre d'exemple
        JFrame frame = new JFrame ("Exemple");
        frame.getContentPane ().setLayout (new GridLayout (2, 1, 5, 5));
        frame.getContentPane ().add (label1);
        frame.getContentPane ().add (label2);
        frame.pack ();
        frame.show ();
      }
    }
    Merci de votre futur aide

  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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    Salut,

    J'utiliserais un java.util.Timer pour changer la couleur à intervalle régulier. java.util plutôt que javax.swing parce que la sélection de la couleur n'a pas besoin d'être faite dans l'EDT (Event Dispatch Thread = thread de SWING), et un repaint() permet de redessiner (dans l'EDT).

    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
    public class BlinkingColorPanel extends JPanel {
     
    	private volatile Color color;
     
    	/**
             * Paneau avec couleur clignotant entre 2 couleurs
             * @param period période de temps entre 2 clignotements
             * @param color1 couleur 1 (ou null pour invisible)
             * @param color2 couleur 2 (ou null pour invisible)
             */
    	public BlinkingColorPanel(long period, Color color1, Color color2) {
    		color=color1; // la couleur 1 au début
    		if ( color1!=null || color2!=null ) 
    		addAncestorListener(new AncestorListener() {
     
    			private Timer timer;
     
    			@Override
    			public void ancestorRemoved(AncestorEvent event) {
    				timer.cancel(); // si le parent est invisible : on arrête
    			}
     
    			@Override
    			public void ancestorMoved(AncestorEvent event) {
    			}
     
    			@Override
    			public void ancestorAdded(AncestorEvent event) {
    				// timer (java.util, pas javax.swing)
    				timer = new Timer(); // si le client est visible, on démarre le timer
    				timer.scheduleAtFixedRate(new TimerTask() {
     
    					@Override
    					public void run() {
    						color = color1.equals(color)?color2:color1; // on alterne entre les 2 couleurs selon la dernière couleur choisie
    						repaint(); // on redessine pour prendre en compte le changement de couleur
    					}
    				}, period, period); // lancement de la tâche avec un délai de period, avec déclenchement toutes les period ms
    			}
    		});
    	}
     
    	/**
             * Paneau avec couleur clignotant entre plusieurs couleurs
             * @param period temps entre 2 couleurs
             * @param colors le tableau de couleurs
             */
    	public BlinkingColorPanel(long period, Color...colors) {
    		if ( colors!=null && colors.length>0 ) { // si pas de couleurs on ne fait rien
    			color = colors[0]; // première couleurs du tableau au début
    			if ( colors.length>1 ) { // s'il n'y a qu'une seule couleur, il n'y a pas de clignotement
    				addAncestorListener(new AncestorListener() {
     
    					private Timer timer;
    					private int colorIndex=1;
     
    					@Override
    					public void ancestorRemoved(AncestorEvent event) {
    						timer.cancel(); // si le parent est invisible : on arrête
    					}
     
    					@Override
    					public void ancestorMoved(AncestorEvent event) {
    					}
     
    					@Override
    					public void ancestorAdded(AncestorEvent event) {
    						// timer (java.util, pas javax.swing)
    						timer = new Timer(); // si le client est visible, on démarre le timer
    						timer.scheduleAtFixedRate(new TimerTask() {
     
    							@Override
    							public void run() {
    								colorIndex++; // on prend la couleur suivante dans le tableau
    								colorIndex%=colors.length; // si on arrive à la fin du tableau, on recommence au début
    								color = colors[colorIndex]; // on prend la prochaine couleur
    								repaint(); // on redessine pour prendre en compte le changement de couleur
    							}
    						}, period, period); // lancement de la tâche avec un délai de period, avec déclenchement toutes les period ms
    					}
    				});
    			}
    		}
    	}
     
    	@Override
    	protected void paintComponent(Graphics g) {
    		super.paintComponent(g);
    		if ( color!=null ) { // si pas de couleur on n'affiche rien (=invisible)
    			g.setColor(color);
    			((Graphics2D) g).setStroke(new BasicStroke(8));
    			g.drawLine(300, 200,10,200);
    		}
    	}
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(()-> {
    			JFrame frame = new JFrame("Blinking color");
    			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    			JPanel panel = new JPanel(new GridLayout(0,2));
     
    			// 4 exemples
    			panel.add( new BlinkingColorPanel(500, Color.BLUE, Color.RED) ); // Entre bleu et rouge, toutes les 500 ms
    			panel.add( new BlinkingColorPanel(1000, Color.BLUE, Color.RED) ); // entre bleu et rouge, toutes les secondes
    			panel.add( new BlinkingColorPanel(1000, Color.BLUE, null) ); // entre bleu et invisible, toutes les secondes
    			panel.add( new BlinkingColorPanel(500, Color.RED, Color.ORANGE, Color.YELLOW, Color.ORANGE) ); // on cycle
     
    			frame.getContentPane().add( panel );
     
    			frame.setSize(500,500);
    			frame.setLocationRelativeTo(null);
    			frame.setVisible(true);
    		});
     
    	}
     
    }
    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
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 64
    Par défaut
    Merci
    ps est ce que tu sais comment je pourrais faire pour faire disparaitre totalement un JLabel et le refaire réapparaitre?

  4. #4
    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 : 55
    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
    Billets dans le blog
    2
    Par défaut
    JLabel.setVisible(boolean), mais là, commedans le premier exemple, avec javax.swing.Timer.
    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.

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/01/2008, 20h24
  2. Dessiner une figure avec graphics.h
    Par Firas_tn dans le forum C
    Réponses: 2
    Dernier message: 29/03/2006, 20h33
  3. Réponses: 1
    Dernier message: 08/03/2006, 20h07
  4. changer couleur d'une "case" selon clique
    Par Jéjé2reims dans le forum MFC
    Réponses: 4
    Dernier message: 05/02/2004, 12h19

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