cmd über Java steuern

sandaime

Grünschnabel
Hallo ,

ich habe das mittlerweile so gelöst. Es funktioniert und macht das, was ich will. Ist das OK?

Danke nochmals für deine ausführliche Antwort :)


Code:
public void konsoleEingabe(boolean neustart) {

        String austalPfad = cf.pathToAustalExe;
        String austalDirectory = curProjektPfad.split("austal2000.txt")[0];


        if (curProjektPfad == null) {
            JOptionPane.showMessageDialog(this, "Es ist kein Projekt ausgewählt oder erstellt worden!");
        } else {
            ProcessBuilder builder = null;
            if( neustart ){
                builder = new ProcessBuilder(austalPfad,"-D", austalDirectory);
            } else {
                builder = new ProcessBuilder(austalPfad, austalDirectory);
            }
        
            builder.redirectErrorStream(true);
            Process p = null;
            try {
                p = builder.start();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          auslesen(p);
        }
    }
  
  
    // Ein Thread ist noetig in Swing nutzung weil sonst die GUI blockiert wird
    // deswegen laeuft die Methode seperat
     void auslesen(final Process p) {
    Executors.newSingleThreadExecutor().execute(new Runnable() {
    public void run(){
         BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
         String line = null;
         while (true) {
             try {
                 line = r.readLine();
              
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             if (line == null) {
                 break;
             }
             ergebnisAusgabe.append(line+"\r\n");
         }
     }
});
}
 

Cymatoxa

Mitglied
Aye, bis auf eine Kleinigkeit:
UI Elemente sind nicht Thread-sicher. Deshalb sollte immer nur ein Thread darauf zugreifen - der UI Thread.
Am besten änderst du
Java:
ergebnisAusgabe.append(line+"\r\n")
um in
Java:
SwingUtilities.invokeLater(() -> {
    ergebnisAusgabe.append(line+"\r\n");
});
dadurch führt der UI-Thread (sobald er Zeit hat) den Befehl aus.