Fornire le variabili ad Discussione Event spedizione
-
09-09-2019 - |
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)
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ò.)