Swing SwingWorker: Auf beendigung eines Formulars / einer Arbeit warten

Cromm Cruach

Mitglied
In einem Programm können mit Hilfe eines Formulars Daten in eine Datenbank eingegeben werden. Die Daten werden mit Hilfe eines SwingWorkers eingefügt. Bis hierhin ein Problem.

Nun hab ich eine Art "Stapelverarbeitung" programmiert. Die Eingaben, die der Nutz macht können auch per Datei vorliegen die in einem anderen Formular geladen werden.

Beispielszenario:

Im "Import-Formular" wählt der Nutzer die Datei aus, die die Daten enthält (z.B. 10 Einträge). Nach einem Klick auf einen Button wird das feritg ausgefüllte Formular (welches sonst auch beim manuellen hinzufügen angezeigt wird) angezeigt. Hier kann der Nutzer die Daten kontrollieren und dann der Datenbank hinzufügen. Nach dem der erste Eintrag hinzugefügt wurde soll ein neues Formular mit dem 2. eintrag angezeigt werden usw.

Das erzeugen der Formulare sowie das einfügen der Daten erfolgt auch in einem SwingWorker. Dieser aktualisiert gleichzeitig einer ProgressBar im Import-Formular die dem Nutzer anzeigt wieviele Daten (4/10 etc.) schon verarbeitet wurden.

Mein Problem ist nun das der SwingWorker des Import-Formulars auf einmal alle Formulare öffnet und die Progressbar dabei auf 100% setzt.

Was ich in der Theorie will ist, dass der SwingWorker der Import-Forumulars wartet, bis der SwingWorker des "Hininzufügen-Formular" mit dem hinzufügen der Daten fertig ist und erst dann weitermacht.

Der Import-SwingWorker bzw die Schleife dort drin müsste also für die Dauer des hinzufügens der Daten unterbrochen werden. Ich weis leider nicht wie ich das relaisieren soll.

Wird da irgendwas vom SwingWorker von "Haus" aus mitgeliefert oder wie sieht eine Realisierung in der Theorie aus?

Gruß
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Klingt nach "viel auf einmal". Sind die "Formulare" modale Dialoge (oder sollten sie es vielleicht sein?) Ein KSKB wäre nicht schlecht, sofern es denn noch (das erste) "K" sein kann...
 
C

Camino

Gast
Ich frag mich gerade, ob ein SwingWorker das richtige dafür ist. Warum machst du es nicht manuell und zwar so, dass du den 1. Datensatz ins Formular lädst, überprüfst und evtl. abänderst, dann klickst du auf speichern, der Datensatz wird in die DB eingetragen, die Progressbar eins weiter gesetzt und der nächste Datensatz ins Formular übernommen. Solange, bis alle Datensätze abgearbeitet sind.
 

Cromm Cruach

Mitglied
Ok funktioniert das denn aus dem "ImportFomular" hinaus? Hatte darmals dann immer das problem dass die veränderungen z.b in der progressbar immer nur dann sichbar wurden, wenn die Verarbeitung komplett zuende war.

Und dann bleibt noch meine Frage woher weis das importFormular wann das "Hinzufügen-Formular" (bzw dessen swingwoker) mit dem ersten datensatz fertig ist sodass der neue geladen werden kann.
 
C

Camino

Gast
Hmm, ohne den Code zu kennen, etwas schwierig. Aber es muss doch irgendeine Verbindung zwischen deinem Import-Formular und dem Hinzufügen-Formular bestehen. Sobald du im Hinzufügen-Formular den Datensatz zur Datenbank geschickt hast, holst du halt vom Import-Formular den nächsten Datensatz. Und die Progressbar muss halt auch über die Anzahl der gesamten und schon abgearbeiteten Anzahl der Datensätze informiert werden. Hört sich irgendwie so an, als müsstest du das mal mehr mit MVC umsetzen und evtl. einen Observer nehmen. Aber wie gesagt, ohne genauere Infos über die Struktur deiner Anwendung ist das nicht so einfach.
 

Cromm Cruach

Mitglied
Die Verbingung ist, das das Import das Hinzufügen-Formular aufruft! Das hinzufügen der Daten in die DB dauert etwas so 20 Sekunden, da noch Daten aus dem Netz geladen werden ect. In der Zeit zeigt ein Ladebildschirm den Fortschritt an. Am Ende verschwindet der Ladebildschirm und das "Hinzufügen-Formular" ist wieder Freigegeben. Erst JETZT sollen die nächsten Daten ins Formular geladen werden.
 

Cromm Cruach

Mitglied
So nun mal mit Code!

Java:
	public void actionPerformed(ActionEvent e){

		for(int i = 0; i < f.filenames.length; i++){
			new AnalyzeDataSwingWorker(f,i).execute();
		}
	}

Dieser ActionListener startet eine "Stapelverarbeitung". Für jede Datei wird ein Formular angezeigt, der Nutzer gibt Daten zu der entsprechenden Datei ein die dann Verarbeitet werden. Das ganze soll nacheinander ablaufen. Heist es wird erst das Formular für Datei1 angezeigt. Wenn der Nutzer die Daten eingegeben hat und die Daten verarbeitet wurden soll das Formular für datei2 angezeigt werden.

Mein Problem ist nun das alle Formulare gleichzeitig angezeigt werden. Da der SwingWorker bzw die Schleife ja nicht auf die Beendigung der Formulare und der darin befindenden SwingWorker wartet. Ich Suche nun nach einer Möglichkeit die Schleife zu unterbrechen und sie dann weiterlaufen zulassen, wenn die Verarbeitung der ersten Datei beendet ist.

Habs schon mit Thread.sleep sowie wait und notify von SwingWorker versucht. Entwerder blockiert mein System komplett oder es wird die erste Datei verarbeitet (wait scheint da zu funktionieren) aber das die weiteren werden nicht Verarbeitet (notify klappt also nicht).

Hier funktioniert die Verarbeitung einer Datei (nur einer die anderen werden nicht angezeigt)

Ich steuer den Swingworker das MainWindow welches alle Komponenten verbindet
Java:
	public void actionPerformed(ActionEvent e){

			f.owner.ads = new AnalyzeDataSwingWorker(f);
			f.owner.ads.execute();
	}

Mein SwingWorker
Java:
public class AnalyzeDataSwingWorker extends SwingWorker<Void, Void>{

	FileAnalysis f = null;
	
    public AnalyzeDataSwingWorker(FileAnalysis f){
        this.f = f;
    }

    @Override
    public Void doInBackground() throws Exception {
    	for(int i = 0; i < f.filenames.length; i++){
    		
    		f.owner.wait= true;
    		
			StringTokenizer t = new StringTokenizer(f.filenames[i], "[].", false);
			
			String quality = t.nextToken();
			String title = t.nextToken();
			
			MovieDataForm mdf = new MovieDataForm(f, "Daten hinzufügen");
			MovieSearch ms = new MovieSearch(mdf);
			
			ms.searchPanel.searchField.setText(title);
			ms.searchPanel.searchButton.doClick();
			
			mdf.tabPane.fileInfoPanel.qualityCombo.setSelectedItem(quality);
			mdf.tabPane.fileInfoPanel.sizeField.setText(f.size[i]);
			mdf.tabPane.setSelectedComponent(mdf.tabPane.picturePanel);
			
			f.owner.ads.wait();
    	}
			
    	
    	return null;
    }
}

Am ende der Datenverarbeitung soll mittes einer boolscher Variable darauf aufmerksam gemacht werden das ein SwingWoker wartet und dann fortgesetzt werden.

Java:
		if(f.owner.wait){
                        System.out.println("SwingWorker wird fortgesetzt");
			f.owner.wait = false;
			f.owner.ads.notify();
		}

Er Spring auf jedenfall in die Schleife (konsolenausgabe SwingWorker wird fotgesetzt kommt) leider hat das notyfy keine wirkung und auch notyfiAll bringt nichts.

Einer ne idee?
 

turtle

Top Contributor
Überschreibe doch die Methode
Java:
protected void done()
in deinem AnalyzeDataSwingWorker und mache erst einen neuen SwingWorker wenn der alte signalisiert, das er fertig ist.
 

Cromm Cruach

Mitglied
verstehe nicht genau die die methode dann aussehen soll / muss. Bzw. was sie mir bringt? Denn der SwingWorker soll ja warten bis die Verarbeitung der daten im anderen formular (dauert etwa 20 sekunden) beendet ist und erst dann soll ein neues formual angezeigt werden.

Ich brächte also in der Scheife irgend eine art von passivem warten?!
 
Zuletzt bearbeitet:

Cromm Cruach

Mitglied
Der AnalyseDataSwingWorker ist ja nur zum anzeigen der Formuare da und die done() wird aufgerufen sobald ein Formular angezeigt wird.

Ich hab iwie das gefühl das ich um das passive Warten auf die Beendigung der mdf-Formulars nicht herum komme. Aber wie schon gesagt funktioniert
Code:
wait()
und
Code:
notify
bzw.
Code:
notifyAll()
aus mir unerklärlichen gründen nicht.

Bzw. das Warten klappt ja schon. Wenn ich das fortsetzten des SwingWorkers hinbekommen würde wäre das problem schon gelöst!
 
C

Camino

Gast
Dieser ActionListener startet eine "Stapelverarbeitung". Für jede Datei wird ein Formular angezeigt, der Nutzer gibt Daten zu der entsprechenden Datei ein die dann Verarbeitet werden. Das ganze soll nacheinander ablaufen. Heist es wird erst das Formular für Datei1 angezeigt. Wenn der Nutzer die Daten eingegeben hat und die Daten verarbeitet wurden soll das Formular für datei2 angezeigt werden.

Mein Problem ist nun das alle Formulare gleichzeitig angezeigt werden. Da der SwingWorker bzw die Schleife ja nicht auf die Beendigung der Formulare und der darin befindenden SwingWorker wartet. Ich Suche nun nach einer Möglichkeit die Schleife zu unterbrechen und sie dann weiterlaufen zulassen, wenn die Verarbeitung der ersten Datei beendet ist.

Für jede Datei wird ein Formular angezeigt? Oder meintest du, dass es 1 Formular gibt und immer nur die Daten ausgetauscht werden? Wenn du mit MVC arbeitest, dann ist das Formular deine View, die Daten liegen im Model und über die Control speicherst du die Daten ab und holst den nächsten Datensatz.

Wenn du alles in einem SwingWorker laufen lässt, dann läuft das eben alles in einem Prozzess durch. Evtl. könntest du für jede Datei einen SwingWorker nehmen und starten. Aber wie schon gesagt: du solltest dir immer erst den nächsten Datensatz ins Formular holen, wenn der vorherige mit Klick auf Button abgespeichert wurde. Du kannst ja zu Beginn alle Dateien/Datensätze einlesen. Sobald dies geschehen ist, wird der erste Datensatz im Formular angezeigt, Klick auf Button, danach der nächste Datensatz usw.
 
Ä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
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
S SwingWorker :( AWT, Swing, JavaFX & SWT 6
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
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
C Thread - Beendigung unter Swing abwarten AWT, Swing, JavaFX & SWT 6
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
V JavaFX Teile eines Images Transparent machen AWT, Swing, JavaFX & SWT 4
I JavaFX Langes drücken eines Buttons AWT, Swing, JavaFX & SWT 4
B Swing Wie Witdh und Height eines GuiElements bekommen AWT, Swing, JavaFX & SWT 5
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
T Nur bestimmte Bereiche eines Fotos bearbeiten AWT, Swing, JavaFX & SWT 0
J Swing Erstellung eines User Interface AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
javampir Swing Wanderung eines JFrames AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben