2009-04-15 5 views
5

मेरे जीयूआई ताले अप क्योंकि मैं, फिर भी, मैं भी एक चर पास करनी होगी EDT के माध्यम से अद्यतन करने की आवश्यकता है कि जीयूआई के साथ अद्यतन किया जा रहा है:पासिंग चर

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

यह करता है काम नहीं। मुझे ईडीटी में टेक्स्ट सेट करने की ज़रूरत है, लेकिन मैं इसे अंतिम रूप से घोषित किए बिना numOfPlayers को पास नहीं कर सकता (जो मैं नहीं करना चाहता, क्योंकि यह नए खिलाड़ियों के रूप में बदलता है क्योंकि यह बदलता है)

उत्तर

10

सबसे आसान समाधान होगा एक final अस्थायी चर का उपयोग करने के लिए:

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

इस मामले में, इसे केवल स्थानीय चर को उचित बिंदु (और अंतिम बनाया गया) पर परिभाषित करने की आवश्यकता है। –

2

आप इसे अंतिम बनाने या Runnable संदर्भ एक क्षेत्र (वर्ग varable) करना होगा। यदि किसी फ़ील्ड को संदर्भित करना सुनिश्चित करें कि यह थ्रेड सुरक्षित है (सिंक्रनाइज़ या अस्थिर के माध्यम से)।

+0

मैं कक्षा चर का संदर्भ कैसे दूंगा? यह आदर्श होगा। बुरी तरह पूंजीकृत न्यूटेक्स्ट से पहले –

1

कैसे इस बारे में:

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

नोट: मुझे लगता है कि ओपी के लिए प्रासंगिक नहीं है numOfPlayers अंतिम के रूप में चिह्नित नहीं, के लिए एक अच्छा कारण शायद यह है कि यह कोड में एक ही while पाश में बाद में बदला जाता है कि सवाल, तो नहीं दिखाया गया। और इस प्रकार numOfPlayerswhile लूप से पहले घोषित किया गया है।

इस धारणा के बिना, मैं अतिरिक्त चर newText नहीं बनाऊंगा।

+0

गुम स्ट्रिंग। संभवतः सही स्थान पर घोषणा करने के बाद numOfPlayers स्वयं को अंतिम बना सकते हैं। –

+0

@ टॉम हौटिन: मैंने अपना जवाब अपडेट किया ... ओपी का कहना है कि उनके पास numOfPlayers को अंतिम बनाने के लिए एक अच्छा कारण नहीं है। मुझे लगता है कि यह संबंध है कि ओपी का नमूना परिवर्तनीय घोषणा क्यों नहीं दिखाता है। और क्योंकि आपने शिकायत की है, मैंने newText के पूंजीकरण को बदल दिया है। :) – Eddie

0

अपने विधि के बाहर इस वर्ग को परिभाषित करें:

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

(इस उदाहरण के प्रयोजनों के लिए, मैं यह सोचते हैं रहा हूँ वहाँ एक अच्छा कारण है कि एक स्थानीय रूप से scoped अंतिम अस्थायी चर काम नहीं करेगा उपयोग कर रहा है कि मैं ईमानदारी से। हालांकि, उस प्रतिबंध के किसी भी कारण के बारे में सोच नहीं सकते हैं।)