/*
P R O G R A M M B E S C H R E I B U N G
1)
Es wird das Fenster MyFenster erzeugt und auf den Bildschirm gebracht
In diesem Fenster wird eine Zeichenfläche (Panel) erstellt.
In dieser Zeichenfläche werden 2 Labels, 2 Buttons (Schalter) und 
2 Textfelder erstellt.
In das Textfeld kann Text eingegeben werden, wobei dieser noch
nicht verarbeitet wird.

2) Layout
a)
Zusätzlich wird ein Layout (2 Zeilen, 3 Spalten) für diese Zeichenfläche 
erstellt.
Ein Layout ist eine Vorgabe, wie die grafischen Komponenten innerhalb
eines Panels bzw. eines Fensters angeordnet werden (z.B. wenn sie mit
add hinzugefügt werden).

Layouts Besonderheiten:
b) 
Wenn man mit:
myGL62  = new GridLayout(6,2);
mycont.setLayout(myGL62);
6 Zeilen und 2 Spalten vorgibt,
und dann nicht alle 6*2=12 Elemente befüllt,
sondern z.B. (durch 2 add Befehle) nur 2 Elemente 
dann geschieht nicht das Gewünschte.
(offensichtlich gruppiert dann Java um. Man muss also alle Elemente befüllen).
Deshalb befüllt man den Rest mit DummyLabels.

c) 
Warum kann nicht nur ein DummyLabel verwendet werden?
(das man explizit erstellt und dem man einen Namen gibt, wie z.B:
JLabel myDummyLabel = new JLabel())
Weil beim Aufruf einer Methode (z.B. add) dieses DummyLabel 
verändert wird.
Und wenn auf dieses veränderte DummyLabel wieder die Methode
add angewendet wird, ist dies etwas anderes, wenn man für jedes
add ein anderes DummyLabel verwendet.

D.h. wie folgt vorgehen:
Wenn man folgenden Parameter in add benutzt:
new JLabel()
dann wird bei jedem Aufruf ein _neues_ (nicht mehr referenzierbares)
Jlabel erstellt. Das ist gut so, weil man dieses DummyLabel auch 
nicht mehr benötigt.

Zitat Hubert Partl:
Jedes Komponenten-Objekt kann nur an 1 Stelle in 1 Container stehen,
d.h. der add-Befehl aendert die Eigenschaften von dummyLabel1,
und er aendert sogar die Eigenschaften von myPan26, indem er ein
remove auf das vorherige add macht.
Das steht alles in der Online-Doku von add() bzw. addImpl() 
in der Klasse Container:
"Adds the specified component to this container at the specified index. 
...
If the component is not an ancestor of this container and has a non-null
parent, it is removed from its current parent before it is added to this
container." 

3) Zeichenfläche (JPanel)
Man kann Buttons, usw. nicht nur direkt im Fenster anbringen, 
sondern diese vorher an eine sogenannte Zeichenfläche (JPanel)
anbringen und diese dann im Fenster anmontieren.

4) Zusätzlich zur letzten Version sollen die grafischen Elemente
durch Verwendung von DummyLabels verkleinert werden
*/

import java.awt.*;
import javax.swing.*;

// Hier wird ein Objekt der selbstgebastelten Klasse MyFenster erzeugt
public class MainFenster14 {
	public static void main(String[] args) {
		MyFenster myF = new MyFenster();
		myF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

// Ein Frame ist ein Fenster bzw. Fenstersegment
// Es ist nach seiner Erzeugung zuerst anfänglich unsichtbar.
// Hier wird die von JFrame abgeleitete Klasse MyFenster gebastelt, die 
// damit die ganze Leistungsfähigkeit von JFrame erbt.
class MyFenster extends JFrame{
	// Buttons (Schalter) deklarieren
	private JButton myB1, myB2;
	// Textfelder deklarieren
	private JTextField myT1, myT2;
	// Labels deklarieren
	private JLabel myL1, myL2;
	// Zeichenflächen
	private JPanel myPan1;
	private JPanel myPan2;
	// Stelle in MyFenster deklarieren, an die montiert wird.	
	private Container myCont;
	// Für myCont ein Layout
	private GridLayout myGL21;
	// Für myPan1 ein Layout
	private GridLayout myGL24_1;
	// Für myPan2 ein Layout
	private GridLayout myGL24_2;
		

	// Konstruktor
	public MyFenster(){
		// Erzeugt jeweils ein Button 
		myB1=new JButton("Go");
		myB2=new JButton("Go");
		// Erzeugt jeweils ein einzeiliges Textfeld mit dem vorgegebenen
		// Text und der vorgegebenen Spaltenzahl. Dieser Text kann 
		// (im Gegensatz zu einem Label) editiert werden
		myT1=new JTextField("hier eingeben",30);
		myT2=new JTextField("Eingabe hier",30);
		// Erzeugt jeweils ein Label (Beschriftung) mit dem vorgegebenen 
		// Text Dieser Text kann (im Gegensatz zu einem Textfeld) nicht 
		// editiert werden
		myL1=new JLabel("Euro --> Dollar");
		myL2=new JLabel("Dollar --> Euro");
		// Erzeugt  Zeichenflächen
		myPan1 = new JPanel();
		myPan2 = new JPanel();
		// Liefert die Stelle in MyFenster, an die montiert wird.
		myCont = getContentPane();
		// Erzeugt Layouts
		myGL21 = new GridLayout(2,1);
		myGL24_1 = new GridLayout(2,4);
		myGL24_2 = new GridLayout(2,4);
		// Ordnet das Layout dem Container myCont zu und 
		// "formatiert" ihn damit.
		myCont.setLayout(myGL21);
		myPan1.setLayout(myGL24_1);
		myPan2.setLayout(myGL24_2);
		// Montiert die grafischen Komponenten in myPan1

		myPan1.add(myL1);
		myPan1.add(myT1);
		myPan1.add(myB1);
		myPan1.add(new JLabel());
		myPan1.add(new JLabel());
		myPan1.add(new JLabel());
		myPan1.add(new JLabel());		
		myPan1.add(new JLabel());		

		myPan2.add(new JLabel());
		myPan2.add(new JLabel());
		myPan2.add(new JLabel());
		myPan2.add(new JLabel());		
		myPan2.add(myL2);
		myPan2.add(myT2);
		myPan2.add(myB2);
		myPan2.add(new JLabel());		
		
		myCont.add(myPan1);
		myCont.add(myPan2);
		
		// Fensterüberschrift festlegen
		setTitle("Meine Zeichnung");
		// Koordinaten des linken, oberen Ecks des Fensters festlegen
		// Koordinate x = 30, Koordinate y = 60.		
		setLocation(30,60);
		// Die Breite des Fensters in x-Richtung = 600
		// Die Breite des Fensters in y-Richtung = 400		
		setSize(600,400);
		// Macht das Fenster sichtbar
		setVisible(true);
	}
}







