2009-04-15 9 views
5

Moi GUI blokuje się bo muszę zaktualizować go poprzez EDT jednak muszę również przekazać zmienną, która jest w trakcie aktualizacji z GUI:Przekazywanie zmiennych do wątku Event Dispatch

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

robi to nie działa. Muszę ustawić tekst w EDT, ale nie mogę przekazać numOfPlayers do niego bez deklarowania go jako ostatecznego (czego nie chcę robić, ponieważ zmieniło się, gdy nowi gracze dołączą do serwera).

Odpowiedz

10

Najprostszym rozwiązaniem byłoby używać final tymczasową zmienną:

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

W tym przypadku wystarczy, aby zdefiniować zmienną lokalną w odpowiednim miejscu (i dokonać ostatecznego). –

2

Musisz zrobić to ostateczna lub mieć odniesienie Runnable pole (klasa varable). Jeśli odwołujesz się do pola, upewnij się, że jest bezpieczne dla wątków (poprzez synchronizację lub zmienność).

+0

Jak mam odwoływać się do zmiennej klasy? To byłoby idealne. –

1

Jak o tym:

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

UWAGA: Zakładam, że PO ma dobry powód nie znakowania numOfPlayers jako ostateczna, chyba że jest on zmieniany później w tym samym while pętli w kodzie, który nie jest właściwy do pytanie, więc nie pokazano. I tak, że numOfPlayers jest zadeklarowane przed pętlą while.

Bez tego założenia nie wykonałbym dodatkowej zmiennej newText.

+0

Brakujące ciągi poprzedzające źle pisany nowy tekst. Prawdopodobnie sprawi, że numOfPlayery staną się ostateczne po umieszczeniu deklaracji we właściwym miejscu. –

+0

@Tom Hawtin: Zaktualizowałem moją odpowiedź ... OP mówi, że ma dobry powód, aby nie robić ostatecznych numOfPlayerów. Zakładam, że wiąże się to z tym, dlaczego w próbie PO nie przedstawiono deklaracji zmiennej. A ponieważ złożyłeś skargę, zmieniłem kapitalizację newText. :) – Eddie

0

Zdefiniuj tę klasę poza metodę:

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

(Dla celów tego przykładu, jestem przy założeniu, że istnieje dobry powód, stosując miejscowo scoped zmienna temp końcowy nie będzie działać szczerze. nie można wymyślić żadnego powodu takiego ograniczenia.)

Powiązane problemy