Swing Thread für CMD auslesen

sandaime

Mitglied
Hallo liebe community,

ich habe eine Methode erstellt, was eine exe startet, welches in der Konsole läuft. Im weiteren wird in die Konsole ein Pfad eingegeben, womit dann das Programm eine Berechnung startet. Die Werte für die Berechnung entnimmt die Exe einer txt Datei. Naja das Problem hierbei ist, dass ich die Konsolenausgabe mir in die eine TextArea ausgeben will und das natürlich in Echtzeit.
Mit meiner Methode funktioniert die Ausgabe in der Konsole von Eclipse, aber nicht in meiner TextArea und ich habe zurzeit überhaupt keine Idee wieso. Nun habe ich nur noch wenig Zeit für meine Bachelorarbeit und stehe unter Druck. Ich hoffe ihr könnte mir aktiv helfen.

Danke an alle dir mir helfen und an die die sich wenigstens das Problem durchlesen :)



Code:
private 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 {
            // TODO Thread einbauen
            // ProcessBuilder auf thread umstellen und asynchron in das TextFeld ergebnisAusgabe schrieben mittels .append
            // Siehe JavaCommandLineWrapperExample Zeile 80ff.
            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();
            }
            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);
                ergebnisAusgabe.setText(line);
                System.out.println(line);
            }
        }
    }
 

JCODA

Top Contributor
Mhh, das einzige, das mir gerade einfällt ist nur die Zeile " ergebnisAusgabe.setText(line);"
Versuch mal ergebnisAusgabe.setText(ergebnisAusgabe.getText()+"\n"+line); oder ergebnisAusgabe.append("\n"+line);
(Wenn das eine Bachelorabeit ist, möchtest du vielleicht die Java-Coding-Conventions einhalten und Methoden klein schreiben...)
 

sandaime

Mitglied
Hallo,
danke für die Antwort. Das mit den Methodennamen stimmt. Sonst sind das nur Gründe für eine schlechtere Note. Leider funktioniert dein Vorschlag nicht.
 

mrBrown

Super-Moderator
Mitarbeiter
Zeig mal bitte, wie #KonsoleEingabe aufgerufen wird

(Wenn ich raten müsste, würde ich drauf sagen, dein TODO fixt es...)
 
Zuletzt bearbeitet:

sandaime

Mitglied
Wieder einmal danke für die Antworten. Hier ist der Code zum Aufrufen der Methode.
--> JCODA dein Vorschlag hat leider nicht funktioniert.
Ich etwas im Internet gefunden ich glaube das ist die Lösung für mein Problem jedoch schaffe ich es nicht ganz in mein Code einzubinden. Davon den Code poste ich auch mal

Code:
case ("Starte Austal2000"):
           
            String[] values = {"Normal Starten", "Lösche vorherige Daten und starte neu"};

            Object selected = JOptionPane.showInputDialog(null, "Wie möchten sie das Projekt starten?", "Startauswahl", JOptionPane.DEFAULT_OPTION, null, values, "0");
            if ( selected != null ){//null if the user cancels.
                String selectedString = selected.toString();
                if(selectedString.equals("Normal Starten")){
                    this.konsoleEingabe(false);
                }else{
                    this.konsoleEingabe(true);
                }
                //do something
            }else{
                System.out.println("User cancelled");
            }

            break;

Code:
import java.util.concurrent.Executors;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class JavaCommandLineWrapperExample extends JFrame {
    
      JTextArea txtConsole;
      JTextField txtCommand;
    
      public JavaCommandLineWrapperExample() {
        super("JavaCommandLineWrapperExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
        txtConsole = new JTextArea(20, 80);
        txtCommand = new JTextField(80);
    
        txtConsole.setEditable(false);
    
        JScrollPane scrollPane = new JScrollPane(txtConsole);
    
        add(scrollPane);
        add(txtCommand, BorderLayout.SOUTH);
    
        pack();
        setVisible(true);
    
        startShell();
      }
    
    
      void startShell() {
        ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe").redirectErrorStream(true);
    
        try {
          final Process process = processBuilder.start();
          final PrintWriter processInput = new PrintWriter(process.getOutputStream());
          captureProcessOutput(process);
          txtCommand.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              processInput.println(txtCommand.getText());
              processInput.flush();
              txtCommand.setText("");
            }
          });
    
          int exitCode = process.waitFor();
          System.exit(exitCode);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    
    
      void captureProcessOutput(final Process process) {
        Executors.newSingleThreadExecutor().execute(new Runnable() {
          @Override
          public void run() {
            try {
              char c = (char)-1;
              InputStream processOutput = process.getInputStream();
              while ((c = (char) processOutput.read()) != -1) {
                txtConsole.append(String.valueOf(c));
                txtConsole.setCaretPosition(txtConsole.getText().length());
              } 
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        });
      }
 

mrBrown

Super-Moderator
Mitarbeiter
Du startest deine Methode innerhalb des AWT-Thread (also aus #actionPerformed oä)?
Dann blockiert die gesamte GUI (und damit auch das aktualisieren des Textes), bis die Methode zurückkehrt.

Wenn du dein TODO umsetzt (was man bei einer BA durchaus können sollte), dürfte es laufen ;)
Was verstehst du denn an dem gefundenem Code nicht?
 

JCODA

Top Contributor
Naja, meine Frage war keine "Lösung" sondern, falls dort nichts ausgegeben wird, muss man an anderer Stelle suchen als bei dem TextField...
Vielleicht braucht das Programm ein bisschen Zeit, bis die Ausgabe erscheint, deshalb würde ich mal versuchen zu warten.
Versuch mal:

Java:
private 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 {
            // TODO Thread einbauen
            // ProcessBuilder auf thread umstellen und asynchron in das TextFeld ergebnisAusgabe schrieben mittels .append
            // Siehe JavaCommandLineWrapperExample Zeile 80ff.
            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();
            }
            BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
            String line = null;
            int k=0;
            while (true) {
                try{
                    Thread.sleep(1000);
                }catch(Exception e){
                     e.printStackTrace();
                }
                try {
                    line = r.readLine();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if (line == null) {
                    k++;
                    if(k==5){
                        break;
                    }
                }else{               
                   ergebnisAusgabe.append(line);
                   System.out.println(line);
                 }
            }
        }
    }
 

sandaime

Mitglied
Hi,
mrBrown du hast Recht. Diesen schuh ziehe ich mir selber an. Was ich an dem Code nicht verstehe ist warum er das auslesen mit dem Thread in einer anderen Methode macht. Aber ich glaube dass ich mit der Vorlage mein Problem lösen sollte.

JCODA das programm arbeitet jetzt zwar langsamer, aber die Ausgabe findet nur in der Eclipse Konsole statt.

Danke für eure antworte :)
 

mrBrown

Super-Moderator
Mitarbeiter
Was ich an dem Code nicht verstehe ist warum er das auslesen mit dem Thread in einer anderen Methode macht. Aber ich glaube dass ich mit der Vorlage mein Problem lösen sollte.
Da es sonst im AWT-Thread läuft, und diesen blockiert, sodass nichts mehr an der GUI aktualisiert werden kann.
Läuft das in einem eigenen Thread, passiert das nicht, weil beide gleichzeitig laufen und der AWT-T. kann seine GUI aktualisieren (was dann aber mit #invokeLater passieren sollte)
 

sandaime

Mitglied
Ich habe hier die Lösung. An dieser Stelle noch ein besonderer Dank an MrBrown. Dein Tipp was in der Methode von dem anderen Code passiert war der Auslöser dafür, dass ich wusste wie ich das für mein Problem nutze.
Wie zu sehen ist rufe ich die methode auslese() in der methode konsoleEingabe(), das muss so sein weil Swing probleme bei solchen sachen hat. Für genaueres siehe --> http://openbook.rheinwerk-verlag.de...19_026.htm#mjff97f42688ce8483476fd5597042a972.

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

mrBrown

Super-Moderator
Mitarbeiter
Kleine Anmerkung noch, ergebnisAusgabe.append(line+"\r\n"); sollte mit SwingUtilities.invokeLater ausgeführt werden, GUI-Änderungen müssen immer im passenden Thread ausgeführt werden ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
A Ticker als Thread AWT, Swing, JavaFX & SWT 3
G Auf Ergebnis vom Thread warten AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben