JPanel dynamisch anpassen

  • Themenstarter Themenstarter Gelöschtes Mitglied 9226
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gelöschtes Mitglied 9226

Gast
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?
 
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.
 
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?
 
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
Code:
setBounds()
neu anordnen (natürlich mit neu berechneten Größen). Unterschied: Du musst die Objekte nicht neu initialisieren, also kein
Code:
new JTable()
etc.

Wenn das nicht tut, probier vorher mal ein
Code:
myPanel.removeAll()
und dann eben wieder ein
Code:
myPanel.add(myTable)
... für alle Komponenten vom Panel.

Und ein
Code:
revalidate()
am Ende der Methode. Ich denke das müsste reichen 🙂

Java:
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();
}
 
ich arbeite mit statischen Positionen. Ohne Layout-Manager.
einen LayoutManager verwenden und schon ist das Problem gelöst.
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.
 
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
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben