Default-WindowListener JFrame entfernen (Stichwort: iconified)

Monsees

Mitglied
Moin moin!

Ich habe ein paar Threads zum Thema "wie verhindere ich das iconifizieren eines JFrame" gelesen und mir ein paar Gedanken dazu gemacht, die Fragen aufgeworfen haben.

1. Ein default JFrame-Objekt reagiert auch ohne Zutun (Hinzufügen eines Listeners) auf Events innerhalb seiner "MenuBar". Allerdings liefert getWindowStateListeners() "0" zurück, warum?
Existiert ein Default Listener an den man nicht rankommt?

2. Statt einen eigenen Listener zu implementieren, der keine Reaktion auf ein Event vom Typ "iconified" zeigt, könnte man doch auch die Methoden des JFrames überschreiben, welche ein Event vom Typ "iconified" abfeuern/dispatchen. Oder wird das (z.B. durch Modifizierer) verhindert? Ich habe dazu im Quelltext von JFrame, Frame und Window bisher nix gefunden 🙁

Wäre euch für ein paar Statements sehr dankbar 😉
 
1. Ein default JFrame-Objekt reagiert auch ohne Zutun (Hinzufügen eines Listeners) auf Events innerhalb seiner "MenuBar". Allerdings liefert getWindowStateListeners() "0" zurück, warum?
Existiert ein Default Listener an den man nicht rankommt?
Du sprichst hier von den Standard Window-Icons: minimize, maximize, close. Diese sind Systemabhängig und sind nicht Teil von Java. Es wurden Hooks in den nativen controls eingebaut, damit man auf diese reagieren kann. Also kann man sagen, dass es einen Standardlistener des Systems gibt - und ja man kommt an den nicht ran.
2. Statt einen eigenen Listener zu implementieren, der keine Reaktion auf ein Event vom Typ "iconified" zeigt, könnte man doch auch die Methoden des JFrames überschreiben, welche ein Event vom Typ "iconified" abfeuern/dispatchen. Oder wird das (z.B. durch Modifizierer) verhindert? Ich habe dazu im Quelltext von JFrame, Frame und Window bisher nix gefunden 🙁
Einen eigenen Listener schreiben, der mir dieses Event "iconified" abfängt und frame.setExtendedState(JFrame.NORMAL) aufruft. Da hast du dann die Funktionalität, aber du siehst wie es kleiner und wieder größer gemacht wird.
Am besten ist du wirfst die Dekoration des OS weg (frame.setUndecorated(true);) und baust dir am oberen Ende deine eingenen Controls - dabei verlierst du das OS L&F aber ist die saubere Lösung.
 
Vielen Dank für die schnelle Rückmeldung!

Du sprichst hier von den Standard Window-Icons: minimize, maximize, close. Diese sind Systemabhängig und sind nicht Teil von Java. Es wurden Hooks in den nativen controls eingebaut, damit man auf diese reagieren kann. Also kann man sagen, dass es einen Standardlistener des Systems gibt - und ja man kommt an den nicht ran.

Check, das wollte ich hören.🙂

Einen eigenen Listener schreiben, der mir dieses Event "iconified" abfängt und frame.setExtendedState(JFrame.NORMAL) aufruft. Da hast du dann die Funktionalität, aber du siehst wie es kleiner und wieder größer gemacht wird.
Am besten ist du wirfst die Dekoration des OS weg (frame.setUndecorated(true)😉 und baust dir am oberen Ende deine eingenen Controls - dabei verlierst du das OS L&F aber ist die saubere Lösung.

Jep, diese beiden Möglichkeiten sind mir bekannt. Ist denn die von mir beschriebene (d.h. die dispatch-Methoden der Eventquelle (JFrame) so überschreiben, dass sie im Falle eines "iconified" einfach keine Listener-Methode aufruft) Variante, nicht möglich oder schlicht zu kompliziert?
 
Zuletzt bearbeitet:
Jep, diese beiden Möglichkeiten sind mir bekannt. Ist denn die von mir beschriebene (d.h. die dispatch-Methoden der Eventquelle (JFrame) so überschreiben, dass sie im Falle eines "iconified" einfach keine Listener-Methode aufruft) Variante, nicht möglich oder schlicht zu kompliziert?
Wie schon oben beschrieben sind die Controls Systemabhängig und werden auch so ausgeführt. Das heißt Ein Event passiert durch klicken auf "Minimieren" -> das Fenster wird minimiert -> Java erhält das Event. Es wird nur eine Notification durch das Event erzeugt, aber man kann das Event nicht verhindern, außer natürlich man schreibt sich die Controls selbst (was auch - wie in meinem letzten Post beschrieben - die saubere Lösung ist).
 
Ich habe gedanklich nicht sauber zwischen JFrame und den Controls getrennt. Was nützt das Überschreiben irgendwelcher Dispatch-Methoden des JFrames, wenn die Events von den Controls gefeuert werden, an die man nicht rankommt.

Damit ist der Groschen offiziell gefallen, danke!!! 😉
 

Zurück
Oben