Domanda

I miei serrature GUI up perché ho bisogno di aggiornarlo tramite l'EDT, però, ho bisogno di passare anche una variabile che si sta Offerte GUI:

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

Questo non funziona. Ho bisogno di impostare il testo nella EDT, ma non posso passare numOfPlayers ad esso senza dichiararlo come finale (che io non voglio fare, perché ha cambiato come nuovi giocatori di unirsi al server)

È stato utile?

Soluzione

La soluzione più semplice sarebbe quella di utilizzare un final variabile temporanea:

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

Altri suggerimenti

Bisogna rendere definitiva o di avere il riferimento Runnable un campo (classe varable). Se fa riferimento a un campo di assicurarsi che sia sicuro filo (via sincronizzato o volatile).

Che ne dite di questo:

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

NOTA: Si considera che il PO ha una buona ragione per non marcatura numOfPlayers come finale, forse che è cambiato in seguito nello stesso ciclo while nel codice che non è pertinente alla questione, in modo da non mostrato. E così che numOfPlayers è dichiarato prima del ciclo while.

Senza questo presupposto, non vorrei fare la newText variabile aggiuntiva.

Definisci questa classe al di fuori del metodo:

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

(Ai fini di questo esempio, io parto dal presupposto che ci sia una buona ragione per cui si utilizza un ambito locale variabile TEMP finale non funziona. Onestamente non riesco a pensare di qualsiasi motivo di tale restrizione, però.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top