Pergunta

Como eu poderia obter a saída de um processo CMD para exibição na minha GUI? Este é o código que estou usando para executar o processo:

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();
}

Eu tentei fazer isso:

jLabel1.setText(line);

... mas o GUI é completamente trancada enquanto o processo estiver em execução, de modo atualizações nada até o final, o que não é muito útil. Diferente do que o CMD funciona bem. Eu só quero exibir a saída em tempo real.

Foi útil?

Solução

Você repintar () depois de definir o texto do rótulo?

De qualquer forma, você geralmente deve ser hesitante para executar uma operação longa no segmento de eventos GUI. Olhar em usar um SwingWorker .

Outras dicas

Você vai precisar para iniciar um segmento separado para executar o processo. O código que você está usando para executar o que pode na maior parte apenas ser inserido (ou de Runnable) Método run() do segmento como é, mas para definir o texto no JLabel, você deve usar algo como isto:

...
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);
    }
}

Editar : só notei uma coisa:. Aparentemente o SwingWorker classe foi projetada para esse tipo de coisa, então isso é uma outra opção para você (se existir na sua versão do Java)

Editar para a EDIT :. Tão bobo me, eu não aviso SwingWorker foi já mencionado em outra resposta

Além do que já foi dito sobre multithreading isso - você também vai querer ler o fluxo de erro processo filho. Eu acredito que (em alguns casos) se você não drenar o fluxo de erro para o processo que poderia causar-lhe para pendurar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top