Показать вывод CMD в моем GUI (Java) - PullRequest
5 голосов
/ 20 марта 2009

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

Ответы [ 3 ]

5 голосов
/ 20 марта 2009

Вы перекрасили () после установки текста метки?

В любом случае, вам, как правило, не следует выполнять длинную операцию в потоке событий графического интерфейса. Попробуйте использовать SwingWorker.

3 голосов
/ 20 марта 2009

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

2 голосов
/ 20 марта 2009

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

...