# JFrame Anordnung



## andreas2505 (27. Jul 2009)

Hallo,

ich habe folgendes Problem:

ich will verschiedene Komponenten (Button, JLabels,...) in ein JFrame packen. Klappt auch soweit, aber ich will nun die zwei JLabels (rsa,unibw) in die rechte und linke untere Ecke und den Button in die Mitte. Aber irgendwie klappt das nicht so. Kann mir wer helfen und den Fehler sagen?

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

 
public class SwingFrame
{ 
  public static void main( String[] args ) 
  { 
    final JFrame f = new JFrame("HVES");
	JPanel p = new JPanel(); 
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    ImageIcon hin1 = new ImageIcon("hintergrund2.jpg");
    Image h1 = hin1.getImage();
    Image h2 = h1.getScaledInstance(1900,1050,Image.SCALE_FAST);
    hin1.setImage(h2);
    JLabel labelhin1 = new JLabel(hin1);
    labelhin1.getPreferredSize();
    /**p.add(labelhin1);*/
	JLabel unibw = new JLabel();
	unibw.setIcon(new ImageIcon("unibw.gif"));
	unibw.getPreferredSize();
	/**p.add(unibw, BorderLayout.SOUTH);*/
	JLabel rsa = new JLabel(new ImageIcon("rsa.gif"));
	rsa.getPreferredSize();
	/**p.add(rsa, BorderLayout.SOUTH);*/
	JButton bw = new JButton("Weiter");
	bw.getPreferredSize();
	/**p.add(bw, BorderLayout.CENTER);*/
	f.getContentPane().setLayout(new BorderLayout());
	f.setContentPane(new BackGroundPane("hintergrund2.jpg"));
	f.getContentPane().add(unibw, BorderLayout.SOUTH);
	f.getContentPane().add(rsa, BorderLayout.SOUTH);
	f.getContentPane().add(bw, BorderLayout.CENTER);
	f.pack();
 f.setSize( 1000, 800 ); 
    
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                f.setVisible(true);
            }
        });

            }
        }
```


----------



## Landei (27. Jul 2009)

```
f.getContentPane().add(unibw, BorderLayout.SOUTH);
    f.getContentPane().add(rsa, BorderLayout.SOUTH);
```

BorderLayout erlaubt nur eine Komponente pro "Zone" (North,South,East,West,Center). Mehrere Komponenten auf ein JPanel (oder in eine Box) packen, und den dann ins BorderLayout packen.


----------



## andreas2505 (27. Jul 2009)

ok hab es jetzt geändert, aber es funzt trotzdem nicht so richtig.
Die Bilder (rsa und unibw) sind ersten zu groß, obwohl ich minimumSize beutzt habe und zweitens ist das JPanel, wodrin ich beide eingefügt habe, nicht unten im JFrame.


```
final JFrame f = new JFrame("HVES");
	JPanel p = new JPanel(); 
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
	JLabel unibw = new JLabel();
	unibw.setIcon(new ImageIcon("unibw.gif"));
	unibw.getMinimumSize();
	p.add(unibw, BorderLayout.SOUTH);
	JLabel rsa = new JLabel(new ImageIcon("rsa.gif"));
	rsa.getMinimumSize();
	p.add(rsa, BorderLayout.SOUTH);
	JButton bw = new JButton("Weiter");
	bw.getPreferredSize();
	/**p.add(bw, BorderLayout.CENTER);*/
	f.getContentPane().setLayout(new BorderLayout());
	f.setContentPane(new BackGroundPane("hintergrund2.jpg"));
	f.getContentPane().add(p, BorderLayout.SOUTH);
	f.getContentPane().add(bw, BorderLayout.CENTER);
	f.pack();
        f.setSize( 1000, 800 ); 
    
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                f.setVisible(true);
            }
        });

            }
        }
```


----------



## Ebenius (27. Jul 2009)

Denk nochmal drüber nach, was die Zeilen 6, 9 und 12 tun sollten! Und dann schau in der API-Doc nach und mach Dir klar, warum Du falsch gelegen haben wirst!

Ebenius


----------



## andreas2505 (27. Jul 2009)

Ok, die Größe geht anscheinend so nicht einzustellen, weil ich ja so nur die preferred size von der Komponente erfrage. Ok aber wie muss ich es dann machen, dass ich die größe am besten beeinflussen kann?


----------



## Ebenius (27. Jul 2009)

Ich weiß nicht genau, ob Du das so machen willst, aber zu den meisten [c]getXXX()[/c]-Methoden gibt's [c]setXXX()[/c]-Methoden.

Ebenius


----------



## andreas2505 (27. Jul 2009)

ja aber wenn ich setPreferredSize mache muss ja eine Dimension als Argument genommen werd und ich kann ja nicht schreiben x.setPreferredSize(x.getPreferredSize()) oder?
wie muss ich das denn schreiben?


----------



## Ebenius (27. Jul 2009)

Ich weiß ja nicht, woher Du die Größe nehmen möchtest, wenn Du sie nicht angeben willst.

Ebenius


----------



## andreas2505 (27. Jul 2009)

Aber wenn ich sie eh selber eingebe, dann reicht ja auch der befehel setSize(..), oder?


----------



## Ebenius (27. Jul 2009)

Nein. [c]setSize(...)[/c] ist dem LayoutManager vorbehalten, wenn Du dem LayoutManager sagen willst, wie groß er's machen soll, benutzt Du [c]setPreferredSize(...)[/c], [c]setMinimumSize(...)[/c], [c]setMaximumSize(...)[/c] oder was auch immer der jeweilige LayoutManager hören möchte. BorderLayout interessiert sich -- wie die meisten LayoutManager -- auf jeden Fall für die PreferredSize.

Ebenius


----------



## andreas2505 (27. Jul 2009)

und was muss ich dann bei setPreferredSize in die Klammern schreiben?
höhe und breite klappt nicht und wie man die dimension schreibt weiß ich nicht so richtig


----------



## Ebenius (27. Jul 2009)

Recht überraschungsfrei:

```
someComponent.setPreferredSize(new Dimension(640, 480));
```

Ebenius


----------



## andreas2505 (27. Jul 2009)

ok danke schonmal. Hab nun ne andere Frage. Ich will mit dem GridLayout die Komponenten anordnen, aber da tut sich gar nicht. Wo ist mein Fehler?


```
GridBagLayout gbl = new GridBagLayout();
    GridBagConstraints gbc = new GridBagConstraints();
    f.getContentPane().setLayout(gbl);
    JLabel rsa = new JLabel(new ImageIcon("rsa.gif"));
    rsa.setPreferredSize(new Dimension(60,80));
    JLabel unibw = new JLabel(new ImageIcon("unibw.gif"));
    unibw.setPreferredSize(new Dimension(120,80));
    JButton bw = new JButton("Weiter");
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridheight = gbc.REMAINDER;
    gbl.setConstraints(unibw,gbc);
    gbc.gridheight = 5;
    gbc.gridx = 5;
    gbl.setConstraints(bw,gbc);
    gbc.gridx = 9;
    gbc.gridy = 9;
    gbc.gridwidth = 7;
    gbl.setConstraints(rsa,gbc);
    f.setContentPane(new BackGroundPane("hintergrund2.jpg"));
    f.getContentPane().add(unibw);
    f.getContentPane().add(bw);
    f.getContentPane().add(rsa);
    f.setSize( 1000, 800 ); 
    
    SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                f.setVisible(true);
            }
        });

            }
        }
```


----------



## Ebenius (27. Jul 2009)

Gib in Zeile 21-23 die [c]gbc[/c] als zweiten Parameter mit. Sonst wird das nichts.

Edit: Ohje, stimmt nicht. Du musst das ganze eigentlich nur umsortieren. Constraints setzen, Komponente hinzufügen, Constraints ändern, nächste Komponente, etc.

Ebenius


----------



## andreas2505 (27. Jul 2009)

aber eigentlich habe ich das doch so wie du sagst. Kannst du die änderungen mal am klartext zeigen?


----------



## Ebenius (27. Jul 2009)

Heute schreib ich Unsinn, vergiss was ich geschrieben habe. Ich benutze das GridBagLayout immer ein bisschen anders, daher hab ich das grad verwechselt. So wie's oben ist, ist eigentlich okay.

Du setzt in Zeile drei das Layout des ContentPane. In Zeile 20 setzt Du aber ein neues ContentPane, das wahrscheinlich kein GridBagLayout hat.

Ebenius


----------



## andreas2505 (27. Jul 2009)

Achso, und wie muss ich dann dann anders schreiben?


----------



## Ebenius (27. Jul 2009)

:meld: Zeile 3 nach 22 verschieben?


----------



## andreas2505 (27. Jul 2009)

aber dann findet es darüber das gbc nicht


----------



## Ebenius (27. Jul 2009)

andreas2505 hat gesagt.:


> aber dann findet es darüber das gbc nicht


Glaub ich nicht.


```
GridBagLayout gbl = new GridBagLayout();
    GridBagConstraints gbc = new GridBagConstraints();
    JLabel rsa = new JLabel(new ImageIcon("rsa.gif"));
    rsa.setPreferredSize(new Dimension(60,80));
    JLabel unibw = new JLabel(new ImageIcon("unibw.gif"));
    unibw.setPreferredSize(new Dimension(120,80));
    JButton bw = new JButton("Weiter");
    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridheight = gbc.REMAINDER;
    gbl.setConstraints(unibw,gbc);
    gbc.gridheight = 5;
    gbc.gridx = 5;
    gbl.setConstraints(bw,gbc);
    gbc.gridx = 9;
    gbc.gridy = 9;
    gbc.gridwidth = 7;
    gbl.setConstraints(rsa,gbc);
    f.setContentPane(new BackGroundPane("hintergrund2.jpg"));
    f.getContentPane().setLayout(gbl);
    f.getContentPane().add(unibw);
    f.getContentPane().add(bw);
    f.getContentPane().add(rsa);
    f.setSize( 1000, 800 ); 
    
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
             f.setVisible(true);
        }
    });
```
Ebenius


----------



## andreas2505 (27. Jul 2009)

super danke,

noch ne kurze Frage

die gridx bzw y anweisung, wo ist da der nullpunkt, wo es anfängt zu zählen? in der mitte?
also wie im KOS?


----------



## andreas2505 (27. Jul 2009)

super danke,

hab aber noch ne frage, wo liegt der nullpunkt von dem gridx und gridy? in der mitte?
und wohin gehen plus und minus. Alles wie beim Koordinatensystem?


----------



## Ebenius (27. Jul 2009)

gridx und gridy sind Spalten und Zeilennummern. Die beginnen im Prinzip wo man will, üblicher Weise mit 0:0 in der linken oberen Ecke des Kontainers. Pflichtlektüre ist auf jeden Fall: Sun Java™ Tutorial: How to Use GridBagLayout. Wenn Du's fertig durchgelesen hast, lies es nochmal!

Ebenius


----------

