عرض الانتاج CMD في بلدي واجهة المستخدم الرسومية (جافا)
-
21-08-2019 - |
سؤال
وكيف يمكن أن أحصل على الإخراج من عملية CMD لعرض واجهة المستخدم الرسومية في بلدي؟ هذا هو رمز أنا باستخدام لتشغيل العملية:
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);
و... ولكن واجهة المستخدم الرسومية مقفل تماما حتى أثناء تشغيل هذه العملية، لذلك لا شيء التحديثات حتى النهاية، وهي ليست مفيدة للغاية. البعض من أن CMD يعمل بشكل جيد. أريد فقط لعرض الانتاج في الوقت الحقيقي.
المحلول
هل إعادة رسم () بعد وضع نص التسمية؟
وعلى أي حال، يجب أن تكون عموما مترددة في تنفيذ عملية طويلة على موضوع الحدث واجهة المستخدم الرسومية. النظر في استخدام SwingWorker
بدلا من ذلك.
نصائح أخرى
وستحتاج إلى بدء موضوع منفصل لتشغيل هذه العملية. ويمكن في الغالب يكون مجرد إدخال الرمز الذي تستخدمه لتشغيله إلى (أو 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);
}
}
تحرير م>: شيء لاحظت فقط: على ما يبدو تم تصميم SwingWorker
فئة لهذا النوع من الشيء، ذلك أن خيار آخر بالنسبة لك (إذا كان موجودا في إصدار جافا)
تحرير لتحرير م>: حتى سخيفة لي، وأنا لم يلاحظوا SwingWorker
وقد سبق ذكرها في جواب آخر
وبالإضافة إلى ما قاله الآخرون عن خاصية تعدد هذه - سترغب أيضا قراءة تيار الخطأ عملية طفل. وأعتقد أن (في بعض الحالات) إذا لم يكن لاستنزاف تيار خطأ في عملية يمكن أن يؤدي إلى تعليق.