Question

Comment pourrais-je obtenir la sortie d'un processus CMD pour afficher dans mon interface graphique? Voici le code que je utilise pour exécuter le processus:

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

Je l'ai essayé de faire ceci:

jLabel1.setText(line);

... mais l'interface graphique est complètement verrouillé alors que le processus est en cours d'exécution, de sorte que les mises à jour de rien jusqu'à la fin, ce qui est très utile. Autre que le CMD fonctionne très bien. Je veux juste afficher la sortie en temps réel.

Était-ce utile?

La solution

Avez-vous repeindre () après avoir défini le texte de l'étiquette?

Quoi qu'il en soit, vous devez généralement hésiter à exécuter une opération longue sur le fil des événements de l'interface graphique. Regardez dans l'aide d'un SwingWorker à la place.

Autres conseils

Vous devez commencer un thread séparé pour exécuter le processus. Le code que vous utilisez pour exécuter peut la plupart du temps juste être inséré dans le fil (ou de Runnable) méthode que run(), mais pour définir le texte dans le JLabel, vous devez utiliser quelque chose comme ceci:

...
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 : juste remarqué quelque chose:. Apparemment la classe a été conçue pour SwingWorker ce genre de chose, de sorte que c'est une autre option pour vous (si elle existe dans votre version de Java)

EDIT à EDIT : moi si bête, je ne l'ai pas remarqué a déjà mentionné <=> dans une autre réponse

.

En plus de ce que les autres ont dit au sujet de ce multithreading - vous aurez également besoin de lire le flux d'erreur de processus enfant. Je crois que (dans certains cas) si vous ne videz pas le flux d'erreur pour le processus pourrait le faire pendre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top