Question

Je suis très nouveau à Java (seulement été utilisé pendant environ une semaine) et je travaille sur un simulateur de magasin. Fondamentalement, je veux juste faire avancer les choses de base fait en ce moment comme avoir un temps jusqu'à la fermeture et un temps variable depuis l'ouverture affichée à l'écran.

J'ai fait les fonctions suivantes dans ma simulation étend la classe javax.swing.JFrame:

public void incOpenTime() {
    timeOpen++;
    int hours = timeOpen / 3600;
    int minutes = (timeOpen % 3600) / 60;
    int seconds = (timeOpen % 3600) % 60;
    this.openTime.setText((hours < 10 ? "0" : "") + hours
            + ":" + (minutes < 10 ? "0" : "") + minutes
            + ":" + (seconds < 10 ? "0" : "") + seconds);
    decTimeLeft();
    }

public void decTimeLeft() {
    int remainingTime = 28800 - timeOpen;
    int hours = remainingTime / 3600;
    int minutes = (remainingTime % 3600) / 60;
    int seconds = (remainingTime % 3600) % 60;
    this.timeLeft.setText((hours < 10 ? "0" : "") + hours
            + ":" + (minutes < 10 ? "0" : "") + minutes
            + ":" + (seconds < 10 ? "0" : "") + seconds);

    }

La méthode variables en utilisant le setText () OpenTime et timeleft font partie de l'interface elle-même.

Dans principale, je l'appelle incOpenTime comme ceci:

while(this.timeOpen < 28800) 
{
    incOpenTime();

}

Tout d'abord, quand je lance ce qu'il est fondamentalement va juste à travers la boucle et les sorties que la dernière fois à l'écran. Comment puis-je faire pour que les temps changent constamment?

En second lieu, je voudrais retarder un peu ... peut-être environ 1 ms par seconde de sorte que la simulation est plus lent et d'autres données étant sortie à l'écran (plus tard) est plus lisible. J'ai essayé Thread.sleep (1); dans la boucle, mais il ne présente pas les chiffres qu'ils sont modifiés.

S'il vous plaît aide.

Merci

EDIT:

Voici ce que je l'ai fait pour le faire fonctionner. En principal:

timer = new Timer();
for(int i=1; i<= 28800; i++)
{
        timer.schedule(new task(), 1*i);

}

Fait une nouvelle classe:

class task extends TimerTask {

    @Override
    public void run() {
        incOpenTime();
        }
}
Était-ce utile?

La solution

Vous avez besoin d'un java.util.Timer

Edit: Comme il est la réponse acceptée, il est important de noter que le TimerTask doit exécuter son Runnable sur le thread d'envoi de l'événement. La variation correcte de cette approche est notée dans @ de mKorbel answer . Il y a un court exemple ci-dessous et plus élaboré un ici . Une approche un peu plus simple, suggérée par @Hovercraft, on voit

Autres conseils

javax.swing.Timer peut être un bon choix, comme « les gestionnaires événement d'action pour exécuter Timers sur ... le fil de distribution des événements. » Il y a un exemple .

votre sortie de backgroung Tâche ou fil à l'interface graphique n'est pas affiché correctement à l'EDT,

vous devez envelopper toute la production à l'interface graphique (de backgroung tâche ou fil) à la

invokeLater()

si la méthode pourrait être alors synchroni-

invokeAndWait()

S'il vous plaît en savoir plus sur Concurency Swing

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top