2017-01-26 5 views
0

Mein SwingWorker scheint nicht zu funktionieren. Es gibt nichts in das textpanel und nichts in die Konsole aus. Es führt nicht einmal den eigentlichen Befehl cmd im ProcessBuilder.Warum funktioniert mein SwingWorker nicht?

Ich habe keine Ahnung, warum es nicht funktioniert. Wer sieht etwas falsch im Code?

public class cmdExec extends SwingWorker<Integer, String> { 

    private int status; 

    private FormPanel formPanel = new FormPanel(); 
    private FooterBar footerBar = new FooterBar(); 
    private TextPanel textPanel = new TextPanel(); 

    public cmdExec() { 
     textPanel.appendText((this.getState()).toString()); 
    } 

    @Override 
    protected Integer doInBackground() { 
     try { 

      ProcessBuilder pb = new ProcessBuilder(
       "cmd.exe", "/c", "copy NUL createThis.txt" 
      ); 
      pb.directory(new File(formPanel.workspaceDir.toString())); 
      pb.redirectErrorStream(true); 
      Process p = pb.start(); 
      String s; 
      BufferedReader stdout = new BufferedReader(new InputStreamReader(p.getInputStream())); 

      while((s = stdout.readLine()) != null && !isCancelled()) { 
       publish(s); 
      } 
      if(!isCancelled()) { 
       status = p.waitFor(); 
      } 
      p.getInputStream().close(); 
      p.getOutputStream().close(); 
      p.getErrorStream().close(); 
      p.destroy(); 

     } catch(IOException | InterruptedException ex) { 
      ex.printStackTrace(System.err); 
     } 

     return status; 
    } 

    @Override 
    protected void process(List<String> messages) { 
     formPanel.okBtn.setText((this.getState()).toString()); 
     for(String message : messages) { 
      textPanel.appendText(message + "\n"); 
     } 
    } 

    @Override 
    protected void done() { 
     textPanel.appendText((this.getState()).toString() + " " + status); 
     formPanel.okBtn.setEnabled(true); 
     footerBar.progress.setIndeterminate(false); 
     formPanel.disableList(false); 
     formPanel.disableWorkspace(false); 
    } 

} 

In meiner Hauptklasse Ich nenne nur ein cmdExec.execute(); für sie zu laufen, und ich überprüfte, ob es überhaupt so nennen kann und es tut. Ich habe es überprüft, indem ich allen Methoden in meinem Swingworker einen Sysout hinzugefügt habe, und er hat sie mit den Methoden ausgedruckt, die er ausführen soll.

Habe ich etwas vergessen? Ich werde nur blind, indem ich mich wieder alles ansehe, um zu sehen, was ich vermisst habe.

Hier ist der Code, der die Swingworker-Klasse aufrufen:

cmdExec cmdExec = new cmdExec(); 
cmdExec.execute(); 

Dieser Code ist in einem Action auf, wenn eine Taste gedrückt wird.

Nach weiteren Untersuchungen; Ich bemerkte, dass es wegen dieser 3 Zeilen ist:

private FormPanel formPanel = new FormPanel(); 
private FooterBar footerBar = new FooterBar(); 
private TextPanel textPanel = new TextPanel(); 

Aber ich muss wirklich Variablen innerhalb dieser Klassen erreichen. Wie kann ich das machen und alles funktionieren lassen?

+0

Können Sie nach dem Code, wenn Sie Ihre Swingworker ausgeführt werden? – Gatusko

+0

@Gatusko absolut! Ich habe den Hauptpost bearbeitet. Es scheint, dass in der Swingworker-Klasse etwas nicht stimmt, da es erfolgreich ist, es zu nennen. Außerdem finden Sie den gesamten Code, wenn Sie wirklich graben möchten, auf diesem Github-Repo: https://github.com/condolent/USB3Installer –

+0

Für eine bessere Hilfe, früher ein [MCVE] oder [Short, Self Contained, Correct Beispiel ] (http://www.sscce.org/). –

Antwort

1

New Constructor

public cmdExec(FormPanel formPanel,FooterBar footerBar,TextPanel textPanel) { 
      textPanel.appendText((this.getState()).toString()); 
     } 

und in runWorker() übergeben Sie die Werte, die Sie ändern möchten.

cmdExec = new cmdExec(formPanel,footerPanel,textPanel); 
    cmdExec.execute(); 

Aber wie sehen Sie in Ihrem Code benötigen ein PropertyChangeListeners sehen Sie mehr in der Dokumentation hinzufügen, wie eine Statusleiste hinzufügen Documentation of SwinWorker

+0

Aber das erlaubt mir nur, die Variablen innerhalb der cmdExec-Methode zu verwenden, oder? Es wird mir nicht erlauben, sie in anderen Methoden in der Klasse zu verwenden. Zum Beispiel die 'doInBackground()' Methode. Oder fehlt mir gerade etwas? –

+0

EDIT: Ich erkannte, dass ich die Variablen über 'this.footerPanel = footerPanel;' initialisieren musste. Vielen Dank für deine Hilfe! :) –