Eigene Komponente in einem JScrollPane, wann und wie die Höhe setzen?

DarthShader

Erfahrenes Mitglied
Hallo,

ich habe in meinen Java Swing Programm ein einfach klingendes, aber für mich gerade schwer zu Lösendes Problem.

In einem normalen ScrollPane habe ich eine Komponente gelegt, welche ich selbst erstellt habe, abgeleitet von einem JPanel. Diese Komponente erstellt ihren Inhalt dynamisch je nach Parameter - im Prinzip werden nur JLabels untereinander in der JPanel gelegt. Mein Problem ist nun, dass ich ja die Größe dieses JPAnels per setPreferredSize festlegen muss, damit der Scrollbalken des umgebenen JScrollPane auch richtig funktioniert, denn der ViewPortView, was ja mein JPanel ist, "wächst" ja dynamisch nach unten.

Als Layoutmanager des JPanels habe ich TableLayout gewählt. Mein Problem ist, dass ich nicht genau weiß, zu welchem Zeitpunkt bzw. wo ich genau die preferred Höhe dieses JPanels setzen muss. Das ganze liegt in einem JDialog, und erst nachdem ich setVisible angewendet habe, berechnet der Layoutmanager die enthaltenen Größen und Positionen des JLabels (innerhalb des JPanels). Und erst danach kann ich ja überhaupt die Höhe alle Komponenten rausbekommen.

Nur, wann ist das? Sobald ich setVisible anwende bei einem modalen Dialog, kann ich janichts mehr machen, erst wenn der Dialog wieder geschlossen ist. Kann ich vielleicht irgendeine Methode des Dialogs oder meiner Komponente (die im ScrollPane liegt) überschreiben und dort die Höhe berechnen?


P.S. Im Prinzip macht die JTable das ja auch, wenn sie in einem JScrollPane liegt - neue Zeilen kommen hinzu, und die JTable Komponente wird nach unten vergrößert, sodass das ScrollPane entsprechend scrollen musss.


Ich würde mich über Hilfe sehr freuen


Vielen Dank!
 
Hallo,

da auch ein JDialog von Window erbt, würde ich hier mal bei der pack-Methode schauen !

Ein pack vor dem setVisible(true) sollte das Problem eigentlich lösen.

Das JPanel sollte die preferredSize eigentlich von deinem TableLayout automatisch beziehen.
Wenn du dort nicht unachtsam etwas überschreiben hast !

Gruß JAdix
 
Hallo,

vielen dank für Deine schnelle Antwort.

Bei pack() ist es ja so, dass es die Größe des Umgebenen Fensters, in meinem Fall den JDialog, anpasst. Das ist aber nicht mein Ziel - die Dialoggröße soll so bleiben wie sie ist.

Im Prinzip macht pack() schon das, was ich brauche, ich bräuchte es nur auf meiner eigenen Komponente, die innerhalb des JScrollPanes liegt.

Dieses Bild soll das mal verdeutlichen:

java_problem_hoehe_in_viewport.png


Der grüne Bereich ist der Knackpunkt, das ist meine eigene Komponente, die intern sich selbst ein paar JLabels (oder auch andere Komponenten) hinzufügt. Natürlich muss ihre eigene preferredSize dann ja angepasst werden, die Höhe muss ja größer werden, je mehr Komponenten da drin stecken. Die Komponente nutzt, wie gesagt, den TableLayout Manager, und pro JLabel wird einfach eine neue Zeile zum Layout hinzugefügt.

Der grüne Bereich geht noch (gestrichelt) weiter, das wird natürilch nicht angezeigt und soll scrollbar sein. Damit also die JScrollPane korrekt scrollt, muss die grüne Komponente die korrekte preferred - Höhe besitzen.

Und da ist jetzt mein Problem, natürlich könnte ich einfach manuell die Höhe berechnen, indem ich die preferred-Höhen aller enthaltenen Komponenten addiere. Aber der LayoutManager wird erst bei setVisible des JDialogs angestoßen, vorher stimmen die ganzen preferred-Höhen nicht, wenn ich sie abfrage (was auch logisch ist, denn es wurde noch nichts ge-layoutet).

Ich kappier einfach nicht, wo und wann ich dann die Höhe der grünen Komponente setzen muss. Im Printip bräuchte ich ein pack() für die grüne Komponente, und nicht für den JDialog.


Ich hoffe, ich konnte mich verständlich ausdrücken und die Grafik macht es noch etwas klarer. Ich würde mich sehr freuen wenn ich noch antworten bekomme :)


Danke!
 
Zurück