2009-03-20 22 views
5

¿Cómo puedo obtener la salida de un proceso CMD para mostrar en mi GUI? Este es el código que estoy usando para ejecutar el proceso:Mostrar salida CMD en mi GUI (java)

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

He intentado hacer esto:

jLabel1.setText(line); 

... pero la interfaz gráfica de usuario está completamente encerrado mientras el proceso está en marcha, así que nada se actualiza hasta el final, lo cual no es muy útil. Aparte de eso, el CMD funciona bien. Solo quiero mostrar la salida en tiempo real.

+0

¿Hay algún motivo por el que desee utilizar JLabel rather y JTextArea? – OscarRyz

+0

Sugiera eliminar la etiqueta en tiempo real de esta pregunta. Consulte http://en.wikipedia.org/wiki/Real-time para obtener una definición de computación en tiempo real – andersoj

+0

Esta respuesta de ["Mono Software"] (http://stackoverflow.com/users/8946/software-monkey) debería hacer: OscarRyz

Respuesta

5

¿Volvió a pintar() después de configurar el texto de la etiqueta?

De todos modos, en general debería dudar en ejecutar una operación larga en el hilo del evento GUI. Considere usar un SwingWorker en su lugar.

3

Tendrá que iniciar un hilo por separado para ejecutar el proceso. El código que está utilizando para ejecutarlo puede en su mayoría sólo puede insertar en el hilo (o Runnable 's) run() método como está, pero para ajustar el texto en el JLabel, usted debe usar algo como esto:

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

EDIT: acaba de notar algo: aparentemente la clase SwingWorker fue diseñada para este tipo de cosas, por lo que es otra opción para usted (si existe en su versión de Java).

EDITAR al EDIT: así que tonto, no me di cuenta SwingWorker ya se mencionó en otra respuesta.

+0

o simplemente poner el código para leer la secuencia del proceso en un hilo separado. Por ejemplo, es posible que desee otro hilo que lea la secuencia de error. – dotjoe

2

Además de lo que otros han dicho sobre el subprocesamiento múltiple esto, también querrá leer el flujo de error de proceso secundario. Creo que (en algunos casos) si no drena el flujo de error para el proceso, podría hacer que se bloquee.