Exibir a saída CMD na minha GUI (java)
-
21-08-2019 - |
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.
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 ??p>
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.