2009-08-13 6 views
0

Je souhaite déclencher une ligne de commande exécutable avec les paramètres saisis dans l'interface graphique.Lancement d'un outil de ligne de commande à partir de l'interface graphique

Process classe peut être utilisée à la fourchette mon processus de ligne de commande nécessaire à l'application Java, et j'ai utilisé la méthode getInputStream() de Process objet pour obtenir le résultat et se il apparaît dans l'interface graphique.

private void confirmActionPerformed(java.awt.event.ActionEvent evt) {          
    String output; 
    try { 
     Process p = Runtime.getRuntime().exec("my command line exe with parameters"); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 

     while ((output = stdInput.readLine()) != null) { 
      TextField.setText(TextField.getText()+output+"\n"); 
     } 
    } catch (IOException e) { 
     System.out.println("Exception in Process"); 
     e.printStackTrace(); 
    } 
} 

Ceci est mon code qui est un écouteur d'événement d'un événement bouton enfoncé et je tenté d'afficher le résultat du processus dans le champ texte (composant swing java). Ce processus fonctionne en fait assez longtemps et montre des statistiques au moment où il s'exécute en ligne de commande, mais quand je l'essaie en GUI avec le code ci-dessus, je reçois le résultat consolidé entier seulement après le Fin de processus en cours. Je ne reçois pas le TextField mis à jour au fur et à mesure de l'exécution.

Quelle serait la cause de ce problème?

Répondre

1

Cela est dû au fait que le tout est effectué par le thread de gestion d'événements Swing.

Vous devriez peut-être envisager de créer un thread séparé et mettre à jour le TextField avec un SwingUtilities.invokeLater().

0

Comme Maurice l'a déjà souligné, vous ne devriez pas faire de traitement intensif sur le thread UI. Le SwingWorker class aide avec cela. Cela fait partie de l'API standard depuis la version 1.6. Il y a aussi un backport to 1.5 si vous ne pouvez pas utiliser 1.6.

Cette classe facilite la tâche de traitement sur un autre thread et affiche le résultat ultérieurement afin que votre interface graphique ne bloque pas entre-temps. Vous pouvez également utiliser SwingUtilities.invokeLater() directement, bien sûr, comme suggéré par Maurice, mais pour moi, SwingWorker est la voie à suivre car c'est assez facile et apparemment la nouvelle façon standard de faire ce genre de chose.