Exibir resultado de um terminal em um jFrame em Real-time

4 respostas
AMON-HA

Estou executando um comando externo com o CMD a partir do meu programa com interface gráfica… Só que eu quero criar um terminal dentro do jFrame que me mostre o que está sendo imprimido no terminal…
Consigo fazer isso sem interface gráfica usando o System.out.println()
E com o jFrame, qual a melhor forma de fazer isso???
Pensei até em imprimir o resultado dentro de uma jTextArea, mas com .setText() fica meio complicado, já que eu teria que ficar pegando o valor da jTextArea, adicionando mais uma linha e setando-o novamente… Isso daria uma string muito grande e precisaria de um tempo muito rápido de resposta… Sem falar que a tela deve até ficar piscando…
Com o System.out.println() seria ideal, já que ira só acrescentando uma linha abaixo…

4 Respostas

AMON-HA

Para vocês entederem melhor, veja o código que imprime o retorno do terminal na tela...

package terminal;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

class PromptDeComando extends Thread {

    InputStream inStream;
    String tipo;

    public PromptDeComando(InputStream inStream, String tipo) {
        this.inStream = inStream;
        this.tipo = tipo;
    }

    @Override
    public void run() {
        try {
            InputStreamReader inStreamReader = new InputStreamReader(inStream);
            BufferedReader buff = new BufferedReader(inStreamReader);
            String linha = null;

            while ((linha = buff.readLine()) != null) {
                System.out.println(tipo + "> " + linha);
            }
        } catch (IOException ioe) {
        }
    }
}

public class Terminal {

    public static void main(String[] args) {
        try {
            String comando = "cmd.exe /C ping -n 15 www.google.com.br";

            Runtime rt = Runtime.getRuntime();
            Process processo = rt.exec(comando);
            PromptDeComando erro = new PromptDeComando(processo.getErrorStream(), "ERRO");
            PromptDeComando saida = new PromptDeComando(processo.getInputStream(), "SAIDA");

            erro.start();
            saida.start();

            int valorSaida = processo.waitFor();
            System.out.println("Valor de saída: " + valorSaida);
        } catch (Throwable t) {
        }
    }
}

Só que eu quero esses resultados retornando numa jTextArea (ou algum elemento gráfico)...

Como eu poderia fazer isso???

tondatto

Acredito que aqui você encontra sua solução.

AMON-HA

Não é isso…

tondatto

Cria o processo de execução do processo numa thread que atualiza uma StringBuffer (que possui o recurso de sincronização).
Pode utilizar outra thread para atualizar o JTextArea pegando o valor desta StringBuffer, ou trabalhar com binding.

Criado 22 de setembro de 2011
Ultima resposta 23 de set. de 2011
Respostas 4
Participantes 2