/ / Java - invokeAndWait - comment l'utiliser? - java, balançoire

Java - invokeAndWait - comment l'utiliser? - java, balançoire

J'ai pour boucle ici:

for(int i=0; i<=10; i++)
{
a = r.nextInt(y - x + 1) + x;
label5.setText("Losowanie... " + a);
try {
Thread.sleep(100);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}

}

Je veux utiliser invokeAndWait pour mettre "a" à label5 à chaque fois (boucle), mais je ne sais pas comment l'utiliser. Quelqu'un peut-il m'en parler?

Réponses:

2 pour la réponse № 1

Vous ne voulez pas utiliser invokeAndWait (). Cela ne vous aidera pas car vous utilisez toujours Thread.sleep () avec signifie que l'interface graphique ne pourra pas se repeindre avant la fin de l'exécution de la boucle.

Au lieu de cela, vous devez utiliser un Swing Timer.

Après avoir lu le didacticiel sur les bases du minuteur, vous pouvez également vérifier: Mettre à jour une étiquette avec une minuterie Swing pour un exemple simple.


2 pour la réponse № 2

En supposant que cela se fasse dans un fil d’arrière-plan, vous ne voudriez même pas utiliser invokeAndWait mais plutôt utiliser invokeLater. Vous "enroulez le label5.setText(...) dans un Runnable et passez-le dans invokeLater(...).

for(int i=0; i<=10; i++) {
// made final to pass into inner class
final int finalA = r.nextInt(y - x + 1) + x;
SwingUtilities.invokeLater(() -> {
label5.setText("Losowanie... " + finalA);
});
try {
Thread.sleep(100);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}

Meilleure solution encore, si le code est dans le fil de l'événement, utilisez simplement une minuterie Swing

int delay = 100;
new Timer(delay, new ActionListener() {
private int i = 0;
private final maxI = 10;

public void actionPerformed(ActionEvent e) {
if (i < maxI) {
String a = r.nextInt(y - x + 1) + x;
label5.setText("Losowanie... " + a);
} else {
((Timer) e.getSource()).stop();
}
i++;
}
}).start();

-1 pour la réponse № 3
for(int i=0; i<=10; i++)
{
a = r.nextInt(y - x + 1) + x;
label5.setText("Losowanie... " + a);
Timer timer = new Timer(100, this);
timer.start();

}

Comme ça, ça ne marche pas.

Comme ça, travaillez, mais tout au long et après la boucle alors ....

Timer timer = new Timer(100, new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
for(int i=0; i<=10; i++)
{
a = r.nextInt(y - x + 1) + x;
label5.setText("Losowanie... " + a);
}
}
});
timer.start();