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 :

[awt.Color] Faire clignoter une couleur


Sujet :

AWT/Swing Java

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut [awt.Color] Faire clignoter une couleur
    Salut a tous!

    Je suis en train de developper une IHM avec AWT et Swing et j'aurai besoin d'aide concernant le clignotement des couleurs.

    J'ai cree differentes classes de symbole qui construisent des Graphics2D avec plusieurs couleur possible pour chaque suivant leurs etats.

    Dans certain cas il est necessaire d'afficher le symbole avec une couleur clignotante. Il est possible de creer des couleurs clignotante facilement?
    Par exemple sans passer par un Thread qui alterne mon symbole rempli en bleu puis en blanc et vis-versa...

    Merci d'avance!

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Utilises un Timer

  3. #3
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Bonjour, j'avais déja posté une classe qui fait à peu prêt ce que tu veux. Je pense que tu peux t'en inspirer :
    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
    import java.awt.Color;
    import java.util.Timer;
    import java.util.TimerTask;
     
    import javax.swing.JPanel;
    public class MonClignoteur extends Timer {
        private static final int PERIODE = 1000;
     
        private JPanel _panel;
        private boolean _greyPanel = false;
        public MonClignoteur(JPanel panel) {
            super("MonClignoteur");
            _panel = panel;
        }
     
        public void start() {
            schedule(new MyTask(), 0, PERIODE);
        }
     
        private class MyTask extends TimerTask {
            public void run() {
                //changer la couleur du panel
                if(!_greyPanel){
                    _panel.setBackground(Color.GRAY);
                    _greyPanel = true;
                }
                else {
                    _panel.setBackground(Color.RED);
                    _greyPanel = false;
                }
            }
        }
    }

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    sinok parle du javax.swing.Timer et CheryBen du java.util.Timer qui ne sont pas les meme!
    J'ai l'impression que le premier est plus adapte dans mon cas non?

    @CheryBen : J'ai essaye d'implementer ton code en remplacant le JPanel par ma couleur a faire clignoter :
    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
    import java.awt.Color;
     
    import java.util.Timer;
    import java.util.TimerTask;
     
    public class HMIBlinker extends Timer {
     
        private static final int delay = 500;
        private boolean test = false;
        private Color blinkingColor;
        private Color saveInput;
     
        public HMIBlinker(Color colorInput){
            super();
            blinkingColor = colorInput;
            saveInput = colorInput;
        }
     
        public void start() {
            schedule(new Task(), 0, delay);
        }
     
        private class Task extends TimerTask {
            public void run() {
                if(!test){
                    blinkingColor = Color.black;
                    test = true;
                }
                else {
                    blinkingColor = saveInput;
                    test = false;
                }                
            }
        }
    }
    Qu'en penses tu? Je l'ai teste mais aucun clignotement...

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Bah il faudrait peut être demander le repaint du composant dans lequel tu dessine le symbole que tu veux faire clignoter à chaque fois que tu changes de couleur.

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    Oui ; cependant pour des questions d'optimisation, nottament si son rendu est long ou lourd, mieux vaudrait qu'il demande uniquement le repaint() de la zone correspondant au symbole. De meme il lui faudra modifier son rendu pour faire des calculs d'intersection avec la zone de clip (getClip()) du Graphics de maniere a ce que cette optmisation soit effective (ces calculs sont simplifies par les methodes de l'interface Shape).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    Je reviens sur cette question qui n'est toujours pas resolu. J'ai temporairement contourne le probleme en creant des ImageIcon qui ouvre des fichiers GIF animes mais je prefererai valider la solution avec Timer!

    Pour info voila le paintComponent d'un des symboles en question:
    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
    Point2D p1 = new Point2D.Double(0,17);
    Point2D p2 = new Point2D.Double(0,7);
    Point2D p3 = new Point2D.Double(6,7);
    Shape Line1 = new Line2D.Double(p1, p2);
    g2.draw(Line1);
    Shape Line2 = new Line2D.Double(p2, p3);
    g2.draw(Line2);
    int xPointsSignal[] = {7,20,7};
    int yPointsSignal[] = {0,7,14};
     
    blinkingColor = new HMIBlinker(colorState);
    blinkingColor.start();
    g2.setColor(blinkingColor.getHMIBlinker());
     
    Shape Signal = new Polygon(xPointsSignal,yPointsSignal,3);
    g2.fill(Signal);
    A quel niveau je dois effectuer le repaint() d'apres vous?

  8. #8
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    bonjour,

    tu peux aussi utiliser de façon direct les threads. Voici un exemple qui n'est pas forcement optimisé

    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
    class Warning extends JPanel 
    {
        public String icone;
        public float transparency;
        public Thread anim = null;
        public boolean visibleClik = true;
        public boolean clik;
        BufferedImage bufferedImage;
     
     
        public Warning()
        {
            this("image/logo-attention.png");
        }
        public Warning(String icone)
        {
           // super();
            this.icone = icone;
            transparency = 1.0f;
            setOpaque(false);
            setPreferredSize(new Dimension(30,30));
            try {
                bufferedImage = ImageIO.read(getClass().getClassLoader().getResource(icone));
            }
            catch (IOException ex) {ex.printStackTrace();}
            started();
        }
     
        public void started()
        {
            setVisible(true);
            anim = new Thread(new Animator(true));
            anim.start();
        }
     
        public void stopped()
        {
            if (anim != null) {
    	        anim.interrupt();
    	        anim = null;
                    setVisible(false);
            }
        }
     
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D) g;
     
            if(visibleClik && clik)
            {
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,transparency));
            }
            else{
                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0));
            }
     
            if(bufferedImage!=null)
            {g2.drawImage(bufferedImage,0,0,null);}
     
        }
        public void setTransparency(float t)
        {
            transparency = t;
        }
        public BufferedImage brighter(BufferedImage buf)
        {
            int width;
            int height;
            width = buf.getWidth();
            height = buf.getHeight();
            for(int i=0;i<width;i++)
            {
                for(int j=0;j<height;j++)
                {
                    buf.setRGB(i,j,buf.getRGB(i,j)+0xFF000000);
                }
            }
            return buf;
        }
     
        protected class Animator implements Runnable
        {
            private boolean clik = true;
     
            protected Animator(boolean rampUp)
            {
                this.clik = clik;
            }
     
            public void run()
            {
                try {
                    while(!Thread.interrupted())
                    {
                        Warning.this.visibleClik = true;
                        Warning.this.repaint();
                        Thread.sleep(1000);                  //1000 = 1 seconde
                        Warning.this.visibleClik = false;
                        Warning.this.repaint();
                        Thread.sleep(700);                  //1000 = 1 seconde
                    }
                }
                catch(InterruptedException erreur){erreur.printStackTrace();}
     
            }
            public void setClik(boolean clik)
            {
                this.clik = clik;
            }
        }
     
    }
    Bon courage

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2005
    Messages
    251
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 251
    Par défaut
    Rebonjour,

    je crois qu'il manque des SwingUtilities.invokeLater dans la class au niveau des repaint. ça permettra que le repaint soit fait dans l'EDT.

    @+

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    Citation Envoyé par philippe13 Voir le message
    tu peux aussi utiliser de façon direct les threads.
    Non non non

    je crois qu'il manque des SwingUtilities.invokeLater dans la class au niveau des repaint. ça permettra que le repaint soit fait dans l'EDT.
    Oui mais plutot carrement sur tout ce qui touche a l'etat du composant. Donc chacun des deux blocs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning.this.visibleClik = true;
    Warning.this.repaint();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Warning.this.visibleClik = false;
    Warning.this.repaint();
    Mais a ce niveau la autant faire un Timer Swing c'est plus simple.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    @bouye: Peux tu me donner des precisions sur ton point de vue pour le repaint() de mon composant?
    En fait il faut lancer le timer pour le clignotement sur mon objet symbole cree mais je n'ai pas de clignotement il s'affiche avec sa couleur initiale uniquement...

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    J'ai trouvé cet exemple
    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 ();
      }
    }
    qui marche bien pour un JLabel, il faut juster l'adapter pour un JComponent dans mon cas!

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 899
    Billets dans le blog
    54
    Par défaut
    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
     
    import java.awt.*;
    import java.awt.event.*;
    import java.lang.ref.*;
    import javax.swing.*;
     
    public class Blink<T extends JComponent> extends Timer implements ActionListener, ComponentListener {
      private WeakReference<T> targetRef;
      private Color foreground;
     
      public Blink(T target) {
        super(1000, null);
        setRepeats(true);    
        addActionListener(this);
        targetRef = (target == null) ? null : new WeakReference<T>(target);
        if (target != null) {
          target.addComponentListener(this);
          if (target.isVisible()) {
    	System.out.println("Timer started");
    	start();
          }
        }
      }
     
      public void actionPerformed(ActionEvent e) {
        T target = (targetRef == null) ? null : targetRef.get();
        if (target == null) {
          stop();
        }
        else {
          if (foreground == null) {
    	foreground = target.getForeground();
    	target.setForeground(Color.RED);
          }
          else {
    	target.setForeground(foreground);
    	foreground = null;
          }
        }
      }
     
      public void componentShown(ComponentEvent e) {
        System.out.println("Timer restarted.");
        restart();
      }
     
      public void componentHidden(ComponentEvent e) {
        System.out.println("Timer stopped.");
        stop();
      }
     
      public void componentMoved(ComponentEvent e) {
      }
     
      public void componentResized(ComponentEvent e) {
      }
     
      public static void main(String... args) {
        SwingUtilities.invokeLater(new Runnable() {
    	@Override public void run() {
    	  JLabel label = new JLabel("Blinking label !");
    	  Blink<JLabel> blink = new Blink<JLabel>(label);
    	  JFrame frame = new JFrame("Test");
    	  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	  frame.add(label);
    	  frame.pack();
    	  frame.setLocationRelativeTo(null);
    	  frame.setVisible(true);
    	}
          });
      }
    }
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 6
    Par défaut
    @bouye: Impeccable ca clignote maintenant!
    Mais j'ai trouve pourquoi je ne voyais rien avec les autres solutions, c'etait a cause de mon Graphics2D dans le paintComponent des symboles je faisais setColor au lieu de setBackground ou setForeground!

    @ tous

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

Discussions similaires

  1. faire clignoter la couleur d'une cellule
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 10/12/2019, 11h55
  2. Faire clignoter une couleur dans Tedit
    Par redoran dans le forum Composants VCL
    Réponses: 11
    Dernier message: 07/09/2010, 15h59
  3. Réponses: 8
    Dernier message: 07/02/2006, 18h31
  4. Réponses: 2
    Dernier message: 13/12/2004, 15h16
  5. Réponses: 9
    Dernier message: 09/11/2004, 11h41

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