Отображение вывода CMD в моем графическом интерфейсе (java)
-
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
был разработан для подобных вещей, так что это еще один вариант для вас (если он существует в вашей версии Java).
РЕДАКТИРОВАТЬ в РЕДАКТИРОВАТЬ:я такой глупый, я не заметил SwingWorker
уже упоминалось в другом ответе.
В дополнение к тому, что другие говорили о многопоточности, вам также понадобится прочитать поток ошибок дочернего процесса.Я считаю, что (в некоторых случаях), если вы не очистите поток ошибок для процесса, это может привести к его зависанию.