Frage

Meine GUI abstürzt, weil ich es durch die EDT aktualisieren müssen, jedoch muss ich auch eine Variable übergeben, die Updates mit der GUI wird:

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

Das funktioniert nicht. Ich brauche den Text im EDT zu setzen, aber ich kann nicht numOfPlayers es passieren, ohne es als endgültig erklärt (was ich will nicht zu tun, weil es mich wie neue Spieler auf dem Server verbinden)

War es hilfreich?

Lösung

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

Andere Tipps

Sie müssen es endgültig machen oder die Runnable Referenz ein Feld (Klasse varable) haben. Wenn Referenzierung ein Feld stellen Sie sicher, dass es Thread-sicher (über synchronisiert oder flüchtig).

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 für die Frage ist, also nicht gezeigt. Und so, dass numOfPlayers vor der while Schleife deklariert wird.

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

Definieren Sie 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 scoped wird nicht funktionieren. Ich kann ehrlich nicht glauben, von irgendeinem Grund für diese Einschränkung, though.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top