Thread beenden, wenn Component nicht mehr benötigt wird

Status
Nicht offen für weitere Antworten.
S

SeppenToni

Gast
Hi

Ich bin dabei einen kleinen Ticker zu bauen, d.h. eigentlich nur eine Leiste, in der von Rechts nach Links ein beliebiger Text durchläuft. Dazu habe ich eine Klasse erstellt, welche von JComponent erbt und in paintComponent die Informationen zeichnet, funktioniert auch alles wie es soll.

Allerdings gibt es ein kleines Problem - um die Animation zu realisieren, starte ich in der Klasse einen neuen Thread, der jeweils nach einem gewissen Intervall den Text um 1 Pixel verschiebt. Das Problem ist nun, wie/wo ich diesen Thread wieder beenden kann oder soll. Gibt es irgendeinen Event oder eine Methode, die aufgerufen wird, wenn ein Component nicht mehr benötigt wird?

Ich habe gemerkt, dass wenn ich beim Parent als DefaultCloseOperation EXIT_ON_CLOSE wähle der Thread beim Schliessen des Fensters beendet wird, ich denke aber, dass hierbei nur der Thread abgeschossen und nicht automatisch sauber beendet wird. Wählt man nämlich DISPOSE_ON_CLOSE, läuft das Programm weiter...

Problem ist also: Wie erfährt ein Component, dass das Programm bzw. das aktuelle Fenster jetzt beendet wird um den gestarteten Thread sauber zu beenden? Ich habe bereits verschiedenste Events, sowie einen Destructor ohne Erfolg versucht.

Ich möchte das Beenden nicht vom Parent aus starten, da dieser Component ohne weiteres in verschiedenen Anwendungen ohne Anpassung funktionieren soll (also beispielsweise in einem JFrame, JDialog, JPanel, was auch immer, egal ob DIPOSE oder EXIT_ON_CLOSE).

Hat da jemand eine Idee?

Erstmal vielen Dank, SeppenToni
 
G

Guest

Gast
Danke Wildcard, jedoch glaube ich nicht, dass es ganz so einfach ist.
Ein JComponent hat keine WindowEvents und dem Hauptwindow möchte ich nicht extra einen Event anhängen müssen, damit der Component richtig funktioniert.

Das schliessen des Threads muss irgendwie innerhalb des JComponents ausgelöst werden können.

SeppenToni
 
G

Guest

Gast
@tfa: Habe ich bereits versucht, componentHidden wird leider nicht getriggert wenn das Fenster geschlossen wird.
@Wildcard: dispose von welchem Objekt? JComponent hat keine dispose Methode?
 

Marco13

Top Contributor
Hm. Das ist jetzt wohl nicht sooo trivial, aber als spontane Idee: Wenn der Thread als anonyme innere Klasse implementiert ist, und eine WeakReference auf "seine" Component enthält, dann müßte die WeakReference eigentlich mitkriegen, wenn die Component im Nirvana gelandet ist.... ???:L (ist aber nur ein Tipp, ob's geht, müßte man genauer prüfen...)
 

Wildcard

Top Contributor
Da wäre eine PhantomReference mit entsprechender Queue sicherlich geschickter, aber es kann Minuten dauern bis der GC drüber läuft :?
 
S

SeppenToni

Gast
Hm, interessanter Ansatz!
Wenn ich das richtig verstanden habe, soll durch eine WeakReference verhindert werden, dass der GC die Component aufräumt. Ich übergebe dem Thread also eine WeakReference und implementiere einen Destructor in der Component?

Wenn das so in etwa richtig war - funktionierts leider nicht :)
Der Destructor wird nicht aufgerufen.

Das kann doch nicht so schwierig sein :lol:
 

Marco13

Top Contributor
Die WeakReference verhindert eben gerade NICHT, dass die Component vom GC weggeräumt wird...
Code:
Component a = new Component();
WeakReference w = new WeakReference(a);
Combonent b = w.get() // Liefert die Component
a = null; // Alle referenzen auf die 
b = null; // Component auflösen... 
System.gc(); // KANN(!) die Component löschen (wenn er will)
Combonent c = w.get() // Liefert vielleicht null
Aber eigentlich wäre es am saubersten, wenn derjenige, der die Component von ihrem Parent entfernt, auch ganz pragmatisch sagen würde, dass der Thread aufhören soll - was spricht denn da dagegen?
 
S

SeppenToni

Gast
Ähm ja, das habe ich eigentlich auch gemeint... Sollte eigentlich:
"Wenn ich das richtig verstanden habe, soll durch eine WeakReference verhindert werden, dass der GC die Component nicht aufräumen kann."

Auf jedenfall klappts nicht - und wie Wildcard gesagt hat, ggf. läuft der Thread dann noch ne ganze Weile weiter, auch nicht schön gelöst.

Aber eigentlich wäre es am saubersten, wenn derjenige, der die Component von ihrem Parent entfernt, auch ganz pragmatisch sagen würde, dass der Thread aufhören soll - was spricht denn da dagegen?
Und wer macht das, wenn man das Fenster einfach schliesst?
 
S

SeppenToni

Gast
So, ich glaube es funktioniert jetzt.
Ich habe jetzt einen AncestorListener verwendet. So wie's aussieht wird ein ancestorRemoved getriggert wenn das Fenster geschlossen wird.

Nochmals Danke für eure Hilfe
SeppenToni
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
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
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
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
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
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
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
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
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

Ähnliche Java Themen

Neue Themen


Oben