Rafraichir régulièrement un dessin après un évènement : avec Timer et pas Thread.sleep
Bonjour,
J'ai un dessin (Graphics) qui doit se rafraichir à intervalles réguliers (environ une fois par seconde). Le rafraichissement se déroule bien lorsqu'il est demandé par le programme principal. Mais lorsqu'il est demandé par un évènement (clic de bouton), seul le résultat final est affiché, et pas les dessins intermédiaires.
J'utilise la fonction Thread.sleep pour séparer deux affichages.
J'ai essayé de réduire au minimum mon code tout en laissant le problème apparant ... du coup il n'est pas "joli", mais il est court.
Ce code dessine un carré noir alternativement à gauche puis à droite de la fenêtre (cinq fois). Ensuite il y a un bouton qui permet de relancer le dessin du carré noir alternativement des deux côtés (pour cinq dessins).
Lorsqu'on lance le programme, les cinq premiers dessins sont bien affichés car ils n'ont pas été demandés par un clique de bouton. Ensuite lorsqu'on clic sur le bouton, rien ne se passe, et au bout des cinq itérations, le dessin final est affiché.
Voici le code :
imports
Code:
1 2 3
| import javax.swing.*;
import java.awt.*;
import java.awt.event.*; |
classe Fenetre
Code:
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
| public class Fenetre extends JFrame {
int x = 0;
public static void main(String[] args) {
new Fenetre();
}
Fenetre() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(200, 150);
Bouton avancerCinqFois = new Bouton(this);
avancerCinqFois.addActionListener(new GestionEvenement());
add(avancerCinqFois, BorderLayout.SOUTH);
setVisible(true);
avancerCinqFois();
}
void avancerUneFois() {
x = (x+100) % 200;
repaint();
}
void avancerCinqFois() {
for (int i = 0; i < 5; ++i) {
avancerUneFois();
try {Thread.sleep(500);}
catch (InterruptedException e) { }
}
}
public void paint(Graphics g) {
g.setColor(Color.white);
g.fillRect(0, 0, 200, 100);
g.setColor(Color.black);
g.fillRect(x, 0, 100, 100);
}
} |
classe Bouton
Code:
1 2 3 4 5 6 7 8
| class Bouton extends JButton {
Fenetre fenetre;
Bouton(Fenetre fenetre) {
super("avancer 5 fois");
this.fenetre = fenetre;
}
} |
classe GestionEvenement
Code:
1 2 3 4 5 6
| class GestionEvenement implements ActionListener {
public void actionPerformed(ActionEvent evenement) {
Bouton bouton = (Bouton)evenement.getSource();
bouton.fenetre.avancerCinqFois();
}
} |
Quelqu'un as-t'il déjà eu le problème ?