Отображение вывода CMD в моем графическом интерфейсе (java)

StackOverflow https://stackoverflow.com/questions/667416

Вопрос

Как я могу получить результаты процесса 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 уже упоминалось в другом ответе.

В дополнение к тому, что другие говорили о многопоточности, вам также понадобится прочитать поток ошибок дочернего процесса.Я считаю, что (в некоторых случаях), если вы не очистите поток ошибок для процесса, это может привести к его зависанию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top