Frage

Wie kann ich die Ausgabe von einem CMD-Prozess in meinem GUI angezeigt werden? Dies ist der Code, den ich mit dem Prozess ausgeführt werden:

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

Ich habe versucht, dies zu tun:

jLabel1.setText(line);

... aber die GUI ist komplett verriegelt, während der Prozess ausgeführt wird, so dass nichts Updates bis zum Ende, was nicht sehr nützlich ist. Anders als das der CMD funktioniert gut. Ich möchte nur die Ausgabe in Echtzeit angezeigt werden.

War es hilfreich?

Lösung

Haben Sie repaint () nach dem Text des Etiketts Einstellung?

Auf jeden Fall sollten Sie in der Regel zögern, einen langen Betrieb auf dem GUI-Ereignis-Thread auszuführen. Schauen Sie in mit einem SwingWorker statt.

Andere Tipps

Sie müssen einen separaten Thread starten Sie den Vorgang auszuführen. Der Code, den Sie verwenden, um sie auszuführen können meist nur in den (oder Runnable der) run() Methode des Threads eingesetzt werden, wie, aber den Text in der JLabel zu setzen, sollten Sie etwas wie folgt verwenden:

...
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 : nur etwas bemerkt. Anscheinend die Klasse SwingWorker für diese Art der Sache entwickelt wurde, so dass für Sie eine andere Option ist (wenn es in Ihrer Java-Version existiert)

EDIT EDIT . So dumm von mir, ich habe nicht bemerkt, SwingWorker bereits in einer anderen Antwort erwähnt wurde

Zusätzlich zu dem, was andere gesagt haben, über diese Multithreading - Sie werden auch das Kind Prozess Fehlerstrom lesen möchten. Ich glaube, dass (in einigen Fällen), wenn Sie nicht den Fehler Strom für den Prozess ablaufen es dazu führen könnte, es zu hängen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top