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);
});
}
} |
Partager