Pregunta

¿Cómo podría yo obtener la salida de un CMD proceso para mostrar en mi GUI?Este es el código que estoy usando para ejecutar el proceso:

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 de usuario es completamente encerrado mientras se está ejecutando el proceso, así que nada de actualizaciones hasta el final, que no es muy útil.Aparte de que el CMD funciona bien.Sólo quiero mostrar el resultado en tiempo real.

¿Fue útil?

Solución

¿Usted vuelva a pintar () después de ajustar el texto de la etiqueta?

De todos modos, en general usted debe ser reacios a ejecutar una operación larga en el hilo de eventos GUI. Mira en el uso de un SwingWorker lugar.

Otros consejos

Usted necesita para comenzar un hilo separado para ejecutar el proceso.El código que estás usando para ejecutarlo en su mayoría sólo pueden ser insertados en el hilo (o Runnable's) run() método de como es, pero para establecer 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);
    }
}

EDITAR:solo di cuenta de algo:al parecer, la clase SwingWorker fue diseñado para este tipo de cosas, así que es otra opción para que usted (si es que existe en su versión de Java).

EDITAR para EDITAR:tan tonto de mí, que no me aviso SwingWorker ya se ha dicho en otra respuesta.

Además de lo que otros han dicho sobre este multithreading - usted también desea leer el flujo de error proceso hijo. Creo que (en algunos casos) si no drena el flujo de error para el proceso que podría provocar que se bloquee.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top