2009-03-20 12 views
5

मैं अपने जीयूआई में प्रदर्शित करने के लिए सीएमडी प्रक्रिया से आउटपुट कैसे प्राप्त कर सकता हूं?मेरे जीयूआई (जावा) में सीएमडी आउटपुट प्रदर्शित करें

try { 
    String line; 
    Process p = Runtime.getRuntime().exec("cmd /c \"e:\\folder\\someCommands.cmd\""); 
    BufferedReader input = 
      new BufferedReader(new InputStreamReader(p.getInputStream())); 
    while ((line = input.readLine()) != null) { 
     System.out.println(line); 
    } 
    input.close(); 
} catch (Exception err) { 
    err.printStackTrace(); 
} 

मैं कोशिश यह कर दिया है:: इस कोड मैं इस प्रक्रिया को चलाने के लिए उपयोग कर रहा हूँ है

jLabel1.setText(line); 

... लेकिन जीयूआई पूरी तरह से बंद कर दिया जाता है, जबकि प्रक्रिया चल रही है, इसलिए बहुत अंत तक अद्यतन कुछ भी नहीं है, जो बहुत उपयोगी नहीं है। इसके अलावा सीएमडी ठीक काम करता है। मैं सिर्फ वास्तविक समय में आउटपुट प्रदर्शित करना चाहता हूं।

+0

क्या कोई कारण है कि आप JLabel बल्कि JTextArea का उपयोग क्यों करना चाहते हैं? – OscarRyz

+0

इस प्रश्न से रीयल-टाइम टैग को हटाने का सुझाव दें। रीयल-टाइम कंप्यूटिंग की परिभाषा के लिए http://en.wikipedia.org/wiki/Real-time देखें – andersoj

+0

["सॉफ़्टवेयर बंदर"] से यह उत्तर (http://stackoverflow.com/users/8946/software-monkey) करना चाहिए: OscarRyz

उत्तर

5

क्या आपने लेबल के पाठ को सेट करने के बाद() को पुन: चित्रित किया था?

वैसे भी, आपको आमतौर पर जीयूआई कार्यक्रम धागे पर एक लंबे ऑपरेशन को निष्पादित करने में संकोच करना चाहिए। इसके बजाय SwingWorker का उपयोग करने में देखें।

3

प्रक्रिया को चलाने के लिए आपको एक अलग थ्रेड शुरू करने की आवश्यकता होगी। कोड आप इसे चलाने के लिए उपयोग कर रहे हैं ज्यादातर सिर्फ धागा (या Runnable के) में डाला जा सकता है run() पद्धति के रूप में है, लेकिन JLabel में पाठ सेट करने के लिए, आप कुछ इस तरह का उपयोग करना चाहिए:

... 
while ((line = input.readLine()) != null) { 
    SwingUtilities.invokeLater(new SetTextRunnable(jLabel1, line)); 
} 
... 

class SetTextRunnable implements Runnable { 
    private String line; 
    private JLabel jLabel1 
    public SetTextRunnable(JLabel jLabel1, String line) { 
     this.jLabel1 = jLabel1; 
     this.line = line; 
    } 
    public void run() { 
     jLabel1.setText(line); 
    } 
} 

EDIT: बस कुछ देखा: स्पष्ट रूप से कक्षा SwingWorker इस तरह की चीज़ के लिए डिज़ाइन की गई थी, इसलिए यह आपके लिए एक और विकल्प है (यदि यह जावा के आपके संस्करण में मौजूद है)।

EDIT संपादित करें: तो मुझे मूर्खतापूर्ण, मैंने नोटिस नहीं किया SwingWorker पहले से ही किसी अन्य उत्तर में उल्लेख किया गया था।

+0

या बस प्रक्रिया को स्ट्रीम को अलग थ्रेड में पढ़ने के लिए रखें। उदाहरण के लिए, आप एक और थ्रेड चाहते हैं जो त्रुटि स्ट्रीम को पढ़ता है। – dotjoe

2

अन्य लोगों ने मल्टीथ्रेडिंग के बारे में क्या कहा है इसके अतिरिक्त - आप बाल प्रक्रिया त्रुटि स्ट्रीम भी पढ़ना चाहेंगे। मेरा मानना ​​है कि (कुछ मामलों में) यदि आप प्रक्रिया के लिए त्रुटि स्ट्रीम को नहीं हटाते हैं तो यह इसे लटका सकता है।

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