Domanda

Come posso ottenere l'output da un processo CMD da visualizzare nella mia GUI?Questo è il codice che sto utilizzando per eseguire il 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();
}

Ho provato a fare questo:

jLabel1.setText(line);

...ma la GUI è completamente bloccata mentre il processo è in esecuzione, quindi non viene aggiornato nulla fino alla fine, il che non è molto utile.A parte questo il CMD funziona bene.Voglio solo visualizzare l'output in tempo reale.

È stato utile?

Soluzione

Hai repaint () dopo aver impostato il testo dell'etichetta?

In ogni caso, si dovrebbe generalmente essere riluttanti a eseguire una lunga operazione sul filo evento GUI. Considerare di usare un SwingWorker .

Altri suggerimenti

Dovrai avviare un thread separato per eseguire il processo.Il codice che stai utilizzando per eseguirlo può essere semplicemente inserito nel thread (o Runnable'S) run() metodo così com'è, ma per impostare il testo nella JLabel, dovresti usare qualcosa del genere:

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

MODIFICARE:ho appena notato una cosa:apparentemente la classe SwingWorker è stato progettato per questo genere di cose, quindi questa è un'altra opzione per te (se esiste nella tua versione di Java).

EDIT all'EDIZIONE:sono così stupido che non me ne sono accorto SwingWorker è già stato menzionato in un'altra risposta.

In aggiunta a ciò che altri hanno detto su questo multithreading - si potrà anche leggere il flusso di errore processo figlio. Credo che (in alcuni casi) se non svuotare il flusso di errore per il processo potrebbe causare la sua sospensione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top