# Ausrichtung im JPanel



## Camino (7. Okt 2008)

Hallo,

ich habe in einer Anwendung ein JPanel mit einem GridBagLayout versehen, um ein Formular darzustellen. Wenn ich nun die einzelnen Elemente hinzufüge, dann wird mir das ganze Formular in diesem JPanel zentriert angezeigt, sowohl horizontal als auch vertikal. Wie kann ich die das ganze Formular in dem JPanel so ausrichten, dass es ganz oben und links beginnt? Hab irgendwie nichts gefunden. Das JPanel selbst liegt in dem CENTER-Bereich eines anderen JPanels mit BorderLayout. Liegt es vielleicht daran und ich muss noch einen anderen LayoutManager "zwischenschalten".

Danke
Camino


----------



## geraldf (7. Okt 2008)

Vielleicht hilft dir
www.java-forum.org/de/topic75649_komponenten-fest-verankern.html

Beste Grüße
Gerald


----------



## L-ectron-X (7. Okt 2008)

Camino hat gesagt.:
			
		

> Wie kann ich die das ganze Formular in dem JPanel so ausrichten, dass es ganz oben und links beginnt?


Mit
	
	
	
	





```
constraints.anchor = GridBagConstraints.NORTHWEST;
```

oder
	
	
	
	





```
constraints.anchor = GridBagConstraints.FIRST_LINE_START
```

Falls das nicht reicht, fehlt noch die Gewichtung (weightx/weighty).


----------



## Camino (7. Okt 2008)

geraldf hat gesagt.:
			
		

> Vielleicht hilft dir
> www.java-forum.org/de/topic75649_komponenten-fest-verankern.html
> 
> Beste Grüße
> Gerald



Das mit den GridBagConstraints war wohl der richtige Tipp. Hab es auch nach der Anleitung im genannten Posting geschafft, das Formular vertikal nach NORTH auszurichten. Nur mit der Ausrichtung an den linken Rand, also horizontal, klappt es noch nicht so ganz. Muss mich wohl noch näher mit anchor und weightx/weighty befassen. Danke jedenfalls mal für diese Anregung...

Camino


----------



## Camino (7. Okt 2008)

L-ectron-X hat gesagt.:
			
		

> Mit
> 
> 
> 
> ...



Muss die Angabe für anchor (=NORTHWEST) für jedes Element im Formular angegeben werden?


----------



## geraldf (7. Okt 2008)

Durch Zuweisungen an weightx/weighty ergeben sich Zeilen und Spalten mit einzelnen Zellen (vgl. Excel). Innerhalb dieser Zellen kannst du mit anchor die Ausrichtung NACH BEDARF festlegen.

Beste Grüße
Gerald


----------



## Camino (7. Okt 2008)

geraldf hat gesagt.:
			
		

> Durch Zuweisungen an weightx/weighty ergeben sich Zeilen und Spalten mit einzelnen Zellen (vgl. Excel). Innerhalb dieser Zellen kannst du mit anchor die Ausrichtung NACH BEDARF festlegen.
> 
> Beste Grüße
> Gerald



Ich versteh das mit weightx/weighty zwar immer noch nicht so ganz, aber durch Ausprobieren mit verschiedenen Werten hab ich jetzt wenigstens ein Ergebnis hingekriegt, wie ich es haben wollte. Ich hab eigentlich ein Formular mit 2 Spalten: 1. Spalte stehen die Labels und in der 2. Spalte die Textfelder. Die 1. Spalte hatte ich mit anchor= NORTHWEST linksbündig gekriegt. Musste ich aber für jedes Label angeben. Die 2. Spalte war dann aber rechtsbündig. Ich hab einfach den Wert von weightx des letzten Elements der 2. Spalte so lange erhöht (bis 20.0), bis auch die 2. Spalte an die 1. Spalte aufgeschlossen hatte. Ich dachte, die Zellen werden beim GridBagLayout mit gridx und gridy festgelegt. Was bedeutet dann die Zuweisung an weightx/weighty? Ich kapier den Vergleich mit Excel nicht so ganz.


----------



## L-ectron-X (7. Okt 2008)

Camino hat gesagt.:
			
		

> Muss die Angabe für anchor (=NORTHWEST) für jedes Element im Formular angegeben werden?


Naja, es kommt darauf an, ob du immer das gleiche GridBagConstraints-Objekt zur Ausrichtung nutzt, oder immer wieder ein neues Objekt erzeugst. Es ist ja beides möglich.

Wenn du immer mit dem gleichen Objekt arbeitest, erhalten alle nachfolgenden GUI-Komponenten die gleichen Constraints, bis die Werte geändert/zurückgesetzt werden. Also brauchst du u.U. nichts als die gridx/gridy-Werte ändern bis "Bedarf" besteht, um mal geraldf's Worte zu benutzen.


----------



## Camino (7. Okt 2008)

L-ectron-X hat gesagt.:
			
		

> Naja, es kommt darauf an, ob du immer das gleiche GridBagConstraints-Objekt zur Ausrichtung nutzt, oder immer wieder ein neues Objekt erzeugst. Es ist ja beides möglich.



Ich hab mir eine Methode geschrieben (addComponent) die für jedes Element ein neues GridBagConstraints-Objekt erstellt und dem Container zufügt. Der Methode übergebe ich alle Werte für die GridBagConstraints.


----------



## L-ectron-X (7. Okt 2008)

Camino hat gesagt.:
			
		

> Was bedeutet dann die Zuweisung an weightx/weighty?


weightx und weighty legen fest, in welchem Maße sich Komponeten gegenüber anderen Komponenten im Layout ausdehnen dürfen. Je höher der Wert, um so mehr werden sie bei der Platzvergabe berücksichtigt.
Um Zellen voll auszudehnen benutzt man _fill_...


----------



## L-ectron-X (7. Okt 2008)

Camino hat gesagt.:
			
		

> Ich hab mir eine Methode geschrieben (addComponent) die für jedes Element ein neues GridBagConstraints-Objekt erstellt und dem Container zufügt. Der Methode übergebe ich alle Werte für die GridBagConstraints.



In diesem Fall musst du für jede Komponente deine gewünschten Constraints angeben, sonst werden sie mit ihren Defaultwerten ins Layout eingebaut.

Notfalls postest du mal Code, dann kann man sich das mal angucken.


----------



## Camino (7. Okt 2008)

OK, vielen Dank für eure Hilfe. Hat mich ein grosses Stück weitergebracht. Bisher hatte ich viel mit dem BoxLayout herumexperimentiert. Aber so langsam werde ich wohl ein Fan vom GridBagLayout.

Camino


----------



## Camino (7. Okt 2008)

L-ectron-X hat gesagt.:
			
		

> Notfalls postest du mal Code, dann kann man sich das mal angucken.


Kann ich gerne mal machen. Muss nur mit USB-Stick von dem anderen Computer rübertransportieren, da dieser kein Internetanschluss hat. :wink: Bin gleich wieder da...


----------



## Camino (7. Okt 2008)

Hab mal Ausschnitte des relevanten Codes eingefügt. Erstmal den Code für die einzelnen Komponenten:

```
addComponent( formularPanel, label_name,          0, 0, 1, 1,  0.0,   0.0, 0, 18, 120, 18 );
addComponent( formularPanel, textfeld_name,       1, 0, 1, 1,  0.0,   0.0, 0, 18, 200, 18 );
addComponent( formularPanel, label_vorname,       0, 1, 1, 1,  0.0,   0.0, 0, 18, 120, 18 );
addComponent( formularPanel, textfeld_vorname,    1, 1, 1, 1,  0.0,   0.0, 0, 18, 200, 18 );
addComponent( formularPanel, label_matrikelnr,    0, 2, 1, 1,  0.0,   0.0, 0, 18, 120, 18 );
addComponent( formularPanel, textfeld_matrikelnr, 1, 2, 1, 1,  0.0,   0.0, 0, 17,  60, 18 );
addComponent( formularPanel, separator,           0, 3, 2, 1,  0.0,   0.0, 0, 17, 330,  1 );
addComponent( formularPanel, label_strasse,       0, 4, 1, 1,  0.0,   0.0, 0, 18, 120, 18 );
addComponent( formularPanel, textfeld_strasse,    1, 4, 1, 1,  0.0,   0.0, 0, 17, 200, 18 );
addComponent( formularPanel, label_plz,           0, 5, 1, 1,  0.0,   0.0, 0, 18, 120, 18 );
addComponent( formularPanel, textfeld_plz,        1, 5, 1, 1,  0.0,   0.0, 0, 17,  60, 18 );
addComponent( formularPanel, label_wohnort,       0, 6, 1, 1,  0.0, 100.0, 0, 18, 120, 18 );
addComponent( formularPanel, textfeld_wohnort,    1, 6, 1, 1, 20.0, 100.0, 0, 18, 200, 18 );
```

und nun noch die Methode addComponent:

```
public void addComponent( Container cont, Component c, 
			int x, int y, 
            int width, int height, 
            double weightx, double weighty,
            int fill, int anchor,
            int dimx, int dimy ) 

	{ 
		GridBagConstraints gbc = new GridBagConstraints(); 
		gbc.fill = fill; 
		gbc.anchor = anchor;
		gbc.gridx = x; gbc.gridy = y; 
		gbc.gridwidth = width; gbc.gridheight = height; 
		gbc.weightx = weightx; gbc.weighty = weighty; 
		gbc.insets = insets;
		c.setPreferredSize(new Dimension(dimx, dimy));
		c.setMinimumSize(c.getPreferredSize());
		c.setMaximumSize(c.getPreferredSize());
		gbl.setConstraints( c, gbc ); 
		cont.add( c ); 
	}
```

Ach ja, GridBagLayout gbl und Insets insets wurde weiter oben im Code definiert...


----------



## L-ectron-X (7. Okt 2008)

Wenn du textfeld_wohnort horizontal die Zelle ausfüllen lässt, reicht dann für weightx ein Wert von 1.0 oder weniger.

gbc.fill = GridBagConstraints.HORIZONTAL;

oder eben den entsprechenden korrespondierenden Wert dafür.


----------



## geraldf (7. Okt 2008)

Hallo Camino!



			
				Camino hat gesagt.:
			
		

> Ich kapier den Vergleich mit Excel nicht so ganz.



Ich hab damit nur gemeint, dass die Fläche in Zellen wie in Excel aufgeteilt wird.
Im Gegensatz zu Excel sind die Zellenränder aber per Default unsichtbar.

Vielleicht hilft es beim Entwickeln, die Zellenränder sichtbar zu machen. Hab jetzt keinen konkreten Vorschlag dafür, ist aber sicher irgendwie möglich.

Beste Grüße
Gerald


----------



## Camino (7. Okt 2008)

geraldf hat gesagt.:
			
		

> Vielleicht hilft es beim Entwickeln, die Zellenränder sichtbar zu machen. Hab jetzt keinen konkreten Vorschlag dafür, ist aber sicher irgendwie möglich.


Stimmt, das hat mir bei HTML-Tabellen auch immer geholfen, um zu sehen, wie die Zellen aufgeteilt sind. Das müsste doch bei GridBagLayout auch möglich sein, das Gitternetz sichtbar zu machen.


----------



## Camino (7. Okt 2008)

L-ectron-X hat gesagt.:
			
		

> Wenn du textfeld_wohnort horizontal die Zelle ausfüllen lässt, reicht dann für weightx ein Wert von 1.0 oder weniger.
> 
> gbc.fill = GridBagConstraints.HORIZONTAL;
> 
> oder eben den entsprechenden korrespondierenden Wert dafür.


Bei GridBagConstraints.HORIZONTAL dehnt sich das Textfeld aber horizontal über das ganze Panel aus, da ich ja die Grösse des Panels nicht begrenzt habe. Deswegen hab ich ja auch für die einzelnen Komponenten Grössen festgelegt und dann fill auf NONE gesetzt.


----------



## L-ectron-X (7. Okt 2008)

mit
	
	
	
	





```
gbc.insets = new Insets(top, left, bottom, right);
```
kannst du einen Rand um die Komponente festlegen.


----------



## Camino (7. Okt 2008)

OK, ich danke euch allen erstmal und schliesse das Thema hier ab.


----------

