Anpassung von JKomponentengrößen (Swing)

ExceptionOfExpectation

Bekanntes Mitglied
Hallo, eine allgemeine Frage über Swing-Applikation.
Zum Beispiel ich habe zwei Komponenten JEditorPane für die Ausgabe mit Center und JTextfField mit South. Als einen Layout beim JPanel wird BorderLayout verwendet.
Nun kommt das Problem mit dem Größenanpassung: bei so einem flachen JTextField, kann der Benutzer keinen Text eingeben, ohne dabei in den mikrodimensionalen Raum spurlos zu verschwinden. Um den Benutzer vor solchen Gefahren zu schützen, eine Möglichkeit das Design anzupassen, wäre meine Meinung nach gut angebracht. Aus dem Grund habe ich verschiedene Möglichkeiten probiert, genau genommen eine: GridBagConstraints, leider ist dies im Netz schlecht beschrieben. Da es die einzige Möglichkeit ist die Größen anzupassen, wäre ich für eine bessere Erklärung offen.
Ich selbst habe mir überlegt, andere Layouts zu verwenden, aber dann habe ich mich erinnert, dass es nur bei JavaFX Sinn macht, einzelne Layouts in einander zu schachteln.
Bitte nicht den WindowBuilder vorschlagen, da es sich um einen Swing-Dschungel handelt.
 
Gridbaglayout versagt, wenn das Fenster zu klein wird. Wenn die Komponenten z.B. in Y nicht mehr Platz finden, dann kürzt er auch in X. Ansonsten kann man damit aber grundsätzlich alles machen. Die anderen Manager sind allesamt etwas spezialisierter, dafür je nach Anwendungszweck einfacher zu bedienen.
Und ja, alles in einen großen Topf klappt selten. Meistens ist es am Besten, das Fenster in Bereiche einzuteilen mit ihrem jeweils eigenen Manager.

Das einzige, womit ich beim GBC nicht gut arbeiten kann, sind die Paddings, die verhalten sich für mich nicht nachvollziehbar. Der Rest ist eigentlich nicht so schwer. Und wo es angebracht ist, werden natürlich Subkomponenten z.B. mit Flowlayout verwendet.
Dein Fenster wird in variable Spalten (und Zeilen) aufgeteilt. Per Constraints sagst du dem Manager, wo (links oben) deine Komponente einnimmt, wie viele Zellen sie in welcher Richtung einnimmt und wie ihre Gewichtung bei Größenänderung ist.
Finden sich mehrere Komponenten, die den selben Bereich in X einnehmen, wird von allen Auswahlmöglichkeiten das höchste Gewicht verwendet.

Wenn du z.B. mit konstanten Mindestspaltenbreiten arbeitests, musst du nicht allen Komponenten extra sagen, wie groß sie sein sollen
WIllst du z.B. dass die erste Spalte 12, die zweite 200 Pixel breit ist (für die Labels, Spalte 3 hat dann das Eingabefeld), kannst du columnwidths auf {12,200} setzen.
Die dritte Spalte nimmt aller Wahrscheinlichkeit nach die komplette Breite ein, also sind columnweights {0,0,1}
Willst du z.B, dass die 4. Spalte dann wieder ein Abstand von 14 rechts verursacht, setz columnWidths auf {14,200,0,14}
Die dritte Spalte hat keine Mindestbreite, sie nimmt laut Gewichtung ja eh die gesamte Breite ein.

Ich arbeite mit Matisse aus Netbeans, den gibt's auch für Eclipse, wurde dort allerdings durch den eigenen Builder ersetzt. Einige einfache Sachen werden aber auch ohne Editor programmiert. Wenn ein Layout wie oben beschrieben ausschaut, anstatt eines einzelnen Eingabefelds aber mehrere Komponenten stehen, dann wird dort ein Panel mit diesen Komponenten verwendet, anstatt alle einzeln in das Formular einzubetten. So hat man "den" Eingabebereich, der sich nach außen so verhält wie die anderen.

Falls du primitive Layouts im Windows-Standard erstellen willst, verwende das GroupLayout. Ich hab das Gefühl, das wurde für Umsteiger entwickelt, die Bedienung ist nämlich genauso zum Kotzen wie in anderen Sprachen wie C#, denen es nachempfungen ist.
 
ps: Alle deine Komponenten können Mindestgrößen haben, in jedem Layout. Dein Textfeld wird ohne Text nicht verschwinden, wenn du ihm eine Mindestgröße zuweist (sofern der Layoutmanager nicht an seine Grenzen stößt, was bei einem Borderlayout aber schwer sein dürfte).
 

Neue Themen


Zurück
Oben