Java LayoutManager Aufgabenstellung?

1 Antwort

Du kannst ein GridBagLayout verwenden.

Das Prinzip ist dabei Folgendes: Für jede Zelle wird ein GridBagConstraint definiert, welches Gewichtung, Innenabstand, etc. festlegt. Für den gesamten Prozess kannst du ein Objekt dieses Typs hin und herreichen.

JPanel grid = new JPanel(new GridBagLayout());
GridBagConstraints constraints = new GridBagConstraints();
constraints.ipadx = 10;
constraints.ipady = 10;

constraints.gridx = 0;
constraints.gridy = 0;
JLabel lblDate = new JLabel("Datum:");
lblDate.setFont(new Font("Arial", Font.BOLD, 15));
grid.add(lblDate, constraints);

constraints.gridx = 1;
JTextField txtDate = new JTextField();
grid.add(txtDate, constraints);

constraints.gridx = 0;
constraints.gridy = 1;
JLabel lblDestination = new JLabel("Reiseziel:");
lblDestination.setFont(new Font("Arial", Font.BOLD, 15));
grid.add(lblDestination, constraints);

// etc. ...

In diesem Beispiel siehst du, dass ich zuerst einen Innenabstand definiere (ipadx / ipady). Das mache ich am Anfang, da er für alle Zellen gelten soll.

Im Anschluss wird jede Komponente nach und nach dem Layout zugefügt (es handelt sich um ein dynamisches Grid, die Anzahl an Spalten/Zeilen entscheidet sich daran, wie viele Komponenten du ihm zufügst). Um die Position im Layout vorzugeben, werden lediglich die Werte von gridx und gridy verändert.

Auf dieser Seite findest du weitere Informationen zum Layout selbst sowie verschiedene Eigenschaften von GridBagConstraints, die du ebenso noch nutzen kannst.


Cedi100234 
Fragesteller
 18.03.2022, 19:07

Ich danke dir für deine Bemühungen, jedoch muss ich das BorderLayout, FlowLayout anwenden um das ganze zu lösen. Ich glaube das müsste entweder mit einem Zeilenumbruch funktionieren, was jedoch bislang nicht funktioniert hat, habe außerdem auch versuch eine neue Dimension zu machen, welche genau so breit wie das Panel ist, sodass die anderen Label in die nächste Zeile automatisch rutschen, hat jedoch leider auch nicht funktioniert.

0
regex9  18.03.2022, 19:27
@Cedi100234

Wurde euch diese Vorgabe mündlich gemacht? Im Text steht ja nichts dazu und ehrlich gesagt ist das FlowLayout dafür nun nicht die allerbeste Wahl.

Du könntest dem center-Panel einen Border verpassen, um den äußeren horizontalen Abstand zu setzen:

int margin = getSize().width / 100 * 20;
center.setBorder(BorderFactory.createEmptyBorder(0, margin, 0, margin));

Jede Zeile wiederum (Label + Textfeld) wandert in ein eigenes Panel, welches die übrige Frame-Breite bekommt.

int rowWidth = (getSize().width - 2 * margin);

Diese Art Layoutberechnung ist allerdings nicht sonderlich schön.

1
Cedi100234 
Fragesteller
 18.03.2022, 19:37
@regex9

Ja sie wurde mündlich gemacht, ich danke dir.

0