JTable in Jpanel => JPanel wird riesig

blub11

Mitglied
Hallo!
Ich beschäftige mich grad als Beginner mit der GUI und möchte erst einmal von Hand anlegen (erstmal keine GUI-Builder nehmen, um die Hitnergrund erst einmal zu verstehen).

Nun habe ich aber ein Problem:
Wenn ich eine JTable in ein JPanel adde, muss ich ja zuerst ein Scrollpane dazwischen packen, ansonsten werden meine Spaltennamen gar nicht erst angezeigt (weiß jemand warum?).
So dann wird aber mein JPanel riesig, d.h. obwohl mein JTable nur eine Zeile braucht, zieht er unter der Tabelle das JPanel so weit runter******

Kann mir Jemand erklären, wieso das so ist und was man dagegen tun kann?

Als ich die GUI einmal mit dem Mantisse Builder erstellt habe, läuft natürlich alles so wie es soll. Anscheinend hat dieser auch gar kein JPanel benutzt (s. Screen2)?

Bild zu Frage 1:
Unbenannt.png

Bild zu Frage 2:
Unbenannt2.png

Danke für eure Antworten :)
 

genodeftest

Erfahrenes Mitglied
zur Frage 2: Ja, dieses JPanel dazwischen brauchst du nicht. Wenn du es doch nutzt, musst du aufpassen, dass die JScrollPane den Platz voll ausnutzt, z.B. per BorderLayout.CENTER
 

blub11

Mitglied
Hmm, aber ich dachte bei dem standardmäßigen BorderLayout von JFrame kann man in jeden der 5 Bereiche nur 1 Komponente hinzufügen. Und hat der GUIBuilder aber 2 Komponenten in den NORTH-Teil gebaut?
 

Akeshihiro

Erfahrenes Mitglied
Es ist gut, dass du dich mit den Sachen auseinander setzen willst und nicht gleich mit Klickbunti-Editoren alles kaputt machen. Damit sind zwar die Oberflächen schnell zusammengepfuscht, aber wer den Unterbau nicht kennt, wird damit nicht weit kommen.

Warum das JPanel die JScrollPane so riesig macht, ist schnell gesagt. Das JPanel verwendet standardmäßig das FlowLayout und dieses ordnet die Komponenten standardmäßig horizontal an und gibt alle Komponenten die empfohlene Größe (getPreferredSize()). Diese Außmaße, die du da also hast, ist die Schuld von der JScrollPane, denn die hat eine nicht ganz kleine empfohlene Größe.

Und warum du ohne JScrollPane keine Spaltenköpfe siehst ist auch schnell erklärt. Die JTable kann die gar nicht darstellen. Die JTable ist einfach nur eine ganz stumpfe Tabelle mit Werten, mehr nicht. Die JScrollPane hat noch nicht sichtbare Bereiche, nämlich die Ränder und die Ecken. Diese kann man verwenden, wie man will, auch mit eigenen Implementierungen. In Kombination mit einer JTable werden eben oben die Spaltenköpfe zu der JTable angezeigt.
 

blub11

Mitglied
Danke für die gute Erklärung :)!
Leider kann man von der JScrollPane dessen "preferredSize" nicht setzen.
Ich habe jetzt aber 2 Lösungen gefunden, wozu ich auch nochmal 1 Frage habe:

1.) Diese Methode der JTable benutzen:
Code:
tableAusgabe.setPreferredScrollableViewportSize(tableAusgabe.getPreferredSize());
 // Sets the preferred size of the viewport for this table.

Dann funktioniert es einwandfrei. So hierzu aber meine Frage:
Ich veränder hiermit doch eigentlich die Größe des sichtbaren scrollbaren Bereichs ("PreferredScrollableViewportSize") der TABELLE oder? Und zwar auf Basis der "preferredSize" der Tabelle, also den Platz, den die Tabelle auch für sich beansprucht.
1. Frage:
Ist die "PreferredScrollableViewportSize" der JTable standardmäßig eventuell zu riesig? Wenn ja, wie kommt sie zustande?

2. Frage:
Warum wird die Größe der JScrollPane dann trotzdem mit reduziert (was ja gewollt ist..).
Holt sich die JScrollPane etwa diesen Wert der (neuen) "PreferredScrollableViewportSize" aus dem JTable?

Wenn dies so ist, so müsste die JTable Schuld an diesem große Platz unterhalb ihr selbst haben (was ich schon in der 1. Frage als "Theorie" aufgestellt habe).

Nur so kann ich mir deine Erklärung auch erklären:
Das JPanel verwendet standardmäßig das FlowLayout und dieses ordnet die Komponenten standardmäßig horizontal an und gibt alle Komponenten die empfohlene Größe (getPreferredSize()). Diese Außmaße, die du da also hast, ist die Schuld von der JScrollPane, denn die hat eine nicht ganz kleine empfohlene Größe.

Möglichkeit 2 wäre, den Table Header zu bekommen und ihn extra vor die Tabelle zu setzen.

Grüße
 
Zuletzt bearbeitet:

Akeshihiro

Erfahrenes Mitglied
Ich vermute mal, dass ich mich bezühlich der preferredSize bei der JScrollPane vertan hab, könnte auf die JTable zurückzuführen sein. Ich probier mal eben bissl rum und sag dann bescheid.

EDIT:
Ja, also ich muss das mit der JScrollPane korrigieren. Du hast recht, das wird durch die JTable gesteuert. Ich hab mir da mal den Code angeschaut und das Standardverhalten ist eben, dass preferredViewportSize auf die Größe 450, 400 gesetzt wird. Diese Größe wird durch die Methode setPreferredScrollableViewportSize(Dimension) gesetzt. Deswegen nimmt eigentlich die Tabelle so viel Platz weg. Wenn ich so drüber nachdenke, dann wäre das auch komisch gewesen, denn dann müsste die JScrollPane ja auch bei anderen Komponenten so riesig sein und das ist sie ja nicht.

Und doch, die preferredSize lässt sich über setPreferredSize(Dimension) setzen und zwar bei allen Komponenten.
 
Zuletzt bearbeitet:

blub11

Mitglied
Alles klar, danke dir vielmals! :)
Dann ist das Rätsel ja gelöst ;)

Hätte Sun ja eigentlich gleich so implementieren können mit der preferredViewportSize..aber vielleicht gabs da dann auch öfter mit was anderem Komplikationen.

Ja, jetzt hat die Methode auch bei nem JScrollPane angezeigt..vorhin nicht..naja ist ja echt nicht die Ursache gewesen.

Grüße
 

Neue Beiträge