GridBagLayout - was fehlt?

NoWitzness

Mitglied
Hallo nochmal!

Also ich spiele seit paar Tagen ein wenig mit dem GridBagLayout herum und frage mich wie diese weightx,y werte zu verstehen sind. Man kann Sie als Prozentuale Angabe sehen, soviel hab ich schon verstanden.
Auch müssen bzw sollten alle weightx und y Angaben in einer Zeile oder Spalte immer 100 ergeben.
Aber trotzdem wills nicht in mein Kopf wie das funktionieren soll .. Ich durchforste ein Forum nach dem anderen und versuch das zu verstehen, tus aber nicht 😳

.. folgendes ( ohne den schwarzen Bereich, rechts) hätte ich gerne...
attachment.php


Folgendes hab ich bis jetzt geschafft ...
attachment.php

Verständnissfrage: Dieses Gitter, das ich mir beim GridB.L. denke, muss das in meinem Fall das Bild links oben in einer Zelle sein oder darf/soll es sogar über mehrere Spalten und Zeilen gehn?
Wieso ist dann Test2, das Rote Kastl nicht direkt an dem "Bild" dran?
Das "Bild" beginnt bei
Java:
gbc.gridx = 0;
und geht bis
Java:
gbc.gridwidth = 2;
und das Rote TextFeld beginnt auch bei
Java:
gbc.gridx = 2;
warum dann der Abstand Zwischen Grau und Rot??

Mein Code ist wahrscheinlich ziemlich dumm geschrieben aber als Anfänger (zumindest für mich) nicht anderst machbar :noe:
Java:
package startPackage;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class GridBagLayoutFrame extends JFrame{

	private JPanel contentPane;
	private JButton test1 = new JButton();
	private JButton test6, test7;
	private JLabel test2;
	private JLabel test3;
	private JTextField test4;
	private JLabel test5;



	public GridBagLayoutFrame(){

		super("GridBagLayoutFrame");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		contentPane = new JPanel(new GridBagLayout());
		contentPane.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));

		test1 = new JButton("Bild");
		test1.setPreferredSize(new Dimension(180, 150));
		test1.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test1.setBackground(Color.LIGHT_GRAY);
		test1.setOpaque(true);

		test2 = new JLabel("Grösseres TextFeld mit viiiiiiiiiiiel Text");
		test2.setPreferredSize(new Dimension(250, 100));
		test2.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test2.setBackground(Color.RED);
		test2.setOpaque(true);

		test3 = new JLabel("Test");
		test3.setPreferredSize(new Dimension(50, 50));
		test3.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test3.setBackground(Color.GREEN);
		test3.setOpaque(true);

		test4 = new JTextField("Test4");
		test4.setPreferredSize(new Dimension(50, 25));
		test4.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test4.setBackground(Color.YELLOW);
		test4.setOpaque(true);

		test5 = new JLabel("Test5");
		test5.setPreferredSize(new Dimension(200, 25));
		test5.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test5.setBackground(Color.MAGENTA);
		test5.setOpaque(true);

		test6 = new JButton("Button 1");
		test6.setPreferredSize(new Dimension(100, 25));
		test6.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test6.setBackground(Color.ORANGE);
		test6.setOpaque(true);

		test7 = new JButton("Button 2");
		test7.setPreferredSize(new Dimension(100, 25));
		test7.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		test7.setBackground(Color.ORANGE);
		test7.setOpaque(true);

		JFrame jframe = new JFrame("GridBagLayoutTest");

		GridBagConstraints gbc;
			
			gbc = new GridBagConstraints();
			gbc.gridx = 0;
			gbc.gridy = 0;
			gbc.gridwidth = 2;
			gbc.gridheight = 2;
//			gbc.weightx = 0.5;
//			gbc.weighty = 0.5;
			contentPane.add(test1, gbc);
			
				gbc = new GridBagConstraints();
				gbc.gridx = 2;
				gbc.gridy = 0;
				gbc.gridwidth = 4;
				gbc.gridheight = 2;
				contentPane.add(test2, gbc);
			
					gbc = new GridBagConstraints();
					gbc.gridx = 6;
					gbc.gridy = 0;
					gbc.gridwidth = 1;
					gbc.gridheight = 1;
					contentPane.add(test3, gbc);
			
						gbc = new GridBagConstraints();
						gbc.gridx = 0;
						gbc.gridy = 5;
						gbc.gridwidth = 1;
						gbc.gridheight = 1;
						contentPane.add(test4, gbc);
			
							gbc = new GridBagConstraints();
							gbc.gridx = 1;
							gbc.gridy = 5;
							gbc.gridwidth = 4;
							gbc.gridheight = 1;
							contentPane.add(test5, gbc);
			
								gbc = new GridBagConstraints();
								gbc.gridx = 5;
								gbc.gridy = 5;
								gbc.gridwidth = 2;
								gbc.gridheight = 1;
								gbc.insets = new Insets(2, 0, 2, 2);
								contentPane.add(test6, gbc);
								
										gbc = new GridBagConstraints();
										gbc.gridx = 5;
										gbc.gridy = 4;
										gbc.gridwidth = 2;
										gbc.gridheight = 1;
										gbc.insets = new Insets(0, 0, 2, 2);
										contentPane.add(test7, gbc);
	
		jframe.add(contentPane);
		jframe.setSize(new Dimension(400, 250));
		jframe.pack();
		jframe.setAlwaysOnTop(true);
		jframe.setVisible(true);
	}
}

Vielleicht will sich ja jemand die Zeit nehmen und versuchen, mir zu erklären, worans scheitert?? 🙂
thx
 

Anhänge

  • istzustand.jpg
    istzustand.jpg
    34,3 KB · Aufrufe: 60
  • gewünscht.jpg
    gewünscht.jpg
    33,1 KB · Aufrufe: 59
Oder auch gefragt: Was entscheidet, wie gross das Raster ist, in das ich das Bild bzw. das graue Feld einfüge??

Wo ist der Unterschied ob ich das Raster mit kleinen Werten versehe
Java:
 gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.gridheight = 2;
//          gbc.weightx = 0.5;
//          gbc.weighty = 0.5;
            contentPane.add(test1, gbc);
oder mit sehr grossen ....
Java:
 gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.gridwidth = 150;
            gbc.gridheight = 150;
//          gbc.weightx = 0.5;
//          gbc.weighty = 0.5;
            contentPane.add(test1, gbc);

das Raster wird dadurch mehr oder weniger höher auflösender, aber wo ist der Vorteil oder Nachteil? Funktioniert das überhaupt? Machts vielleicht keinen Sinn??:rtfm:

Sorry für die vielen Fragen!
 
Ließ dir vllt. mal die Oracle Dokumentation dazu durch hier

An deiner Stelle würde ich damit anfangen, insgesamt anständig und für jede Komponente einheitlich die Zeilen und Spaltenanzahl zu definieren und nicht für jede neu

Bsp.: Für die Höhe gibst du mal bei allen "gridheight = 10" an und für die Breite "gridwidth = 16" und dann probierst du die Komponenten alle anständig auszurichten an diesem Raster

Gruß eMmiE
 
Ließ dir vllt. mal die Oracle Dokumentation dazu durch hier

An deiner Stelle würde ich damit anfangen, insgesamt anständig und für jede Komponente einheitlich die Zeilen und Spaltenanzahl zu definieren und nicht für jede neu

Bsp.: Für die Höhe gibst du mal bei allen "gridheight = 10" an und für die Breite "gridwidth = 16" und dann probierst du die Komponenten alle anständig auszurichten an diesem Raster

Gruß eMmiE

Danke, aber glaube mir, ich hab mir das schon einige male durchgelesen. Leider ist das teilweise in sehr technischem englisch geschrieben wo ich teilweise nicht ganz folgen kann und mir deshalb wahrscheinlich wichtige details fehlen.

Wie meinst du "einheitlich die Zeilen und Spaltenanzahl zu definieren und nicht für jede neu"?? Klingt als ob ich einiges an Code sparen könnte?!

Aber die Frage was entscheidend für die Gridgrösse ist wird mir einfach nicht klar.
Mit der Bitte um Hilfe und weniger verweise auf andere Seiten ;(
 
Das Zauberwort heißt
Java:
anchor
Hiermit kannst du bestimmen wo ein Element in seiner Zelle dargestellt wird

Code:
First Line Start     Page Start       First Line End

Line Start                Center          Line End

Last Line Start     Page End         Last Line End

Dabei gilt es zu beachten das das Grid sich immer am größten ihm hinzugefügten Element orientiert.
 
Zuletzt bearbeitet:
Hallo,

probiere doch mal das Design mit TOnionLayout zu bauen.
Kann hier runtergeladen werden:
https://java.net/projects/tonion/downloads

Es besteht aus zwei LayoutManagern die eineinander geschachtelt werden können:
TrainLayout = Reihe von links nach rechts
TotemLayout = Spalte von oben nach unten

Man gibt beim Inhalt die Minimum und Maximum Größen an.
JButton's werden in ein JPanel mit FlowLayout gehüllt, dann die Größen beim JPanel angeben.

Das ganze Layout kann auch in eine JScrollPane gepackt werden.
Codebeispiele finden sich in einem anderen Beitrag, einfach nach "TOnion" suchen.

Hoffe das hilft.
 
Das Zauberwort heißt
Java:
anchor
Hiermit kannst du bestimmen wo ein Element in seiner Zelle dargestellt wird

Code:
First Line Start     Page Start       First Line End

Line Start                Center          Line End

Last Line Start     Page End         Last Line End

Dabei gilt es zu beachten das das Grid sich immer am größten ihm hinzugefügten Element orientiert.

Danke!! Der Anchor wars. Was mich generell dazu bewegt hat mich 3 Tage intensiv mit dem GridBagLayout zu befassen 😉
Jetzt klappts so wies soll!
 

Zurück
Oben