# Gridbaglayout und anordnung der elemente



## vodn7v (20. Nov 2006)

hallo,
ich habe ein problem mit der anordnung der elemente in meinem fenster. ich kann sie irgendwie nicht richtig positionieren.

hier mein erstes bild:

Java_1

 hier das zweite bild:


Java_1


das einzige was die beiden bilder unterscheidet ist das ich im layout 1

"gbc.fill = GridBagConstraints.HORIZONTAL;"

und im layout 2: 

"gbc.fill = GridBagConstraints.NONE;" .. verwende..

mein problem ist jetzt das ich wenn ich das wie beim ersten layout habe sich jedes element in der tabelle sich an die größe des größten elementes anpasst.. also wenn ich 5 eingabefelder untereinander habe, uns zb das 1ste 50pixel ist. dann sind alle anderen auch gleich so groß obwohl ich ihnen andere werte gegeben habe.

beim 2ten bleibt die größe so wie ich sie angegeben habe aber irgednwie is alles komisch zentriert. also das sieht alles nicht schön aus.

könnt ihr mir weiterhelfen ???

hier der quelltext:


```
public class bestell extends JFrame
{
	/**
	 * 
	 */

	private static final long serialVersionUID = 1L;

	Container c;
	JLabel label1, label2,label3,label_ort;
	JTextField vorname,nachname,strasse,h_nr,ort,plz,firma;
	JButton button,button2,button3;
	
	public  bestell()
	{
		c = getContentPane();
		GridBagLayout gbl = new GridBagLayout();
		GridBagConstraints gbc = new GridBagConstraints();
		setLayout(gbl);
			
		gbc.fill = GridBagConstraints.NONE;
	
		
		button = new JButton("Hinzufügen");
		button2 = new JButton("Hinzufügen");
		button3 = new JButton("Bestellen");
		label1 = new JLabel("Firma:*",JLabel.LEFT);
		label2 = new JLabel("Vor-/Nachname:*",JLabel.LEFT);
		label3 = new JLabel("Strasse/Nr:*",JLabel.LEFT);
		label_ort = new JLabel("PLZ/Ort:*",JLabel.LEFT);
		
		
		
		vorname = new JTextField();
		nachname = new JTextField();
		strasse = new JTextField();
		h_nr = new JTextField();
		ort = new JTextField();
		plz = new JTextField();
		firma = new JTextField();
		
		
		gbl.setConstraints(label1, gbc);
		gbc.gridy = 2;gbc.gridx = 0;gbc.ipadx= 40;
	//	gbc.weighty = 0.1;
		c.add(label1,gbc);
	
		gbl.setConstraints(firma,gbc);
		gbc.gridy =2 ;gbc.gridx = 1; gbc.ipadx =200; //gbc.gridwidth = 1;

		c.add(firma,gbc);
		
		
		gbl.setConstraints(label2, gbc);
		gbc.gridy = 3;gbc.gridx =0;  gbc.ipadx = 30;//gbc.gridwidth = 3;
		c.add(label2,gbc);
		
		
		gbl.setConstraints(vorname,gbc);
		gbc.gridy =3; gbc.gridx = 1; gbc.ipadx = 150;// gbc.gridwidth = 1;
		c.add(vorname,gbc);
		
		
		gbl.setConstraints(nachname,gbc);
		gbc.gridy =3; gbc.gridx = 2; gbc.ipadx = 150;// gbc.gridwidth = 1;
		c.add(nachname,gbc);
	
		
		gbl.setConstraints(label3, gbc);
		gbc.gridy = 4; gbc.gridx = 0; gbc.ipadx = 30;//gbc.gridwidth = 3;
		c.add(label3,gbc);
		
		
		gbl.setConstraints(strasse,gbc);
		gbc.gridy =4; gbc.gridx = 1; gbc.ipadx = 200; //gbc.gridwidth = 1;
		c.add(strasse,gbc);
		
		gbl.setConstraints(h_nr,gbc);
		gbc.gridy =4; gbc.gridx = 2; gbc.ipadx = 20; //gbc.gridwidth = 1;
		c.add(h_nr,gbc);
		
		gbl.setConstraints(label_ort,gbc);
		gbc.gridy =5; gbc.gridx = 0; gbc.ipadx = 20; //gbc.gridwidth = 1;
		c.add(label_ort,gbc);
		
		gbl.setConstraints(plz,gbc);
		gbc.gridy =5; gbc.gridx = 1; gbc.ipadx = 80; //gbc.gridwidth = 1;
		c.add(plz,gbc);
		
		gbl.setConstraints(ort,gbc);
		gbc.gridy =5; gbc.gridx = 2; gbc.ipadx = 200; //gbc.gridwidth = 1;
		c.add(ort,gbc);
		
	
		
		gbl.setConstraints(button,gbc);
		gbc.gridy = 6; gbc.gridx = 0;gbc.ipadx = 0;// gbc.gridwidth = 0;
		c.add(button,gbc);
		
		gbl.setConstraints(button2,gbc);
		gbc.gridy = 0; gbc.gridx = 0;gbc.ipadx = 1; //gbc.gridwidth = 1;
		c.add(button2,gbc);
		

		gbl.setConstraints(button3,gbc);
		gbc.gridy = 10; gbc.gridx = 3;/*gbc.ipadx = 1;*/ //gbc.gridwidth = 1;
		c.add(button3,gbc);



        String[] columnNames = {"Art_No",
                                "Bezeichnung",
                                "Preis",
                                "Menge"};
      Object[][] data = 
      {
            {"Mary", "Campione",
             "Snowboarding", new Integer(5), new Boolean(false)},
            {"Alison", "Huml",
             "Rowing", new Integer(3), new Boolean(true)},
            {"Kathy", "Walrath",
             "Knitting", new Integer(2), new Boolean(false)},
            {"Sharon", "Zakhour",
             "Speed reading", new Integer(20), new Boolean(true)},
            
      };

        final JTable table = new JTable(data, columnNames);
        table.setPreferredScrollableViewportSize(new Dimension(350, 100));
        
        JScrollPane scrollPane = new JScrollPane(table);
        scrollPane.setIgnoreRepaint(false);
    
        gbc.fill = GridBagConstraints.NONE;
        
        gbc.gridx = 0; gbc.gridy = 8;gbc.gridwidth = 4;
        
        gbl.setConstraints(scrollPane, gbc);
        c.add(scrollPane,gbc);
        
       
    }
```


danke euch vielmals


----------



## robinab (21. Nov 2006)

Hallo ???,

stell alle ipadx und alle ipady-Einstellungen auf 0, setze fill auf HORIZONTAL und arbeite mit den Randeinstellungen, also insets. Es kann sein, dass Du evtl. die ipady-Einstellung dann doch noch auf 20 setzen mußt, damit die Felder nicht zu schmal sind.  

Die Constraints des GridBagLayouts haben sehr viel mehr Einstellungen als Du verwendest. Probier damit mal ein bißchen rum, dann kriegst Du schon Erfahrung. Aber paß auf: Im GridBagLayout beeinflussen sich alle Elemente untereinander!!! 

Noch ein Tipp: Leg das Layout auf Deine Table, nicht auf Deine ScrollPane! Und bei Tabellen am Besten fill=BOTH. I.d.R. willst Du ja, dass die Tabelle mitgezogen wird, wenn das Fenster in der Größe verändert wird. 

Gruß!
robin


----------



## vodn7v (21. Nov 2006)

alles klar, ich danke dir fuers erste.

das verstehe ich noch nicht so ganz: "noch ein Tipp: Leg das Layout auf Deine Table, nicht auf Deine ScrollPane! "

mit dem mitziehen sollte eig nich so das prob sein weil ich die fesntergröße fest auf 640*480 wollte. sollte dann doch kein problem sein.. odeR?


----------



## vodn7v (21. Nov 2006)

also ich habe ipad x+y auf 0 gesetz und HORIZONTAL eingestellt.

das problem ist,wie du auch schon sagtest das die alle voneinander abhängig sind. gibt es denn kein layout wo ich einfach per x,y die position angeben kann und die größe definieren kann ?

ich habe zb ein kleines feld plz darunter wieder ein normales mit e-mail adresse.. plz wird jetzt aber genauso groß wie e-mails adresse weil dies das größte feld ist.

ich hab mir vorgestellt das das in etwas so aussehen soll :


----------



## robinab (21. Nov 2006)

In dem Fall würde ich Dir das null-Layout empfehlen!
Das sieht dann so aus: this.setLayout(null);
Bei diesem Layout kannst Du die Elemente genau so positionieren, wie Du willst, und zwar mit <element>.setBounds(<xPos>, <yPos>, <width>, <height>);.
Du solltest dann aber für Dein Fenster this.setResizable(false) setzen. Das GridBagLayout nur verwenden, wenn das Fenster resizable sein soll und die Elemente mitwachsen oder -schrumpfen sollen, sonst viel zu kompliziert!

Gruß!
robin


----------



## Guest (21. Nov 2006)

okay.. danke dir fuers erste.. ich nehme an , dass ich dann die fenster nich so schön machen kann wie bei anderen layouts !?!? oder gibts dafuer n lösung? 
danke


----------



## robinab (21. Nov 2006)

Bei anderen Layouts berechnet halt JAVA intern, wie die Elemente positioniert werden müssen, wenn Du das Fenster größer oder kleiner ziehst.
Beim null-Layout ist alles fixiert.

Ich versteh nicht ganz, was Du mit "... dann die Fenster nicht so schön machen kann wie bei anderen Layouts. Oder gibts dafür ne Lösung?" Was für eine Lösung erwartest Du denn?

Entweder Dein Fenster hat eine fixe Größe, alle Felder sollen immer die gleiche Position und Größe haben => null-Layout.
Fenstergrößer verändert sich, die Elemente sollen dynamisch
angepaßt werden => BorderLayout, FlowLayout, GridLayout oder GridBagLayout - je nachdem, wie das Fenster aussehen und  reagieren soll und wie komplex es ist.

Hier nochn bißchen was zum Nachlesen:
http://java.sun.com/docs/books/tutorial/uiswing/layout/visual.html

Viel Spaß!
robin


----------



## Beni (21. Nov 2006)

Wenn das Programm mit verschiedenen Schriftgrössen (sehr wahrscheinlich...) zurechtkommen soll: nichts Null-Layout :wink:

Benutz doch JPanels um passende Elemente zu gruppieren. Dann kannst du auch "LayoutManager in LayoutManagern verschachteln", je nachdem welcher gerade am besten passt.

[Edit: als Anregung]

```
package forum;

import java.awt.*;
import javax.swing.*;

public class Beispiel{
    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().add( createPanel(), BorderLayout.CENTER );
        frame.pack();
        frame.setVisible( true );
    }
    
    private static JPanel createPanel(){
        JPanel base = new JPanel( new GridBagLayout() );
        
        base.add( new JLabel( "Name" ), new GridBagConstraints( 0, 0, 1, 1, 0.0, 0.0, 
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
                new Insets( 1, 1, 1, 1 ), 0, 0 ));
        
        base.add( new JLabel( "Vorname" ), new GridBagConstraints( 0, 1, 1, 1, 0.0, 0.0, 
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
                new Insets( 1, 1, 1, 1 ), 0, 0 ));
        
        base.add( new JLabel( "PLZ" ), new GridBagConstraints( 0, 2, 1, 1, 0.0, 0.0, 
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
                new Insets( 1, 1, 1, 1 ), 0, 0 ));
        
        base.add( new JLabel( "e-Mail" ), new GridBagConstraints( 0, 3, 1, 1, 0.0, 0.0, 
                GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, 
                new Insets( 1, 1, 1, 1 ), 0, 0 ));
        
        JTextField fieldName = new JTextField();
        JTextField fieldVorname = new JTextField();
        JTextField fieldPLZ = new JTextField();
        JTextField fieldMail = new JTextField();
        
        // die voraussichtliche Anzahl Zeichen.
        fieldName.setColumns( 12 );
        fieldVorname.setColumns( 12 );
        fieldPLZ.setColumns( 4 );
        fieldMail.setColumns( 24 );
        
        // das funktioniert nur, wenn das LookAndFeel nicht veraendert wird
        fieldName.setMinimumSize( fieldName.getPreferredSize() );
        fieldVorname.setMinimumSize( fieldVorname.getPreferredSize() );
        fieldPLZ.setMinimumSize( fieldPLZ.getPreferredSize() );
        fieldMail.setMinimumSize( fieldMail.getPreferredSize() );
        
        base.add( fieldName, new GridBagConstraints( 1, 0, 1, 1, 1.0, 1.0,
                GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets( 1, 10, 1, 1 ), 0, 0 ));
        
        base.add( fieldVorname, new GridBagConstraints( 1, 1, 1, 1, 1.0, 1.0,
                GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets( 1, 10, 1, 1 ), 0, 0 ));
        
        base.add( fieldPLZ, new GridBagConstraints( 1, 2, 1, 1, 1.0, 1.0,
                GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets( 1, 10, 1, 1 ), 0, 0 ));
        
        base.add( fieldMail, new GridBagConstraints( 1, 3, 1, 1, 1.0, 1.0,
                GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets( 1, 10, 1, 1 ), 0, 0 ));

        // ein eigenes Panel für die Buttons
        JPanel buttons = new JPanel( new GridLayout( 1, 2 ));
        buttons.add( new JButton( "Ok" ));
        buttons.add( new JButton( "Abbrechen" ));
        
        base.add( buttons, new GridBagConstraints( 0, 4, 2, 1, 1.0, 1.0,
                GridBagConstraints.LAST_LINE_END, GridBagConstraints.NONE,
                new Insets( 1, 1, 1, 1 ), 0, 0 ));
        
        return base;
    }
}
```


----------

