2009-12-07 5 views
0

J'ai un morceau de code en Java qui dessine 2 icônes à l'écran. Je veux imposer un délai entre eux, et je ne suis pas sûr de la meilleure façon.Délai entre le dessin de deux icônes en Java

En ce moment j'ai;

cell.setIcon(image1); 
Thread.sleep(500); // Ignored try() for brevity 
cell2.setIcon(image2); 

Mais cela semble entraîner le retard avant que soit sont tirés. Pourquoi est-ce, et comment puis-je le réparer?

+0

qu'est-ce que 'cell'? – skaffman

+0

cellule est un JLabel – tsvallender

Répondre

4

En supposant que vous utilisez Swing, vous devez faire le sommeil à effectuer sur un thread de travail, comme suit:

new SwingWorker<Void,Void>() { 
    @Override 
    protected Void doInBackground() throws Exception { 
     Thread.sleep(500); 
     return null; 
    } 
    @Override 
    protected void done() { 
     cell2.setIcon(image2); 
    } 
}.execute(); 
2

Devon a la meilleure réponse pour le comment. En ce qui concerne le pourquoi, le problème fondamental est que la fonction setIcon ne contient pas le code qui repeint votre composant. Le flux ressemble à ceci:

1) Vous cliquez quelque chose sur l'interface graphique
2) Un événement est généré, Swing appelle tous les auditeurs
3) Votre code est déclenché et d'exécution, setIcon est appelé
4) Votre code finit de s'exécuter et le contrôle revient à Swing
5) Swing peint tous les composants nouveaux/modifiés, etc.

Tout cela se passe sur un thread. Vous voulez que votre délai se produise après l'étape 3, mais vous ne voulez pas bloquer le thread en cours car l'étape 5 ne s'exécutera qu'après le délai. La solution de Devon utilise un SwingWorker pour mettre le retard sur un thread différent de sorte qu'il ne bloque pas l'étape 5.

1

Je voudrais utiliser un temporisateur d'oscillation. Lorsque vous affichez la première icône, vous démarrez le minuteur. Lorsque la minuterie se déclenche, vous affichez la deuxième icône.

Lisez la section du tutoriel Swing sur How to Use Timers pour plus d'informations.