Hallo,
ich schreibe ein Zeichenprogramm, bei dem eine Zeichenfläche 2 Listen verschiedenartiger JPanels verwaltet:
writePanels und linePanels
In erstere kann man etwas hineinschreiben, die zweiten sind Panels, auf denen eine Linie von einem zum anderen Panel gezeichnet wird.
Die writePanels sollen so funktionieren, dass sie von Grund auf nur die Größe des leeren beinhalteten Textfelds haben, wenn man dann etwas reinschreibt, werden sie breiter/höher, beim Löschen wieder schmaler/flacher. Dafür benutzte ich für die Zeichenfläche den eigenen LayoutManager, der die Größe des Panels immer auf die preferredSize setzt:
Die Maße des linePanels berechnen sich abhängig von Position und Größe der writePanels.
Nun möchte ich, dass immer, wenn sich etwas an den writePanels ändert, die Maße des linePanels neu bestimmt werden und dann auch dieses neu gezeichnet wird.
Meine Überlegung: Im Prinzip ruft die Methode layoutContatiner ja setBounds() für ALLE Komponenten der Zeichenfläche auf, also auch für die linePanels.
Das nützt mir aber zunächst nichts, da ich ja erst die Maße der linePanels korrekt neu berechnen müsste (dafür habe ich in der Klasse LinePanel eine Methode updateBounds() ohne Parameter, da ein LinePanel Referenzen auf die beiden beteiligten writePanels hält).
Also habe ich überlegt, ob es sinnvoll wäre, setBounds in LinePanel zu überschreiben und darin erst ein
updateBounds() und dann den Aufruf
super.setBounds(neu berechnete Werte) zu machen. Das erscheint mir aber völlig falsch, denn dann würden ja die Parameterwerte, die setBounds erhält, gar nicht gebraucht werden, denn man würde ja super.setBounds() mit den aktualisierten Werten aufrufen. Scheint mir verdächtig ... :/
Und außerdem funktioniert es auch nicht. Daher zunächst mal zwei Fragen:
1. Ist setBounds eine Methode, die man in manchen Fällen überschreibt, oder stimmt dann schon mal was von der Grundarchitektur nicht?
2. Wann genau wird der LayoutManager aktiv? Wodurch wird layoutContainer getriggert?
ich schreibe ein Zeichenprogramm, bei dem eine Zeichenfläche 2 Listen verschiedenartiger JPanels verwaltet:
writePanels und linePanels
In erstere kann man etwas hineinschreiben, die zweiten sind Panels, auf denen eine Linie von einem zum anderen Panel gezeichnet wird.
Die writePanels sollen so funktionieren, dass sie von Grund auf nur die Größe des leeren beinhalteten Textfelds haben, wenn man dann etwas reinschreibt, werden sie breiter/höher, beim Löschen wieder schmaler/flacher. Dafür benutzte ich für die Zeichenfläche den eigenen LayoutManager, der die Größe des Panels immer auf die preferredSize setzt:
Java:
public void layoutContainer(Container parent) {
Rectangle bounds;
Dimension pref;
for (Component c : parent.getComponents()) {
bounds = c.getBounds();
pref = c.getPreferredSize();
c.setBounds(bounds.x, bounds.y, pref.width, pref.height);
}
}
Die Maße des linePanels berechnen sich abhängig von Position und Größe der writePanels.
Nun möchte ich, dass immer, wenn sich etwas an den writePanels ändert, die Maße des linePanels neu bestimmt werden und dann auch dieses neu gezeichnet wird.
Meine Überlegung: Im Prinzip ruft die Methode layoutContatiner ja setBounds() für ALLE Komponenten der Zeichenfläche auf, also auch für die linePanels.
Das nützt mir aber zunächst nichts, da ich ja erst die Maße der linePanels korrekt neu berechnen müsste (dafür habe ich in der Klasse LinePanel eine Methode updateBounds() ohne Parameter, da ein LinePanel Referenzen auf die beiden beteiligten writePanels hält).
Also habe ich überlegt, ob es sinnvoll wäre, setBounds in LinePanel zu überschreiben und darin erst ein
updateBounds() und dann den Aufruf
super.setBounds(neu berechnete Werte) zu machen. Das erscheint mir aber völlig falsch, denn dann würden ja die Parameterwerte, die setBounds erhält, gar nicht gebraucht werden, denn man würde ja super.setBounds() mit den aktualisierten Werten aufrufen. Scheint mir verdächtig ... :/
Und außerdem funktioniert es auch nicht. Daher zunächst mal zwei Fragen:
1. Ist setBounds eine Methode, die man in manchen Fällen überschreibt, oder stimmt dann schon mal was von der Grundarchitektur nicht?
2. Wann genau wird der LayoutManager aktiv? Wodurch wird layoutContainer getriggert?