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)

Était-ce utile?

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.)

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