List mit JFrames, Frage zu add und remove

Hi!

Ich habe folgende Liste in meiner Swing-Anwendung, mit passenden Gettern und Settern:


public static List<JFrame> getOpenWindows() {
	return openWindows;
}
public void setOpenWindows(List<JFrame> openWindows) {
	Main.openWindows = openWindows;
}```
Diese möchte ich nutzen um weitere Fenster, die mit Hilfe der laufenden Applikation geöffnet werden, zu registrieren - also adden - um über die List.size() verschiedene Schleifen anzusteuern.

Jetzt dachte ich mir, ich öffne in den Klassen, die weitere Fenster erzeugen einfach mit
```Main.getOpenWindows().add(window); //window ist hier ein neuer JFrame```
die Liste und füge das jeweilige Fenster hinzu. Allerding scheint sich die Liste nicht zu vergrößern, die Size bleibt immer null. Wieso?

Das zweite Problem ist für mich noch unüberschaubar, da brauch ich einen Tip: Diese o.g. Liste speichert ja alle Fenster die geöffnet wurden. Über das Menü meiner Swing-Applikation kann ich "Alle Fenster" schließen auswählen und über eine Schleife die Liste durchgehen, die Fenster disposen und die Liste clearen. So weit klar. Aber wie kann ich nur EIN Fenster aus der Liste nehmen - damit mein ich nicht "remove" sondern das Problem WELCHES Fenster will ich überhaupt removen? Haben die Fenster eine ID oder sowas, über die ich der Liste dann sagen kann, nimm bitte Fenster XY raus? (Für den Fall das der Anwender eines der Fenster selbständig geschlossen hat...)

Ok, ein Problem ein hat sich erledigt, die Liste füllt sich doch, warum es beim Testen vorhin nicht ging weiss ich nicht… :frowning:

Aber was meine Frage mit dem rauspicken von einzelnen Fenstern angeht, wäre ich über Tips sehr erfreut :slight_smile:
Grundsätzlich schwebt mir der Gedanke vor, den Fenstern halt nen EventHandler zu verpassen, der dann beim Schließen auf die Liste zugreift, ich weiß halt nur nicht um welches Element ich die Liste bitten soll, wie heisst den so ein eingetragenes Fenster??

Für dein zweites Problem:

Du kannst einfach list#remove(window) aufrufen - sofern ich das jetzt richtig verstanden habe, was du möchtest.

was du machen kannst ist zum einen die Instanzenvergleichen mit Elementausliste == anderes Fenster
Dazu kommt das jedes Object in Java einen Hashwert hat, welcher wie eine eindeutige ID ist.

Ich weiß jetzt nicht genau ob du abfragen kannst ob ein Fenster geschlossen ist, aber du kannst einfach einen WindowListener an die Fenster hängen um abzufangen wenn ein Fenster geschlossen wird.

Zu den beiden Tip-Gebern erst mal Danke! Ein WindowClosingEvent hab ich angelegt, eine eigene Klasse, die allen neuen Fenstern zugewiesen wird. In den Klassen die also Bild- oder TonDokumente, etc. öffnen, hab ich einfach
window.addWindowListener(new DokumentAusgabeEventHandler()); reingesetzt un dann folgende Klasse neu geschrieben:

	public void WindowClosing(WindowEvent we) {
		JFrame closeWindow = we.get()...das Fenster des Events, aber wie schreib ich das? 
		Main.getOpenWindows().remove(closeWindow);
		closeWindow.dispose();	
	        System.out.println("Fenster geschlossen: "+closeWindow+", "+Main.getOpenWindows().size());
	}
}```
Somit greifen ja alle auf dieses selbst definierte WindowClosing-Event zu. Aber macht es jetzt Sinn einen neuen JFrame zuzuweisen? Und was ist denn das Fenster des Events? Muss ich den Namen / bzw. den Hashwert erfragen um mit der Zeile ...remove(closeWindow) dieses Fenster zu entnehmen/löschen?

PS: Ich hab in der API Informationen zu "Window" gefunden, dort würde >we.get(window)< ja sehr schön funktionieren, aber ich habe ja leider JFrames und dafür fand ich keine Vergleichbare Methode...

Ich glaub es gibt getSource() das müsste dir das Fenster liefern welches das Event ausgelöst hat, aber wieso willst du den Hash des Fensters abfragen? Remove(Fenster) reicht eigentlich aus, weil dann die Liste die Vergleiche übernimmt.

Hast recht, mit getSource() scheint es simple gelöst, ich hatte mir es komplizierter vorgestellt. Wenn ich 6 Fenster aufmache, eines davon per Hand schließe und danach meinen Menüpunt “Alle geöffneten Fenster schließen” nutze, gehen sie reibungslos zu ohne Exception aus der List.

	public void WindowClosing(WindowEvent we) {
		Main.getOpenWindows().remove(we.getSource());
		System.out.println("Anzahl: "+Main.getOpenWindows().size());
		((Window) we.getSource()).dispose();		
	}
}```
Also funktioniert der remove anscheinend. Ich hab mich nur etwas gewundert, da das System.out.println... in meinem ClosingEvent nichts ausspuckt und dachte die Methode würde irgendwie übergangen. Aber anscheinend ignoriert er einfach die gewünschte Ausgabe... komische Sache...

Interessanterweise musste ich zum disposen auf 'Window' casten, da we.getSource() ja ein Object liefert. Ich hab mir die API extra nochmal angeschaut und bin eigentlich davon ausgegangen, das Window und JFrame nicht miteinander kompatibel wären... noch mehr Rätsel.. :D

Window ist die Oberklasse von JFrame :wink: JDialog und JFrame sind nicht kompatibel

Wenn die Ausgabe nicht kommt wird die Methode nicht aufgerufen :wink: