# mehrere JLabel in einem JFrame - wie?



## Stormy (4. Nov 2008)

Guten Morgen,

ich hab mich bisher noch nicht so stark mit GUIs in Java beschäftigt und bin grad dabei das Javabuch (Java ist auch eine Insel) durchzuackern.
Im Kapitel 15 bin ich grad bei dem Punkt 15.3 JLabel (K 15.3 JLabel) und wollte testen, wo das Label jeweils ist mit CENTER, LEFT und RIGHT und hab deswegen folgenden Code ausprobiert:


```
//GUI wird erstellt
	JFrame jfGUI = new JFrame("GUI");
	//bei Schließen des GUIs wird das Prog beendet
	jfGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	//Größe des Fensters wird festgelegt
	jfGUI.setSize(600,400);

	//die Labels werden erstellt
	JLabel jlLeft  	 = new JLabel("East", JLabel.LEFT);
	JLabel jlCenter  = new JLabel("South",JLabel.CENTER);
	JLabel jlRight   = new JLabel("West", JLabel.RIGHT);
	 
	//Labels werden dem Frame hinzugefügt
	jfGUI.add(jlLeft);
	jfGUI.add(jlCenter);
	jfGUI.add(jlRight);
	
  //Fenster wird zentriert
  jfGUI.setLocationRelativeTo(null);
  //Fenster wird sichtbar gemacht
  jfGUI.setVisible(true);
```

Das Problem ist, anstatt alle 3 Labels an unterschiedlichen Positionen im GUI anzuzeigen, "überschreibt" er die vorigen Labels, so dass anstatt East, South und West nur West steht.

Kann mir jemand helfen, was ich hier falsch mache, ich komme einfach nicht drauf. ;(

MfG

Patrick


----------



## SlaterB (4. Nov 2008)

versuche doch erstmal ganz einfach nur drei oder zwei verschiedene JLabel einzufügen, 
das geht genausowenig, das hat mit  JLabel.LEFT usw. nix zu tun

das JFrame verwendet ein BorderLayout,
da musst du die Komponenten speziell einfügen,
z.B.
jfGUI.add(jlLeft, BorderLayout.NORTH); 
jfGUI.add(jlCenter, BorderLayout.CENTER); 

oder setze ein anderes Layout, z.B. FlowLayout, da funktioniert ein einfaches add(),
neue JPanel haben standardmäßig FlowLayout,

eine einfache Möglichkeit ist also, alles in ein Zwischen-JPanel einzufügen, 
und nur dieses eine JPanel in das JFrame


----------



## @x.l (4. Nov 2008)

Du musst zuerst mal deinem JFrame ein anderes Layout geben. Für NORTH, SOUTH, ... benötigst du ein BorderLayout.


```
JLabel jlLeft = new JLabel("East", JLabel.LEFT);
```

Damit erzeugst du ein Label welches linksbündig ausgerichtet ist.... hat also nix mit der Ausrtichtung innerhalb des JFrames zu tun.

Erst beim hinzufügen der Labels zum Frame gibst du an, wo diese platziert werden sollen.


----------



## SlaterB (4. Nov 2008)

ein JFrame hat doch standardmäßig BorderLayout


----------



## Stormy (4. Nov 2008)

Danke euch zwei, jetzt hab ich es kapiert.
Aktualisierter Code:

```
//GUI wird erstellt
	JFrame jfGUI = new JFrame("GUI");
	//bei Schließen des GUIs wird das Prog beendet
	jfGUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	//Größe des Fensters wird festgelegt
	jfGUI.setSize(300,200);

	//die Labels werden erstellt
        //JLabel.xxx sagt bloß aus ob der Text im Label links/rechtsbündig oder zentriert ist(!)
	JLabel jlLeft  	 = new JLabel("East");
	JLabel jlCenter  = new JLabel("South",JLabel.CENTER);
	 
	
	//Labels werden dem Frame hinzugefügt
        //erst bei Einfügen der Labels in den Frame kann man die Position im GUI festlegen
        //hierzu muss allerdings das selbe Layout verwendet werden wie im Frame
	jfGUI.add(jlLeft, BorderLayout.EAST);
	jfGUI.add(jlCenter, BorderLayout.SOUTH);
	
  //Fenster wird zentriert
  jfGUI.setLocationRelativeTo(null);
  //Fenster wird sichtbar gemacht
  jfGUI.setVisible(true);
```

Noch eine kurze Frage:
Ist es allgemein besser mit JPanel in JFrame zu arbeiten, so wie von SlaterB angeschnitten?

//Edit: 
Kann man eigentlich auch bei den Controls fürs GUI absolute Daten angeben bzw. eventuell in %? (hier langt ein kurzes ja oder nein, bin ja grad mal am Anfang von K15 im Javabuch)  
Ist es sinnvoll mit css in JLabels zu arbeiten oder wirklich nur für "richtig gescheite" GUIs?


MfG

Patrick


----------



## SlaterB (4. Nov 2008)

kommt darauf an, was du vorhast, wenn du BorderLayout brauchst, dann wäre das ZwischenPanel selber mit BorderLayout recht sinnlos

ansonsten hat man die Wahl:
getContentPane().setLayout(new FlowLayout());

oder ein JPanel verwenden, welches FlowLayout hat und damit mehrere Komponenten besser unterstützt,

für einen erfahrenen User ist das eine völlig freie Wahl,
für einen Anfänger/ Tutorial ist
> getContentPane().setLayout(new FlowLayout());
vielleicht etwas zu hoch


-------

> Kann man eigentlich auch bei den Controls fürs GUI absolute Daten angeben bzw. eventuell in %?

GridBagLayout kann das ein bisschen,
oder absolute Angaben in Pixeln ausrechnen, alles nicht so einfach in Standard-Swing


----------



## OneAndZero (4. Nov 2008)

hi,

aber wo sagst du den jfGUI das es ein BorderLayout hat!?
Oder seh ich das nur nicht!?

mfg


----------



## OneAndZero (4. Nov 2008)

also ich würde es so machen!
<code>
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;


public class TestClass extends JFrame{
  JLabel north = null;
  JLabel west = null;
  JLabel south = null;
  JLabel east = null;
  public TestClass() {
    this.setLayout(new BorderLayout());
    north = new JLabel("North",JLabel.CENTER);
    west = new JLabel("West",JLabel.CENTER);
    south = new JLabel("South",JLabel.CENTER);
    east = new JLabel("East",JLabel.CENTER);

    this.getContentPane().add(north, BorderLayout.NORTH);
    this.getContentPane().add(west, BorderLayout.WEST);
    this.getContentPane().add(south, BorderLayout.SOUTH);
    this.getContentPane().add(east, BorderLayout.EAST);

    this.setSize(new Dimension(300,300));
    this.setVisible(true);
  }

  public static void main(String[] args) {
    new TestClass();
  }
}

</code>


----------



## SlaterB (4. Nov 2008)

SlaterB hat gesagt.:
			
		

> ein JFrame hat doch standardmäßig BorderLayout



es manuell zu setzen schadet natürlich nicht, wer weiß ob das nicht mal in späteren Versionen geändert wird


----------



## Stormy (4. Nov 2008)

Hallo OneAndZero,

das ist Vorgabe, das GUI hat automatisch das BorderLayout sobald das GUI erzeugt wird (sofern ich das richtig verstanden habe), genau wie das JPanel von Haus aus ein FlowLayout hat.

http://www.java-forum.org/de/topic77459_mehrere-jlabel-einem-jframe-wie.html#462395
(Zeile 18, 19 imCode wird dies "angesprochen")

Andere Frage von meiner Seite, ich will später ein GUI machen, das dann 2-spaltig aussehen soll und pro Seite 5 Buttons + 3 Labels, was ist für diesen Fall besser Flow oder Border?

MfG

Patrick


----------



## OneAndZero (4. Nov 2008)

jetzt wo du es sagt... das war es das... stimmt das Panel hatte ja das FlowLayout... naja kann man vergessen!
wie war den der Code Tag hier im Forum!?


----------



## OneAndZero (4. Nov 2008)

wenn du nur komplett zwei Spalten willst könnte dir vllt auch ein GridLayout helfen.....


----------



## SlaterB (4. Nov 2008)

suche nach anderen Postings mit Code drin und drücke auf zitieren

-----

> Andere Frage von meiner Seite, ich will später ein GUI machen, das dann 2-spaltig aussehen soll und pro Seite 5 Buttons + 3 Labels, was ist für diesen Fall besser Flow oder Border? 

um senkrecht anzuordnen verwende ich eher BoxLayout,
zwei derartige Panel und die dann zusammenbringen, das dürfte wohl in vielen Layouts gehen,

aber sowas muss man ausprobieren


----------



## OneAndZero (4. Nov 2008)

was ein Trick ;-)


----------

