2009-09-16 5 views
4

En ce moment, j'ai du code qui ressemble à ceci:Comment créer un javax.swing.Timer qui se déclenche immédiatement, puis toutes les t millisecondes?

Timer timer = new javax.swing.Timer(5000, myActionEvent); 

D'après ce que je vois (et le Javadocs for the Timer class), la minuterie attendra 5000 millisecondes (5 secondes), déclenche l'événement d'action, attendre 5000 millisecondes, le feu à nouveau, et ainsi de suite. Cependant, le comportement que j'essaie d'obtenir est que le temporisateur est démarré, l'événement est déclenché, le temporisateur attend 5000 millisecondes, se déclenche à nouveau, puis attend avant de tirer à nouveau. À moins d'avoir manqué quelque chose, je ne vois pas comment créer une minuterie qui n'attend pas avant de tirer. Y a-t-il une bonne façon de l'imiter?

Répondre

10

Vous pouvez uniquement spécifier le délai dans le constructeur. Vous devez modifier le délai initial (le temps avant le premier événement). Vous ne pouvez pas définir dans le constuctor, mais vous pouvez utiliser la méthode setInitialDelay de la classe Timer.

Si vous avez besoin sans attendre avant la première mise à feu:

timer.setInitialDelay(0); 
+0

Est-ce que la seule façon? Je voudrais le faire dans le constructeur, si possible, mais il semble que ce n'est pas possible. Quel genre de suce ... –

+0

Pas un tel constructeur. Ne sais pas pourquoi. – asalamon74

+0

Pourriez-vous aussi ajouter votre commentaire sur ce ne pouvant pas être défini par l'intermédiaire d'un constructeur à votre affichage, aussi bien? Cela ferait juste mieux pour les gens qui cherchent. Merci de votre aide. –

0

Je ne voudrais pas utiliser une minuterie du tout, mais au lieu d'utiliser un ScheduledExecutorService

import java.util.concurrent.* 

... 

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); 
executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS); 

S'il vous plaît noter qu'il ya scheduleAtFixedRate() et scheduleWithFixedDelay() qui ont une sémantique légèrement différente. Lisez le JavaDoc et découvrez lequel vous avez besoin.

+2

Les mises à jour des composants Swing doivent être effectuées sur l'EDT. Une minuterie d'oscillation s'exécute dans l'EDT. De la lecture que j'ai faite le ScheduledExecutorService ne s'exécute pas dans l'EDT et ne devrait pas être utilisé avec Swing. – camickr

0

solution simple:

Timer timer = new javax.swing.Timer(5000, myActionEvent); 
myActionEvent.actionPerformed(new ActionEvent(timer, 0, null)); 

Mais j'aime timer.setInitialDelay(0) beaucoup mieux.

2

Je ne sais pas si ce sera d'un grand secours, mais:

Timer timer = new javax.swing.Timer(5000, myActionEvent){{setInitialDelay(0);}}; 
+0

C'est assez moche, mais je pense que la meilleure solution que l'OP veut un one-liner. +1 – brimborium

Questions connexes