SwingWorker :(

Status
Nicht offen für weitere Antworten.

Sladda

Aktives Mitglied
Hallo Allerseits,

bin grade etwas verzweifelt. Ich muss für meine Bachelorarbeit etwas programmieren. Kein Problem. Nur leider macht mir die grafische Ausgabe schwere Probleme:
ich habe einen einfachen Binärbaum und möchte nur die jeweiligen Werte der einzelnen Knoten nach und nach in einer JTextArea ausgeben.
Zwischen jeder Ausgabe soll also etwa eine Pause von 3s liegen. Natürlich liegt hier schon das Problem, die Ausgabe wird erst ganz am Ende,
plötzlich alles auf einmal, ausgegeben nachdem mehrere Male 3s lang gewartet wurde und nicht nach jedem Warten einzeln.

Ich bin irgendwie total aufm Kriegsfuß mit diesem Swingworker (invokelater und invokeandwait habe ich noch nie verstanden)
und deswegen wollte ich um ein paar tips bitten, wie ich hier den Swingworker am besten einbaue, so schwer kann das ja nicht sein ;)

Code:
public void computeTree(Node node){ //start param: root

        //HIER IS DAS PROBLEM...:
        try{        //warte 3s damit ein Knoten nach dem anderen ausgegeben wird
            Thread.sleep(3000);
        }
        catch (bla){}

        //gehe nach links
			Node tmpNodeL = getLeftNode(node);
			//suche dazugehörien rechten Knoten:
			Node tmpNodeR = getRightNode(tmpNodeL);
			if(tmpNodeR!=null){
				if (tmpNodeR.isLeaf()){

									
						addToLog("");
						addToLog("rechne: "+tmpNodeL.getOperator()+tmpNodeL.getParent().getOperator()+tmpNodeR.getOperator()+" ("+tmpNodeL.getValue()+" "+tmpNodeL.getParent().getOperator()+" "+tmpNodeR.getValue()+")");
						addToLog("Ergebnis: "+Misc.convertStringToBool(LogicalExpression.reduce(tmpNodeL.getValue()+tmpNodeL.getParent().getOperator()+tmpNodeR.getValue())));
						
						//mache ganz viel Zeug mit den Knoten, hab ich hier rausgenommen, der Übersicht wegen
						
                    //gehe eine Ebene höher und starte von vorne (wenn möglich):
						if(tmpNodeL.getParent().getParent()!=null)
							computeTree(tmpNodeL.getParent().getParent());
						else{ // ANKER (bei root angekommen):	
							addToLog("");
							addToLog("Endergebnis: "+tmpNodeL.getParent().getValue());
						}
					}				
				}
				else{ //rechts KEIN Blatt: gehe nach rechts und fange von vorne an
					computeTree(tmpNodeR);				
				}
			}	
	
	}

addToLog() macht einfach die Ausgabe über die JTextArea:
Code:
	public void addToLog(String text){
		this.txtAreaLog.setText(this.txtAreaLog.getText()+text+"\n");		
	}

Ich bin sehr dankbar für jede Hilfe !!!
Grüße
Sladda
 

Marco13

Top Contributor
Vergiß' das mit dem updateUI. (Notfalls mal die API Doku dazu durchlesen...)

Ob du da einen SwingWorker brauchst - hmja, damit könnte man das vermutlich recht "elegant" machen, aber vielleicht ist es mit einem Thread einfacher. Eigentlich braucht da fast nichts geändert zu werden.

Code:
public void computeTree(Node node){ //start param: root

        //HIER IS DAS PROBLEM...:
        try{        //warte 3s damit ein Knoten nach dem anderen ausgegeben wird
            Thread.sleep(3000);
        }
        catch (bla){}
...    
                 addToLogAsync("");
...
   }

   // Wird von einem beliebigen Thread aufgerufen, und führt "addToLog" im EDT aus
   private void addToLogAsync(String text)
   {
       SwingUtilities.invokeLater(new Runnable()
       {
           public void run()
           {
               addToLog(text);
           }
       });
   }


   public void addToLog(String text){
      this.txtAreaLog.setText(this.txtAreaLog.getText()+text+"\n");      
   }

Dann muss nurnoch der Aufruf in einen eigenen Thread ausgelagert werden.

Vorher:
Code:
public void actionPerformed(ActionEvent e) // Oder andere Event-Methode....
{
    computeTree(root);
}
Nachher
Code:
public void actionPerformed(ActionEvent e) // Oder andere Event-Methode....
{
    Thread thread = new Thread(new Runnable()
    {
        public void run()
        {
            computeTree(root);
        }
    });
    thread.start();
}
 

Sladda

Aktives Mitglied
Hallo Tobias,

ich benutze den SwingWorker noch gar nicht, weil ich nicht weiß wie es geht (bzw. ich hab schon ganz viel rumprobiert mit doinbackground etc., aber es tuts einfach nich)
Ein kompilierbares Beispiel kann ich nicht machen, das PRog ist so umfangreich und kompliziert, das was ich hier an Code gepostet habe, ist nur ein Auszug, das nötigste sozusagen um mein Problem zu beschreiben.

Im Prinzip geht es ja nur darum, dass diese Methode computeTree() nach ButtonClick ausgeführt wird und sich immer rekursiv aufruft. Nach jedem Selbstaufruf (der nächste Knoten kommt dran und soll per addToLog ausgegeben werden) soll erstmal 3sec gewartet werden, bevor die Ausgabe passiert usw...
Leider wird nicht jedesmal 3 sec gewartet und dann ausgegeben, sondern bei z.B. 5 Knoten, wird 15 sekunden gewartet und dann wird alles auf einmal ausgegeben... :(
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
ralfb1105 Swing Frage zu SwingWorker Verhalten bei cancel() AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing SwingWorker - max 10 Threats werden gestartet !? AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
S Swing SwingWorker - richtige Implementierung doInBackground() AWT, Swing, JavaFX & SWT 5
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
Nuiton Swing SwingWorker - Prozess stoppen AWT, Swing, JavaFX & SWT 4
Thallius Auf Swingworker warten? AWT, Swing, JavaFX & SWT 5
M SwingWorker Hilfe! AWT, Swing, JavaFX & SWT 10
J Swing Nach SwingWorker Funktion aus der GUI Klasse aufrufen AWT, Swing, JavaFX & SWT 5
C Swing SwingWorker abbrechen AWT, Swing, JavaFX & SWT 12
C Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten AWT, Swing, JavaFX & SWT 10
Psypsy Swing SwingWorker unterschied zwischen setProgress und process AWT, Swing, JavaFX & SWT 2
A Swingworker rückgabewert verwenden AWT, Swing, JavaFX & SWT 9
B Frage zu Swing,Threads, SwingWorker und Socket Communikation AWT, Swing, JavaFX & SWT 4
M Prioritäten bei SwingWorker / Threads AWT, Swing, JavaFX & SWT 9
M Liste mittels SwingWorker füllen klappt nicht AWT, Swing, JavaFX & SWT 10
Iron Monkey SwingWorker verschwindet nicht AWT, Swing, JavaFX & SWT 10
X Prozess mit Runtime.getRuntime in SwingWorker aufrufen AWT, Swing, JavaFX & SWT 6
R Zugriff auf Model im MVC-Design aus SwingWorker heraus AWT, Swing, JavaFX & SWT 3
G SwingWorker setProgress Problem AWT, Swing, JavaFX & SWT 17
K Frage zu ProgressBar, SwingWorker etc. AWT, Swing, JavaFX & SWT 4
G SwingWorker AWT, Swing, JavaFX & SWT 2
J Unterschied zwischen SwingWorker und Threads AWT, Swing, JavaFX & SWT 4
F swingworker und eventdispatch thread AWT, Swing, JavaFX & SWT 9
S SwingWorker - ich werde wahnsinnig AWT, Swing, JavaFX & SWT 4
0 SwingWorker Tutorial ? AWT, Swing, JavaFX & SWT 2
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12
L SwingWorker Statusabfrage AWT, Swing, JavaFX & SWT 8
M Kann ein SwingWorker nur einmal laufen? AWT, Swing, JavaFX & SWT 2
J SwingWorker, get und boolean AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben