JProgressBar updaten abhängig vom Output eines externen Skripts

Apotekarnes

Mitglied
Liebe Javafreunde,

ich lasse auf einen Klick auf einen Button hin ein externes Skript (Python-Programm) ausführen und möchte den Füllstand einer jProgressBar entsprechend des Konsolenoutputs des externen Skripts während dessen Ausführung aktualisieren.
Dabei ist mir außerdem wichtig, das Programm meiner Java-Gui trotzdem auf die Terminierung des externen Skripts wartet, bevor beispielsweise ein neues Python-Programm aufgerufen wird.

Dazu sieht mein Code bisher so aus:

Java:
private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
// TODO add your handling code here:
        String a = jTextField1.getText();
               
        jProgressBar1.setValue(60);
        jLabel7.setText("Please wait...");
               
        Runtime rt = Runtime.getRuntime();
        Process proc1;
        try {
            proc1 = rt.exec("python ContigsBaseDistribution.py " + a);
             try {
                 String line;
                 BufferedReader input = new BufferedReader(new InputStreamReader(proc1.getInputStream()));
                 while ((line = input.readLine()) != null) {
                    jProgressBar1.setValue(Integer.parseInt(line));
                 }
                 input.close();
            }
            catch (Exception err) {
                err.printStackTrace();
            }
            StreamGobbler errorGobbler1 = new 
            StreamGobbler(proc1.getErrorStream(), "ERROR");
            // any output?
            StreamGobbler outputGobbler1 = new 
            StreamGobbler(proc1.getInputStream(), "OUTPUT");
            // kick them off
            errorGobbler1.start();
            outputGobbler1.start();
            
            
            try {
                proc1.waitFor();
            } catch (InterruptedException ex) {
                Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        } catch (IOException ex) {
            Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
        }


Die Probleme sind bisher:
1. Obwohl, wie im Code ersichtlich, die jProgressBar anfangs VOR der Ausführung des externen Skripts schon auf "60" gesetzt werden müsste, tut sie das nicht! Der gesamte Code vor dem Runtime/exec-Aufruf wird einfach übergangen, auch das Update des jLabels mit "Please wait"...
2. Die jProgressBar füllt sich nicht, obwohl das Python-Programm Zahlen in die Konsole printet
3. Meine GUI reagiert während der Ausführung des Python-Programms nicht auf irgendwelche Mausklicks

Was kann ich tun, um diese Probleme zu beheben?


Mit freundlichen Grüßen
Ralf Hauenschild
 
Zuletzt bearbeitet:
Hallo.

Zu 2. kann ich nur sagen. Das es sich nicht um die eigentliche Windowsconsole handelt und somit kann man die Ausgabe nicht auslesen. Nur möglich mir der Windowskonsole.

Zu 1. Also dafür müsste man mehr code sehen. Dort sehe ich nicht den Grund warum er den Wert nicht auf 60 setzt.

Zu 3.
Ja dafür gibt es Threads. Also das ausführen blockiert solange die Anwendung (Mainthread) bis das externe Programm fertig ist.
 

Zurück
Oben