LayoutManager GridBag richtig nutzen - Komponenten richtig anordnen und automatisch vergrößern

w00t

Aktives Mitglied
Hallo,

ich habe ein kleines GridBagLayout Problem.
Allgemeine Beschreibung:
Im Screenshot kann man sehen wie es aktuell aussieht. Dieses Panel liegt auf einem JFrame, das über ein JSplitPane geteilt wird (das auf dem Screenshot ist die rechte Seite, was links ist, ist hierfür irrelevant).

Problembeschreibung:
Um die Beschreibung etwas einfacher zu machen, teile ich die Oberfläche mal in zwei Teile:
  1. Linke Seite: Statische Komponenten. Panel1
  2. Rechte Seite: Dynamische Komponenten. Panel2

Nun möchte ich folgendes. Panel1 und Panel2 sollen immer am oberen linken Rand sein. Fest.
Wenn man das Fenster nun größer zieht, soll der Abstand zwischen den Panels gleich bleiben. Es sollen sich aber folgende Felder wie folgt vergrößern:
Panel1:
TextField Titel
ComboBox Typ
Button Speichern
Diese drei sollen sich nach rechts vergrößern, wenn das Fenster größer gezogen wird.

TextArea
Dieses Soll sich so weit nach unten strecken, so das der Button Speichern Platz hat und so das nach unten der Abstand fest bleibt. Das TextArea soll auch nach rechts größer werden.

Panel2:
Hier soll sich das zweite TextField (was in dem Screenshot die URL enthält) nach rechts ausstrecken, wenn das Fenster vergrößert wird.

Panel1:
Java:
	private JTextField tfTitleValue = null;
	private JComboBox cbTypeValue = null;
	private DefaultComboBoxModel cbTypeValueModel = null;
	private JTextArea taContent = null;
	private JButton bSave = null;

	private void createComponents() {
		final GridBagConstraints gbc = new GridBagConstraints();

		this.cbTypeValueModel = new DefaultComboBoxModel();

		this.tfTitleValue = new JTextField("");
		this.cbTypeValue = new JComboBox(this.cbTypeValueModel);
		this.cbTypeValue.addItemListener(this.controller);
		this.taContent = new JTextArea();
		this.taContent.setTabSize(2);

		gbc.insets = new Insets(10, 0, 0, 0);

		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.gridwidth = 2;
		this.add(new JLabel("Ausgewähltes Element"), gbc);

		gbc.gridwidth = 1;
		gbc.gridx = 2;
		gbc.gridy = 2;
		gbc.ipadx = 75;
		this.add(new JLabel("Titel"), gbc);

		gbc.gridx = 3;
		gbc.ipadx = 2;
		this.add(this.tfTitleValue, gbc);

		gbc.gridx = 2;
		gbc.gridy = 3;
		gbc.ipadx = 75;
		this.add(new JLabel("Typ"), gbc);

		gbc.gridx = 3;
		gbc.ipadx = 2;
		this.add(this.cbTypeValue, gbc);

		JScrollPane spTaContent = new JScrollPane(this.taContent);
		gbc.gridx = 2;
		gbc.gridy = 4;
		gbc.gridwidth = 2;
		spTaContent.setPreferredSize(new Dimension(300, 150));
		this.add(spTaContent, gbc);

		gbc.gridx = 2;
		gbc.gridy = 5;
		gbc.gridheight = 1;
		gbc.gridwidth = 2;
		this.bSave = new JButton("Speichern");
		this.bSave.addActionListener(this.controller);
		this.add(this.bSave, gbc);

	}

Panel2:
Java:
	private JPanel pInformation = null;

	private void createComponents() {
		final GridBagConstraints gbc = new GridBagConstraints();
		gbc.gridwidth = 1;
		gbc.insets = new Insets(10, 0, 0, 0);

		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.gridx = 1;
		gbc.gridy = 1;
		gbc.gridwidth = 2;
		this.add(new JLabel(PropertiesReader.getInstance().getProperties("application.gui.tree.form.additionaltitle")), gbc);

		gbc.gridx = 1;
		gbc.gridy = 2;
		gbc.gridwidth = 1;
		this.pInformation = new JPanel(new GridBagLayout());
		this.add(this.pInformation, gbc);

Hier werden die beiden Komponenten auf ein JFrame geschmissen:
Java:
	private void addComponentsToView() {
		final JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
		final GridBagConstraints gbc = new GridBagConstraints();
		JPanel basePanel = new JPanel(new GridBagLayout());

		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.anchor = GridBagConstraints.NORTHWEST;
		basePanel.add(this.infoPanel, gbc);

		gbc.anchor = GridBagConstraints.NORTHEAST;
		gbc.insets = new Insets(0, 10, 0, 0);
		gbc.gridx = 1;
		basePanel.add(this.additionalInfoPanel, gbc);

		// create scroll panes
		JScrollPane treeViewScrollPane = new JScrollPane(this.tree);
		JScrollPane scrollPaneView = new JScrollPane(basePanel);

		// order split pane components
		splitPane.setLeftComponent(treeViewScrollPane);
		splitPane.setRightComponent(scrollPaneView);

		// set minimum size
		treeViewScrollPane.setMinimumSize(new Dimension(200, 50));
		scrollPaneView.setMinimumSize(new Dimension(355, 50));

		// set size and divider location
		splitPane.setDividerLocation(200);
		splitPane.setPreferredSize(new Dimension(900, 350));

		// add to view
		this.view.add(splitPane);
	}

Ihr könnt auch gerne schreiben wenn ihr allgemein was zu dem Code zu sagen habt. Also wie man das allgemein besser machen könnte.


______________
Crosspost @ tutorials.de
 

Anhänge

  • fg_examplepic.JPG
    fg_examplepic.JPG
    15,9 KB · Aufrufe: 49
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Hallo.
Ich will dir dein Problem nicht direkt lösen (zu faul ;) ), kann dir aber sagen, was die entsprechenden Attribute beim GridBagLayout (GBL) sind.

Zunächste einmal verwende ich oft Hilfsmethoden zum erstellen der Contraints, dann hat man beim Layouting etwas mehr Übersicht, welche Koordinaten für welche Komponente sind:
Java:
private GridBagContraints gbc(int x, int y, int w, int h /*...und die weiteren params für den konstruktor*/) {
    return new GridBagConstraints(x, y, w, h, ...);
}

...

myContainer.setLayout(new GridBagLayout());
myContainer.add( labelHello, 
        gbc(0, 0, 1, 1, 1.0f, 0.0f, ...));

So. Zu den Contraints. Wichtig für das Vergrößern und Verkleinern sind weightx und weighty sowie fill:
Code:
gridx
= x-Position im Raster (Spalte)
Code:
gridy
= y-Position im Raster (Zeile)
Code:
gridwidth
= Anzahl der Spalten für die Komp. (>= 1)
Code:
gridheight
= Anzahl der Zeilen für die Komp. (>= 1)
Code:
weightx
= Vergrößerungsfaktor in x-Richtung (Horizontale), 0.0 heißt gar nicht "wachsen", 1.0 heißt dass die Komp. den ganzen freien Platz einnimmt. Ferner sollten innerhalb einer Zeile die Summen aller weightx nicht mehr als 1 ergeben, darüber kann man dann steuern, dass nebeneinanderliegende Komponenten sich den freien Platz entsprechend teilen
Code:
weighty
= analog zu weightx, nur eben für die Vertikale
Code:
anchor
= Platzierung der Komponente innerhalb ihrer Zelle, meist reicht BASELINE_LEADING aus, dann ist es linksbündig
Code:
fill
= Vergrößerungsverhalten innerhalb der Zelle. HORIZONTAL sagt, dass die Komp. die vollen horizontale Breite einnehmen soll, analog VERTICAL und eben BOTH für komplettes Ausfüllen und NONE für kein Wachstum.
Code:
insets
= (verwende ich nie, sie API :) )
Code:
ipadx
= (dito)
Code:
ipady
= (dito)

Also für das Vergrößerungsverhalten solltest du dir vor allem die weight's und das fill anschauen. Als Beispiel etwas Code, der zwei Labels mit zugehörigen Textfeldern anordnet, wobei beim Vergrößern die Textfelder 80% des Platzes nehmen:

Java:
int base   = GridBagConstraints.BASELINE_LEADING;
int hori   = GridBagConstraints.HORIZONTAL;
Insets ins = new Insets(0, 0, 0, 0);

JPanel pnl = new JPanel(new GridBagLayout());
pnl.add(new JLabel("Vorname"),
    gbc(0, 0, 1, 1, 0.2d, 0.0d, base, ins, 0, 0));
pnl.add(new JTextField("Max"),
    gbc(1, 0, 1, 1, 0.8d, 0.0d, base, ins, 0, 0));
pnl.add(new JLabel("Nachname"),
    gbc(0, 1, 1, 1, 0.2d, 0.0d, base, ins, 0, 0));
pnl.add(new JTextField("Muster"),
    gbc(1, 1, 1, 1, 0.8d, 0.0d, base, ins, 0, 0));
 

w00t

Aktives Mitglied
Ich danke euch schon einmal, werde das mal testen und dann eine Rückmeldung geben :) Da habe ich den ein oder anderen Parameter doch tatsächlich etwas falsch interpretiert.

Und danke für den Tipp mit den Methoden zum GBC oder hinzufügen, darauf hätte ich auch selber kommen können.
 

w00t

Aktives Mitglied
Ich danke euch vielmals. Das hat mir sehr viel geholfen. Habe es nun hinbekommen. "Anchor" und "weightx" bzw "weighty" haben mir sehr weiter geholfen.
byte-welt.net war auch ein sehr guter Tipp :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F GridBag Layout AWT, Swing, JavaFX & SWT 1
D LayoutManager GridBag | weight nachträglich ändern AWT, Swing, JavaFX & SWT 3
C Swing GridBag-Probleme (Größe und Ausrichtung) AWT, Swing, JavaFX & SWT 3
H LayoutManager Gridbag Constraint AWT, Swing, JavaFX & SWT 2
A Nochmals Problem mit GridBag AWT, Swing, JavaFX & SWT 5
A GridBag-Layout AWT, Swing, JavaFX & SWT 2
W Elemente aus JPanel bzw. GridBag löschen und ersetzen AWT, Swing, JavaFX & SWT 18
D (GridBag)Layoutproblem - Komponentenbreite AWT, Swing, JavaFX & SWT 2
O GridBag IN BorderLayout? AWT, Swing, JavaFX & SWT 5
R JTextField im GridBag ändert seine Größe nicht AWT, Swing, JavaFX & SWT 11
R Ausrichtung am oberen Rand beim Gridbag-Layout AWT, Swing, JavaFX & SWT 2
U ein nettes gridbag layout AWT, Swing, JavaFX & SWT 3
A Gridbag Mensch gesucht! AWT, Swing, JavaFX & SWT 2
A GridBag-Layout AWT, Swing, JavaFX & SWT 2
B gridbag-layout mit swing AWT, Swing, JavaFX & SWT 37
E Problem mit GridBag Layout AWT, Swing, JavaFX & SWT 2
Juelin if Abfrage funktioniert nicht richtig AWT, Swing, JavaFX & SWT 10
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
G Button auswerten und ausgeben ob richtig oder falsch AWT, Swing, JavaFX & SWT 1
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
MouseEvent richtig initialisieren AWT, Swing, JavaFX & SWT 1
T ScrollEvent richtig(er) abfangen? AWT, Swing, JavaFX & SWT 0
B Output GUI funktioniert nur beim ersten Mal richtig. AWT, Swing, JavaFX & SWT 4
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S Swing Coding richtig einfügen AWT, Swing, JavaFX & SWT 3
F Swing Adapt Row Height funktioniert nicht richtig :( AWT, Swing, JavaFX & SWT 7
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
C Polygon Koordinaten richtig sortieren AWT, Swing, JavaFX & SWT 7
E Komponenten von JScrollPane werden nicht richtig ermittelt AWT, Swing, JavaFX & SWT 2
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
J Parallele Aktionen in Java FX richtig durchführen. AWT, Swing, JavaFX & SWT 5
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
D JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 1
Joker4632 JavaFX GridPane richtig implementieren AWT, Swing, JavaFX & SWT 7
K Swing GUI aktualisiert nicht richtig AWT, Swing, JavaFX & SWT 5
X JavaFX AreaChart area höhe wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 2
A Swing Zeichnung wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 4
I Neues JFrame wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 5
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
D Swing Warum erhalte ich keine Ausgabe? Funktioniert der equals-vergleich in actionPeformed nicht richtig? AWT, Swing, JavaFX & SWT 3
V JFrame wird nicht richtig angezeigt! AWT, Swing, JavaFX & SWT 2
H UpdatePolicy wird nicht richtig gesetzt / funktioniert nicht AWT, Swing, JavaFX & SWT 5
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
M JavaFX TextArea richtig formatieren AWT, Swing, JavaFX & SWT 4
A SWT Wie legt man ein UI vom Programmcode her richtig an? AWT, Swing, JavaFX & SWT 3
C KeyPressed funktioniert auf iOS nicht richtig? AWT, Swing, JavaFX & SWT 4
M "ImageIO.read()" liest Bild nicht richtig ein AWT, Swing, JavaFX & SWT 3
A Swing Frames richtig erstellen AWT, Swing, JavaFX & SWT 3
W SWT Dialog richtig schließen? AWT, Swing, JavaFX & SWT 0
F AWT Grafik wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 2
B mouseOnEntered ( Controller richtig implementieren) AWT, Swing, JavaFX & SWT 4
M Repaint mittels Button richtig aufrufen klappt nicht AWT, Swing, JavaFX & SWT 1
K Initialisierung von Oberfläche Richtig? AWT, Swing, JavaFX & SWT 5
TheSorm Swing JScroolBar richtig benutzen AWT, Swing, JavaFX & SWT 0
D Panel in Panel zentriert nicht richtig AWT, Swing, JavaFX & SWT 3
K Swing JList - Element richtig hinzufügen AWT, Swing, JavaFX & SWT 4
D Swing fullscreen switch geht nicht richtig AWT, Swing, JavaFX & SWT 8
F Swing Wie verwalte ich meine Panels richtig? AWT, Swing, JavaFX & SWT 2
X LayoutManager gridBagLayout wird nicht richtig Dargestellt AWT, Swing, JavaFX & SWT 5
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
M BorderLayout JPanel liegt nicht richtig an AWT, Swing, JavaFX & SWT 12
J Swing Window-Builder-Projekt richtig übertragen AWT, Swing, JavaFX & SWT 2
M AWT Java-Taschenrechner, wie Stack richtig verwenden? AWT, Swing, JavaFX & SWT 14
B Navigation funkt nicht richtig AWT, Swing, JavaFX & SWT 3
propra Doppelklick von Einzelklick unterscheiden, aber richtig ... AWT, Swing, JavaFX & SWT 10
S Applet funktioniert nach Browserreload nicht richtig AWT, Swing, JavaFX & SWT 2
T SWINGX richtig nutzen AWT, Swing, JavaFX & SWT 7
1 CellEditor mit ComboBox richtig beenden AWT, Swing, JavaFX & SWT 4
F SWT Button listener richtig erstellen AWT, Swing, JavaFX & SWT 2
S Swing Spiel Richtig/Falsch implementieren AWT, Swing, JavaFX & SWT 5
J repaint() nicht richtig? AWT, Swing, JavaFX & SWT 6
J Swing Wie Fokus richtig setzen? AWT, Swing, JavaFX & SWT 7
S Swing JTree Node Text nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
N Textfelder werden nicht richtig angezeigt AWT, Swing, JavaFX & SWT 2
A Welcher Layout Manager ist hier richtig? AWT, Swing, JavaFX & SWT 3
A Komponente zur Laufzeit hinzufügen und RICHTIG anzeigen AWT, Swing, JavaFX & SWT 3
Semox Swing Klausur: Swing Fenster nicht richtig dimensioniert AWT, Swing, JavaFX & SWT 2
T JTable mit Renderer sortiert die gerenderte Spalte nicht richtig AWT, Swing, JavaFX & SWT 2
I Wie schließ ich ein Fenster RICHTIG! ? AWT, Swing, JavaFX & SWT 19
-MacNuke- Swing JTextField Eventverarbeitung so richtig? AWT, Swing, JavaFX & SWT 4
S AWT Schiffeversenken-Koordinatensystem wird nicht richtig angezeigt. AWT, Swing, JavaFX & SWT 6
K Eclipse Visual Editor rendert die Komponenten nicht richtig AWT, Swing, JavaFX & SWT 2
A Paint funktioniert nicht richtig AWT, Swing, JavaFX & SWT 7
S Jar-Datei funktioniert nicht richtig AWT, Swing, JavaFX & SWT 3
C ScrollPaneView richtig setzen AWT, Swing, JavaFX & SWT 2
R MVC: System.out.prinln in View umleiten geht nicht richtig AWT, Swing, JavaFX & SWT 7
H JFileChooser richtig verwenden AWT, Swing, JavaFX & SWT 3
M Buttonicon läds nicht richtig? AWT, Swing, JavaFX & SWT 4
R GUI wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 5
I Applet mit Panels (so richtig, gehts besser?) AWT, Swing, JavaFX & SWT 3
Luma Wie Stringparameter von AWTEvent richtig annalysieren AWT, Swing, JavaFX & SWT 4
K Layout - Components richtig setzen AWT, Swing, JavaFX & SWT 9
G Composite - Rand wird nicht richtig dargestellt AWT, Swing, JavaFX & SWT 3
G flow layout zeigt die komponenten nicht richtig an AWT, Swing, JavaFX & SWT 5
G ActionEvent richtig anbringen AWT, Swing, JavaFX & SWT 7
M Mehrere Frames - hab ich das richtig verstanden AWT, Swing, JavaFX & SWT 4
D jTable ausdrucken => € zeichen wird nicht richtig angezei AWT, Swing, JavaFX & SWT 7
S JDesktopPane wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben