2009-04-15 17 views
5

Benim GUI kilitler kadar o GUI ile güncellemelerini ediliyor: Bu doesGeçme değişkenleri Ben, ancak, ben de bir değişken geçmesi gerekiyor EDT aracılığıyla güncellemeniz gerekir çünkü

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

çalışmıyor Metni EDT olarak ayarlamam gerekiyor ama numOfPlayers'ı son olarak ilan etmeden iletemiyorum (bunu yapmak istemiyorum, çünkü yeni oyuncular sunucuya katıldıkça değişti)

cevap

10

En kolay çözüm bir final geçici değişkeni kullanmaktır:

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

Bu durumda, sadece uygun bir noktada tanımlanacak yerel değişkeni (ve son haline getirilmiş) gerektirir. –

2

bunu nihai yapmak veya Runnable ilgili referans alan (sınıf varable) olması gerekir. Bir alana referans verirseniz, iş parçacığının güvenli olduğundan emin olun (senkronize veya uçucu).

+0

Sınıf değişkenine nasıl başvurulur? Bu ideal olurdu. –

1

nasıl bu konuda:

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

NOT: Ben OP alakalı olmasa da kodunda aynı while döngü içinde sonradan değiştirilir belki de bu son olarak numOfPlayers işaretleme için değil iyi bir nedeni olduğunu varsayalım soru, bu yüzden gösterilmiyor. Ve böylece numOfPlayerswhile döngüsünden önce bildirildi.

Bu varsayım olmadan, newText ek değişkenini yapmam.

+0

Büyük harfle yazılmış büyük harflerden önce eksik Dize. Muhtemelen beyanı doğru yere koyduktan sonra numOfPlayers'ın kendisini nihai haline getirebilir. –

+0

@Tom Hawtin: Cevabımı güncelledim ... OP, numOfPlayers finalini yapmamanın iyi bir sebebi olduğunu söylüyor. Bunun, OP'nin örnekleminin neden değişken beyanı göstermediğine bağlı olduğunu düşünüyorum. Ve şikayet ettiğin için, newText'in büyük harfini değiştirdim. :) – Eddie

0

senin yöntemin dışında bu sınıfı tanımlayın:.

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

(Bu örneğin amaçları doğrultusunda, ben dürüst bir yerel son sıcaklık değişken çalışmaz kapsamlı kullanarak bir nedeni olduğunu varsayıyorum Ancak bu kısıtlama için herhangi bir sebep düşünemiyorum.)