# JPanel dynamisch anpassen



## diabolik (16. Okt 2009)

Mein Programm soll zyklisch Daten aus einer Textdatei einlesen und die darin enthaltenen Werte in entsprechenden Tabellen und Textfeldern darstellen. Hierzu habe ich mir eine JPanel-Klasse mit diversen Tabellen, Labels und Textfeldern erstellt. Nennen wir Sie "panelA".

Ich fülle, beim Start meiner Anwendung, alle Elemente mit allen erforderlichen Daten und importiere das Panel dann mittels ".getContentPane().add(panelA);" in mein Hauptfenster. Dabei werden alle Elemente automatisch der aktuelle gegebenen Fenstergröße angepasst. Das funktioniert! 

Nun möchte ich zum Beispiel das Hauptfenster verkleinern. Dann soll sich das Panel direkt nach dem Component Event "componentResized()" mit allen enthaltenen Elementen der neuen Fenstergröße anpassen, ohne das ich die Anwendung neu starten muß. Das funktioniert aber nicht. Ich kann die neue Fenstergröße zwar mühelos abfangen, aber ich weiß nicht wie es hinbekomme, daß das Panel neu erstellt wird und in seiner neuen Form im Hauptfenster dargestellt wird. 

Hat jemand ein Idee?


----------



## KrokoDiehl (16. Okt 2009)

Was benutzt du denn für einen _LayoutManager _auf dem Panel? Die sind dafür verantwortlich, dass _Container _(zB _JPanel_) nach einem Vergrößern/Verkleinern neu gelayoutet werden. Das sollte mit jedem gängigen _LayoutManager _automatisch tun.
Wenn du allerdings absolute Positionen bei denen Panel-Komponenten benutzt, muss man das Verkleinerungs-/Vergrößerungsverhalten auch selbst implementieren.


----------



## diabolik (16. Okt 2009)

ich arbeite mit statischen Positionen. Ohne Layout-Manager.

Aber ich berechne ja die ganzen Sachen vor jedem Erstellen. Das funktioniert auch. Wenn ich eine bestimmte Fenstergröße über meine "defaults" festlege und die Anwendung dann neu starte, sieht alles so aus, wie ich es haben will. 

Aber wie kann ich im laufenden Betrieb dem Hauptfenster sagen, dass es das geänderte Panel neu laden soll?


----------



## KrokoDiehl (16. Okt 2009)

Nagut, das macht es nicht einfacher  
Aber ich kenne das Problem. Nur ist es bei uns (vorerst) so, dass man nicht vergrößern/verkleinern kann.

Aber zu dir. Du sagst du kannst das Event vom Vergrößern/Verkleinern abfangen, das ist schonmal die halbe Miete. 
An der Stelle musst du dann im Grunde genau das machen, was du auch zu Programmstart mit dem Panel machst: Alle Komponenten darauf mit 
	
	
	
	





```
setBounds()
```
 neu anordnen (natürlich mit neu berechneten Größen). Unterschied: Du musst die Objekte nicht neu initialisieren, also kein 
	
	
	
	





```
new JTable()
```
 etc. 

Wenn das nicht tut, probier vorher mal ein 
	
	
	
	





```
myPanel.removeAll()
```
 und dann eben wieder ein 
	
	
	
	





```
myPanel.add(myTable)
```
 ... für alle Komponenten vom Panel.

Und ein 
	
	
	
	





```
revalidate()
```
 am Ende der Methode. Ich denke das müsste reichen 


```
protected void layoutMyPanel(int newWidth, int newHeight)
{
    //myPanel.removeAll(); ...ggfs nötig? (s. (*))
    myTable.setBounds( /*neue bounds*/ );
    //myPanel.add(myTable);  (*)

    myTextPane.setBounds( /* neue bounds*/ );
    //myPanel.add(myTextPane); (*)

    ...usw.
    
    myPanel.revalidate();
}
```


----------



## Michael... (16. Okt 2009)

diabolik hat gesagt.:


> ich arbeite mit statischen Positionen. Ohne Layout-Manager.


einen LayoutManager verwenden und schon ist das Problem gelöst.


diabolik hat gesagt.:


> Aber ich berechne ja die ganzen Sachen vor jedem Erstellen.


und trotzdem kann man einen LayoutManager verwenden. Je nachdem wie komplex die Anordnung ist, könnte man einen eigenen LayoutManager schreiben, was in Deinem Fall, da Du die Größen eh schon berechnest, eventuell keinen grossen Zusatzaufwand darstellt.


----------



## diabolik (16. Okt 2009)

Es funktioniert! Ich bedanke mich bei Euch! Ich war schon nah dran, hatte aber das .revalidate() im Panel und das .repaint() im MainFrame vergessen! 

Danke!!!

PS: dass ich nichts von LayoutManagern halte ist "historisch gewachsen". Ich habe es von je her vorgezogen, die totale Kontrolle über jedes Element in meiner Hand zu halten, weil mich frühere LayoutManager zum Wahnsinn brachten, da sie nicht immer so funktionierten, wie ich es erwartet hätte/hatte. Natürlich bedeutet das immer einen nicht unerheblichen Mehraufwand, kann aber manchmal auch ziemlich nützlich sein...

MfG
Diabolik


----------

