Threads Im Dialog geöffneter Thread zeichnet nicht

phiLue

Mitglied
Moin zusammen,

muss mich leider wieder mit einem Problem melden 😱
Ich habe eine kleine Anwendung geschrieben welche mir ein paar Datein durchgeht und da dies ein wenig länger dauern kann hab ich mir einen Dialog samt ProgressBar zusammengebaut.

Diesen Dialog will ich nun in einem extra Thread starten und das funktioniert auch. Was nicht funktioniert ist, das die Komponenten in diesem Dialog gezeigt werden.

Hier der Code wie ich den Dialog aufrufe.
Java:
final ProgressDialog 	dlg = new ProgressDialog(null);
						
						Thread t = new Thread(new Runnable() {
						      public void run() {
						        dlg.setVisible(true);
						      }
						    });
						t.start();

Nachdem ich diesen Thread gestartet habe, arbeite ich die Dateien durch und schließe den Dialog wieder indem ich einfach dlg.setVisible(false); aufrufe. Wenn ich den Dialog nicht schließe bleibt er offen und die Komponenten werden gezeichnet sobald er die Daten durchgearbeitet hat. Sollte genau sowas nicht verhindert werden durch einen Thread?

Vielleicht kann mir hier einer helfen 🙂
 
schwer was in den verklausulierten Sätzen zu lesen,
ich vermute, dein Problem ist, dass erst 'am Ende' etwas zu sehen ist?
genau dieser Prozess, dieses Erstellen der Komponenten, muss in einen Thread, nicht der setVisible(true)-Aufruf

aber ziemlich vage ohne Beschreibung z.B. dieser Komponentenerzeugung, das Zusammenspiel aller beteiligten Threads/ Listener-Methoden usw.
 
Hi,

dein Thread ist momentan sinnlos, sogar falsch.

Nachdem ich diesen Thread gestartet habe, arbeite ich die Dateien durch
Den Dialog erstellen und anzeigen solltest du ganz normal im EDT.
Die Aufgabe mit den Dateien musst du in einem weiteren Thread erledigen. Und von dort aus lässt du den Fortschritt aktualisieren (jedoch im EDT).
Momentan führst du die Aufgabe wohl im EDT aus (lässt sich dem Code-Ausschnitt nicht entnehmen). Dadurch wird dieser für Zeichenaufgaben blockiert.

Das ist aber schon ein wenig low-level, was du da machst. Du erfindest das Rad neu.
Ganz high-level löst du das mit [JAPI]javax.swing.ProgressMonitor[/JAPI]: How to Use Progress Monitors (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)

Noch high-level wäre die Nutzung von [JAPI]javax.swing.SwingWorker[/JAPI]: Worker Threads and SwingWorker (The Java™ Tutorials > Creating a GUI With JFC/Swing > Concurrency in Swing)

Am besten schaust du dir aber das ganze Kapitel über Nebenläufigkeit in Swing an (dort dann auch die Erklärung des EDT): Lesson: Concurrency in Swing (The Java™ Tutorials > Creating a GUI With JFC/Swing)
 
@xehpuk
Argh, genau das war mein Problem 😀
Vielen Dank auf jeden Fall, damit hat sich das jetzt zum Glück gelöst 🙂

Kannte Thread-Programmierung bisher nur vom Android und da gibt es diese schöne AsyncTask Klasse die das ganze ziemlich einfach macht.

Danke nochmal auch an die anderen die mir bei der Lösung des Problems geholfen haben und entschuldigt für die schlechte Beschreibung meines Problems u.u
 

Neue Themen


Zurück
Oben