2009-04-15 7 views
5

Mes serrures GUI parce que je dois le mettre à jour par l'EDT, cependant, je dois passer aussi une variable qui est mise à jour avec l'interface graphique:passage de variables à la Dépêche de l'événement fil

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 ne fonctionne pas. J'ai besoin de définir le texte dans l'EDT mais je ne peux pas lui passer numOfPlayers sans le déclarer comme final (ce que je ne veux pas faire, car il a changé lorsque de nouveaux joueurs rejoignent le serveur)

Répondre

10

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"); 
    } 
}); 
+0

Dans ce cas, il suffit de définir la variable locale à un point approprié (et rendu final). –

2

Vous devez faire final ou avoir la référence Runnable un champ (classe varable). Si vous faites référence à un champ, assurez-vous que le thread est sûr (via synchronisé ou volatile).

+0

Comment devrais-je référencer la variable de classe? Ce serait idéal. –

1

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 while dans le code qui est pas pertinent pour la question, donc pas montré. Et donc que numOfPlayers est déclaré avant la boucle while. Sans cette hypothèse, je ne ferais pas la variable supplémentaire newText.

+0

Chaîne manquante avant newtext mal capitalisé. Probablement peut numOfPlayers lui-même final après avoir mis la déclaration à la bonne place. –

+0

@Tom Hawtin: J'ai mis à jour ma réponse ... l'OP dit qu'il a une bonne raison de ne pas rendre numOfPlayers final. Je suppose que ceci est lié à pourquoi l'échantillon de l'OP n'affiche pas la déclaration de variable. Et parce que vous vous êtes plaints, j'ai changé la capitalisation de newText. :) – Eddie

0

Définir 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'utilisation d'une variable de température finale SCOPED locale ne fonctionne pas, je honnêtement. ne peut penser à aucune raison pour cette restriction, cependant.)