2009-04-15 2 views
5

Meine GUI abstürzt, weil ich es durch die EDT aktualisieren müssen, aber ich muss auch eine Variable übergeben, die Updates mit der GUI wird:Passing Variablen an das Event Dispatch Thread

while ((message = this.in.readLine()).startsWith("NUMPLAYERS")) 
{ 
    numOfPlayers = Integer.parseInt(message.split(":")[1]); 
    numPlayers.setText("There are currently " + numOfPlayers + " players in this game"); 
} 

Dies tut nicht arbeiten. Ich muss den Text in der EDT setzen, aber ich kann numOfPlayers nicht übergeben, ohne es als endgültig zu deklarieren (was ich nicht tun möchte, weil sich neue Spieler dem Server anschließen)

Antwort

10

Die einfachste Lösung wäre eine final temporäre Variable zu verwenden:

final int currentNumOfPlayers = numOfPlayers; 
EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     numPlayers.setText("There are currently " + 
       currentNumOfPlayers + " players in this game"); 
    } 
}); 
+0

In diesem Fall muss nur die lokale Variable an einem geeigneten Punkt definiert werden (und endgültig gemacht werden). –

2

Sie müssen es endgültig oder zumindest solche Runnable Referenz ein Feld (Klasse varable) machen. Wenn Sie auf ein Feld verweisen, stellen Sie sicher, dass es Thread-sicher ist (über synchronisierte oder flüchtige).

+0

Wie würde ich die Klassenvariable referenzieren? Das wäre ideal. –

1

Wie wäre es damit:

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); 
     } 
    }); 
} 

HINWEIS: Ich gehe davon aus, dass die OP hat einen guten Grund für die nicht numOfPlayers als endgültige Markierung, vielleicht, dass es später in der gleichen while Schleife in Code geändert wird, die nicht relevant ist, zu die Frage, so nicht gezeigt. Und so wird numOfPlayers vor der while Schleife erklärt.

Ohne diese Annahme würde ich die zusätzliche Variable newText nicht machen.

+0

Fehlende Zeichenfolge vor schlecht aktiviertem Newtext. Wahrscheinlich kann numOfPlayers selbst final werden, nachdem die Deklaration an die richtige Stelle gesetzt wurde. –

+0

@Tom Hawtin: Ich habe meine Antwort aktualisiert ... Das OP sagt, dass er einen guten Grund hat, numOfPlayers nicht endgültig zu machen. Ich gehe davon aus, dass das OP-Beispiel die Variablendeklaration nicht anzeigt. Und weil du dich beschwert hast, habe ich die Groß- und Kleinschreibung von newText geändert. :) – Eddie

0

definieren diese Klasse außerhalb Ihrer Methode:

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

(Für die Zwecke dieses Beispiels, gehe ich davon aus, dass es einen guten Grund, warum mit einer lokal Endtemperatur Variable wird nicht funktionieren scoped ich ehrlich. kann jedoch keinen Grund für diese Einschränkung finden.)