Listener fuer JPanel der merkt wenn sich was geaendert hat?

  • Themenstarter Themenstarter sirbender
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

sirbender

Gast
Hallo,

Ich habe ein JPanel das viele verschachtelte Componenten besitzt. Ich wuerde gerne dem JPanel sowas wie einen HierarchyListener oder PropertyListener oder sonstwas hinzufuegen um informiert zu werden wenn dem JPanel oder einem seiner Kind-Componenten eine Komponente hinzugefuegt oder entfernt wird.

Mit HierarchyListener hatte ich kein Glueck. Gibt es einen anderen Listener der das kann?


Danke...sb
 
Schreibe doch einfach in die Methode, die einem Panel etwas hinzufügt zum Schluss noch

panel.validate();
 
L-ectron-X hat gesagt.:
Schreibe doch einfach in die Methode, die einem Panel etwas hinzufügt zum Schluss noch

panel.validate();

wenn ich das mache wird dann ein Event gefeuert? Oder schlaegst du vor validate in panel zu ueberschreiben?


Ich rufe addedComponent.revalidate() auf - es sollten also alle Parentcomponents validiert werden. Hilft das irgendwie um mein Problem zu loesen?

Was fuer einen Listener muesste ich JPanel hinzufuegen, damit ich diesen aufruf von revalidate() mitkriege?
 
Du kannst einen eigenen RepaintManager setzen:
Code:
RepaintManager.setCurrentManager(new MyRepaintManager());

Die addInvalidComponent() Methode ist die, die aufgerufen wird, wenn revalidate() auf einer Swingkomponente aufgerufen wird,
und kann folglich angespannt werden, um alle revalidate Anträge abzufangen:
Code:
class MyRepaintManager extends RepaintManager {
    public synchronized void addInvalidComponent(JComponent invalidComponent) {
        System.out.println("adding Invalid Component: " + invalidComponent);
        super.addInvalidComponent(invalidComponent);
    }
}
 
André Uhres hat gesagt.:
Du kannst einen eigenen RepaintManager setzen:
Code:
RepaintManager.setCurrentManager(new MyRepaintManager());

Die addInvalidComponent() Methode ist die, die aufgerufen wird, wenn revalidate() auf einer Swingkomponente aufgerufen wird,
und kann folglich angespannt werden, um alle revalidate Anträge abzufangen:
Code:
class MyRepaintManager extends RepaintManager {
    public synchronized void addInvalidComponent(JComponent invalidComponent) {
        System.out.println("adding Invalid Component: " + invalidComponent);
        super.addInvalidComponent(invalidComponent);
    }
}

Wow...sowas wie eigenen RepaintManager setzen sollte doch wirklich die allerletzte Notloesung sein, oder? Ich stehe nicht auf extreme Hacks wie diesen. Das kann einem schnell um die Ohren fliegen 🙁

Ich hatte gehofft es gibt einen regulaeren Weg zu tun was ich will 🙁
 
Anonymous hat gesagt.:
Ich stehe nicht auf extreme Hacks wie diesen. Das kann einem schnell um die Ohren fliegen
Etwas, das man nicht gleich versteht, muss nicht unbedingt verwerflich sein.
Mein Code ist weder ein Hack, noch extrem (nur 6 einfache Codezeilen können schwerlich extrem sein),
noch kann er um die Ohren fliegen: der super Aufruf stellt sicher, daß nix vermasselt wird
(das ist eine allgemein übliche Vorgehensweise beim Überschreiben von Methoden).
Der Rest ist normaler, regulärer Java Code und dem Beispiel von Sun nachempfunden:
RepaintManagerDemo.java (für mehr Erklärungen dazu, siehe den Artikel: Malen in AWT und Swing)
Ansonsten kannst du es auch mit einem ContainerListener versuchen (falls das passt, ist es dir wohl lieber als mein "Hack" :lol: ).
Vielleicht kann man auch etwas mit ActionPanel anfangen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben