2009-04-15 8 views
5

Mis GUI se bloquea porque tengo que actualizarlo a través de la EDT, sin embargo, tengo que pasar también una variable que está siendo actualizaciones con la interfaz gráfica de usuario:las variables de pasar al hilo de eventos Despacho

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

Esto hace no trabajo. Necesito configurar el texto en el EDT pero no puedo pasar numOfPlayers sin declararlo como final (lo cual no quiero hacer, porque cambió a medida que nuevos jugadores se unen al servidor)

Respuesta

10

La solución más fácil sería utilizar una variable temporal final:

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

En este caso, solo necesita que la variable local se defina en un punto apropiado (y se haga definitiva). –

2

tienes que hacer que sea definitiva o la referencia Runnable un campo (varable clase). Si hace referencia a un campo, asegúrese de que sea seguro para subprocesos (mediante sincronización o volátil).

+0

¿Cómo haré referencia a la variable de clase? Eso sería ideal. –

1

¿Qué tal esto:

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: Asumo que el PO tiene una buena razón para no marcar numOfPlayers como final, tal vez que se cambia más adelante en el mismo bucle while en código que no es relevante para la pregunta, entonces no se muestra. Y, por lo tanto, se declara numOfPlayers antes del bucle while.

Sin esta suposición, no crearía la variable adicional newText.

+0

Falta la cadena antes del texto nuevo mal escrito. Probablemente pueda hacer que numOfPlayers sea final después de colocar la declaración en el lugar correcto. –

+0

@Tom Hawtin: Actualicé mi respuesta ... el OP dice que tiene una buena razón para no hacer que la función numOfPlayers sea definitiva. Supongo que esto se relaciona con por qué la muestra de OP no muestra la declaración de la variable. Y debido a que se quejó, cambié el uso de mayúsculas de newText. :) – Eddie

0

Definir esta clase fuera de su método:

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

(Para los fines de este ejemplo, estoy asumiendo que hay una buena razón por la cual el uso de un con ámbito local variable TEMP final no va a trabajar honestamente. Sin embargo, no se puede pensar en ninguna razón para esa restricción.)

Cuestiones relacionadas