2012-05-11 11 views
6

के भीतर से एक गेम शुरू करें मेरे पास जावा में बनाया गया ब्लैकजैक गेम है और मैं बटन पर क्लिक करके गेम की शुरुआत को सिग्नल करना चाहता हूं। मेरे सभी एक्शन श्रोताओं ने बस ठीक काम किया है और यह सब कुछ है, लेकिन समस्या यह है कि मैं यह नहीं समझ सकता कि खेल को कैसे शुरू किया जाए बिना कार्रवाई के पूरी तरह से चल रहा है। जाहिर है, कार्रवाई के भीतर लगातार चल रहे एक फ़ंक्शन द्वारा समर्थित विधि प्रभावी ढंग से मेरे बाकी जीयूआई को अक्षम कर देगी। कोड स्निपेट है ....एक एक्शन श्रोता

go.addActionListener(new ActionListener() 
    { 
     public void actionPerformed(ActionEvent e) 
     { 
       // START GAME SOMEHOW but must run outside of action listener 
     } 
    }); 
+0

खेल शुरू होने पर क्या होता है? इसमें लूप नहीं होना चाहिए। सभी उपयोगकर्ता क्रियाएं घटनाएं होनी चाहिए। –

+0

मुझे लगता है कि एक अच्छा समाधान पूरे गेम को शुरू नहीं करना है, बल्कि कार्ड को बाहर निकालना और वापस करना। हालांकि, मैं जानना चाहता हूं कि एक प्रोग्राम श्रोता के भीतर से प्रोग्राम कैसे शुरू करें। मुझे लगता है कि यह संभव है, लेकिन मैं जावा के साथ नया हूं और वास्तव में इन पूरी कम्प्यूटिन मशीनों को पूरी तरह से कर रहा हूं। किसी भी सुझाव की सराहना की जाएगी !!! :) –

+0

आपके रीप्ले, जेबी के लिए धन्यवाद। मूल रूप से मैंने इसे एक नया गेम शुरू किया था, जो पूरी चीज को अपने कन्स्ट्रक्टर के भीतर चलाता है, इसलिए एक्शनप्रोर्फ़ेड विधि में बस लाइन थी: "गेम जी = नया गेम()" हालांकि, अब आप उल्लेख करते हैं कि यह एक ईवेंट होना चाहिए केवल मैं इतना अधिक सुनिश्चित हूं कि मैं इसे गलत तरीके से कर रहा था। हाहा –

उत्तर

1

आप खेल शायद अपनी ही धागे में शुरू करने और जो अपने आप (कहना मुश्किल) का प्रबंधन करना चाहिए, लेकिन आप आप एक नया "बाहरी" में अपने खेल शुरू कर सकता है के लिए जा रहा करने के लिए धागा, अपने actionPerformed में कुछ इस तरह:

public void actionPerformed(ActionEvent e) { 
    Thread thread = new Thread("Game thread") { 
     public void run() { 
      startGame(); //or however you start your game 
     } 
    }; 
    thread.start(); 
} 
+0

जब तक यह एक "फ्रेम-प्रति-सेकेंड" संचालित/लगातार एनिमेटेड एप्लिकेशन नहीं है, तो मैं कहूंगा कि एक अलग धागा शुरू करना जो * चलता है * गेम एक बुरा विचार जैसा लगता है। ActionPerfomed को केवल उपयोगकर्ता इंटरफ़ेस को समायोजित करना चाहिए, वापसी करें, और आगे के उपयोगकर्ता क्रियाओं की प्रतीक्षा करें। – aioobe

+0

वही है जो मैंने माना है कि खेल चल रहा है, वह वापस नहीं आ रहा है, मुझे बहुत प्रेरित घटना नहीं मिली। –

7

जाहिर है, एक समारोह लगातार actionPerformed विधि के भीतर चल प्रभावी रूप से मेरी जीयूआई के बाकी को निष्क्रिय कर देगा।

यह एक मान्य अवलोकन है और दिखाता है कि स्विंग के साथ काम करते समय आप मौलिक नियम को समझ चुके हैं।

आपका गेम सबसे अधिक संभावित घटना संचालित है (अगर मैं गलत हूं तो मुझे सही करें) तो बटन द्वारा की गई कार्रवाई को केवल नए कार्यक्रम में प्रोग्राम सेट करना चाहिए, और आगे की घटनाओं की प्रतीक्षा करनी चाहिए। यह कुछ भी नहीं है जो समय लेने वाला होना चाहिए, और आमतौर पर ईडीटी द्वारा किया जाता है।

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

कोड में, मुझे लगता है यह कुछ इस तरह दिखेगा:

go.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 

     // Remove the menu components 
     someJPanel.removeAll(); 

     // Show the game table 
     someJPanel.add(new GamePanel()); 

     someJPanel.revalidate(); 
     someJPanel.repaint(); 

     // done. Wait for further user actions. 
    } 
}); 
+0

मुझे लगता है कि यह बिल्कुल वैसा ही लगता है जो मुझे करना चाहिए।मैं इसे लागू करने जा रहा हूं और देखता हूं कि यह मुझे कहां लेता है। मुझे आश्चर्य है कि मुझे इतनी तेजी से इतनी प्रतिक्रिया मिली है। आप सभी द्वारा दी गई मदद के लिए मेरी ओर से प्रशंसा स्वीकारें!!! –

+1

हाँ, stackoverflow में आपका स्वागत है :-) – aioobe

1

मुझे विश्वास है कि आप javax.swing.SwingWorker का विस्तार करना चाहते हैं।

गैर-ui स्टार्ट-अप कार्यक्षमता doInBackground में चलती है और done विधि को यूई को अपडेट करने के लिए समाप्त होने पर कॉल किया जाएगा।

स्टार्ट-अप में क्या हो रहा है की स्थिति के साथ एक प्रगति पट्टी अद्यतन करने के लिए javadoc कक्षा विवरण में भी एक उदाहरण है।

संबंधित मुद्दे