Java GridBagLayout macht mir Sorgen

F

Furtano

Gast
Hi,
ich möchte in Java AWT ein GridBagLayout haben (Bitte keine Posts wie benutz doch Swing oder nutze ein anderes Layout).

Wie es sein soll, und was raus kommt seht ihr hier:
http://www.abload.de/img/gbl_failgsknt.png

Warum ist der Vertikale Abstand bei farbauszugRot2 so groß?
Liegt es am Layout ?

PHP:
/**
		 * 
		 * GRIDBAGLAYOUT
		 * ab hier
		 */
	     GridBagLayout gbl = new GridBagLayout();
	     GridBagConstraints gbc;
	     this.setLayout(gbl);
	     // gridx, gridy, gridwidth, gridheight
	     gbc = makegbc(0, 0, 2, 2);
	     // was wenn groesse des fensters veraendert wird
	     gbc.fill = GridBagConstraints.BOTH;
	     gbc.anchor = GridBagConstraints.NORTH;
	     gbc.weightx = bild.getWidth(null)*2;
	     gbc.weighty = bild.getHeight(null)*2;
	     // Constraints dem Bild zuweisen
	     gbl.setConstraints(panelMainBildLinks, gbc);
	     this.add(panelMainBildLinks);

	     //--------- Roten Farbauszug hinzufuegen ---------
	     gbc = makegbc(2, 0, 1, 1);
	     gbc.fill = GridBagConstraints.BOTH;
	     gbc.anchor = GridBagConstraints.NORTH;
	     gbc.weightx = bild.getWidth(null);
	     gbc.weighty = bild.getHeight(null);
	     // Constraints dem Bild zuweisen
	     gbl.setConstraints(farbauszugRot, gbc);
	     this.add(farbauszugRot);
	     
	     //--------- Gruenen Farbauszug hinzufuegen ---------
	     gbc = makegbc(3, 0, 1, 1);
	     gbc.fill = GridBagConstraints.BOTH;
	     gbc.anchor = GridBagConstraints.NORTH;
	     gbc.weightx = bild.getWidth(null);
	     gbc.weighty = bild.getHeight(null);
	     // Constraints dem Bild zuweisen
	     gbl.setConstraints(farbauszugGruen, gbc);
	     this.add(farbauszugGruen);
	     
	     //--------- Blauen Farbauszug hinzufuegen ---------
	     gbc = makegbc(4, 0, 1, 1);
	     gbc.fill = GridBagConstraints.BOTH;
	     gbc.anchor = GridBagConstraints.NORTH;
	     gbc.weightx = bild.getWidth(null);
	     gbc.weighty = bild.getHeight(null);
	     // Constraints dem Bild zuweisen
	     gbl.setConstraints(farbauszugBlau, gbc);
	     this.add(farbauszugBlau);
	   //--------- Roten Farbauszug hinzufuegen ---------
	     gbc = makegbc(2, 1, 1, 1);
	     gbc.fill = GridBagConstraints.BOTH;
	     gbc.anchor = GridBagConstraints.NORTH;
	     gbc.weightx = bild.getWidth(null);
	     gbc.weighty = bild.getHeight(null);
	     // Constraints dem Bild zuweisen
	     gbl.setConstraints(farbauszugRot2, gbc);
	     this.add(farbauszugRot2);
 
Das einzige, was ich hier als möglicherweise fehlerhaft auf die schnelle sehe ist dein Anchor beim unteren Element, probier hier mal PAGE_END (sofern Java >= 1.4, ansonsten SOUTH)
 
Guten Morgen!

Ich habe selbst ein kurzes Beispiel geschrieben.
Nicht etwa, weil ich mich nicht mit deinem Code beschäftigen wollte, sondern viel mehr, weil es den Anschein hat, als wärest du noch nicht so oft mit dem GBL in Berühung gekommen. Jedenfalls kann man das sehr viel bequemer handhaben (was den Verbrauch an Zeilen angeht) als es bei dir der Fall war. Nicht böse gemeint ;)

Code:
public class Example {

	// ===================================================================
	// {[> Inner Classes
	// =================
	private class EPanel extends Panel {

		/* Attributes */
		private Color color;

		/* Initializers and Constructors */
		public EPanel(Color color, Dimension size) {
			this.color = color;
			setPreferredSize(size);
		}

		/* Methods */
		public void paint(Graphics g) {
			int width = getWidth();
			int height = getHeight();

			g.setColor(color);
			g.fillRect(0, 0, width, height);
			g.setColor(Color.BLACK);
			g.drawRect(0, 0, width - 1, height - 1);
		}
	}



	// ===================================================================
	// {[> Initializers and Constructors
	// =================================
	public Example() {
		Frame frame = new Frame();
		frame.addWindowListener(new WindowAdapter() {

			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		});

		// panels hinzufügen
		Panel pnlMain = new EPanel(Color.LIGHT_GRAY, new Dimension(400, 300));
		Panel pnlRed = new EPanel(Color.RED, new Dimension(200, 150));
		Panel pnlGreen = new EPanel(Color.GREEN, new Dimension(200, 150));
		Panel pnlBlue = new EPanel(Color.BLUE, new Dimension(200, 150));
		Panel pnlRed2 = new EPanel(Color.RED, new Dimension(200, 150));

		frame.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.fill = GridBagConstraints.BOTH;
		gbc.weightx = 1;
		gbc.weighty = 1;

		frame.add(pnlMain, gbc(gbc, 0, 0, 2, 2));
		frame.add(pnlRed, gbc(gbc, 2, 0, 1, 1));
		frame.add(pnlGreen, gbc(gbc, 3, 0, 1, 1));
		frame.add(pnlBlue, gbc(gbc, 4, 0, 1, 1));
		frame.add(pnlRed2, gbc(gbc, 2, 1, 1, 1));

		// frame sichtbar machen
		frame.pack();
		frame.setVisible(true);
	}



	// ===================================================================
	// {[> Private Static Methods
	// ==========================
	private static GridBagConstraints gbc(GridBagConstraints gbc, int x, int y, int width, int height) {
		gbc.gridx = x;
		gbc.gridy = y;
		gbc.gridwidth = width;
		gbc.gridheight = height;
		return gbc;
	}



	// ===================================================================
	// {[> Public Static Methods
	// =========================
	public static void main(String[] args) {
		new Example();
	}
}

Eventuell hilft dir das ja weiter. Falls nicht, einfach wieder melden!

Gruß,
Killkrog
 
@DasBoeseLebt
Das verschlimmert das ganze nur noch.

@Killkrog
An den Settings ist ja nichts anders, außer an den weights.
weightx und weighty habe ich mal wie du es gemacht hast auf 1 gesetzt, und es ändert leider auch nichts.
 
Wenn Du es mit GridBagLayout nicht hinbekommst, probier doch einfach eine Kombination von anderen Layout-Managern. Oder muss das Programm zwingend GridBagLayout verwenden?

Edit: Ah, ich sehe gerade, es soll in der Tat GridBagLayout sein. Warum?
 
Zuletzt bearbeitet:
Weil wen ich z.B. eine Kombination aus GridBagLayout und Flowlayout verwende die Bilder druch das FlowLayout einfach nach unten verschoben werden wenn der Platz nicht ausreicht.

Es soll aber vergrößert/verkleinert werden wenn der Platz nicht ausreicht.
 
Das sind ja nicht die einzigen Layout-Manager, die es gibt! Und warum AWT?
 
Die anderen Layoutmanager kommen nicht in Frage.
Es muss doch auch mit dem GridBagLayout gehen, es eignet sich doch eigentlich perfekt für die Aufgabe.
Und AWT ist eine Vorgabe!
 
Klar sollte es möglich sein, die Aufgabe mit GridBagLayout zu lösen. Aber wenn man damit nicht weiter kommt, ist es vielleicht hilfreich, andere Wege zu bestreiten. Vielleicht stellt man am Ende fest, dass es überhaupt nicht am Layout liegt. Und hätte sogar noch was gelernt. Wobei AWT nicht zu den zukunftsgerichteten Technologien gehört.
 
Dann schreib bitte mal ein Stückchen Code runter, was bei dir nicht funktioniert, aber eigenständig läuft... So wie jetzt kann man dir net helfen, weil man nicht selbst "dran herumschrauben" kann. Das war auch der Grund, weshalb ich selbstgeschriebenen Code vorhin posten musste...
 
Das Problem wurde vor einigen Wochen schon mal präsentiert. Auf meine explizite Bitte, ein lauffähiges Beispiel zu liefern, kam keine Reaktion...
 
Zurück
Oben