2009-03-20 5 views
5

Comment puis-je obtenir la sortie d'un processus CMD à afficher dans mon interface graphique? Voici le code que je utilise pour exécuter le processus:Afficher la sortie CMD dans mon interface graphique (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(); 
} 

J'ai essayé de le faire:

jLabel1.setText(line); 

... mais l'interface graphique est complètement verrouillé alors que le processus est en cours d'exécution, donc rien ne se met à jour jusqu'à la toute fin, ce qui n'est pas très utile. Autre que cela le CMD fonctionne bien. Je veux juste afficher la sortie en temps réel.

+0

Y a-t-il une raison pour laquelle vous voulez plutôt utiliser JLabel et JTextArea? – OscarRyz

+0

Suggérer de supprimer le tag en temps réel de cette question. Voir http://en.wikipedia.org/wiki/Realtime pour une définition de l'informatique en temps réel – andersoj

+0

Cette réponse de ["Software Monkey"] (http://stackoverflow.com/users/8946/software-monkey) devrait faire: OscarRyz

Répondre

5

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

Quoi qu'il en soit, vous devriez généralement hésiter à exécuter une opération longue sur le thread d'événement GUI. Cherchez à utiliser un SwingWorker à la place.

3

Vous devez démarrer 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 Runnable « s) méthode run() tel qu'il est, 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 SwingWorker a été conçue pour ce genre de chose, donc c'est une autre option pour vous (si elle existe dans votre version de Java).

EDITER à l'EDIT: si bête moi, je n'ai pas remarqué SwingWorker a déjà été mentionné dans une autre réponse.

+0

ou simplement mettre le code pour lire le flux du processus dans un fil séparé. Par exemple, vous pouvez vouloir un autre thread qui lit le flux d'erreurs. – dotjoe

2

En plus de ce que d'autres ont dit à propos du multithreading, vous devez également lire le flux d'erreurs du processus enfant. Je crois que (dans certains cas) si vous ne vidangez pas le flux d'erreur pour le processus, il pourrait le bloquer.

Questions connexes