Passer des variables au fil de répartition de l'événement
-
09-09-2019 - |
Question
Mes verrous GUI parce que je dois le mettre à jour par l'EDT, cependant, je dois aussi passer une variable qui est en cours avec des mises à jour de l'interface:
while ((message = this.in.readLine()).startsWith("NUMPLAYERS"))
{
numOfPlayers = Integer.parseInt(message.split(":")[1]);
numPlayers.setText("There are currently " + numOfPlayers + " players in this game");
}
Cela ne fonctionne pas. Je dois mettre le texte dans l'EDT mais je ne peux pas passer à numOfPlayers sans le déclarer comme définitif (que je ne veux pas faire, parce qu'il a changé en tant que nouveaux joueurs rejoignent le serveur)
La solution
La solution la plus simple serait d'utiliser une variable temporaire final
:
final int currentNumOfPlayers = numOfPlayers;
EventQueue.invokeLater(new Runnable() {
public void run() {
numPlayers.setText("There are currently " +
currentNumOfPlayers + " players in this game");
}
});
Autres conseils
Vous devez faire final ou avoir la référence Runnable
un champ (classe varable). Si le référencement d'un champ assurez-vous qu'il est thread-safe (via synchronisée ou volatile).
Que diriez-vous ceci:
while ((message = this.in.readLine()).startsWith("NUMPLAYERS")) {
numOfPlayers = Integer.parseInt(message.split(":")[1]);
final newText = "There are currently " + numOfPlayers + " players in this game";
EventQueue.invokeLater(new Runnable() {
public void run() {
numPlayers.setText(newText);
}
});
}
NOTE: Je suppose que l'OP a une bonne raison de ne pas marquer numOfPlayers
comme définitive, peut-être qu'il est modifié par la suite dans la même boucle de while
dans le code qui ne sont pas pertinentes à la question, donc pas représenté. Et ainsi que numOfPlayers
est déclaré avant que la boucle de while
.
Sans cette hypothèse, je ne ferais pas la newText
variable supplémentaire.
Définissez cette classe en dehors de votre méthode:
public abstract class MyRunnable implements Runnable {
protected int var;
public MyRunnable (int var) {
this.var = var;
}
}
Now your code can look like this:
SwingUtilities.invokeAndWait(new MyRunnable(5) {
@Override
public void run() {
//numPlayers.setText("There are currently " + var + " players in this game");
}
});
(Aux fins de cet exemple, je suppose qu'il ya une bonne raison pour laquelle l'aide d'un ne fonctionnera pas variable température finale SCOPED localement. Honnêtement, je ne peux penser à aucune raison de cette restriction, cependant.)