/*
P R O G R A M M B E S C H R E I B U N G
Es werden Buttons, Textfelder, Labels und eine Zeichnung 
in einem Fenster erstellt.

Besonderheit:
1)
Wenn man sowohl die Anzahl der Zeilen als auch dei Anzahl der 
Spalten mit "nicht Null" angibt, dann wird die Anzahl der Spalten 
ignoriert. Statt dessen wird die Spaltenanzahl festgelegt durch 
die angegebene Zeilenanzahl und die Gesamtanzahl der Komponenten 
im Layout. Zum Beispiel, wenn drei Zeilen und zwei Spalten angegeben 
wurden und neun Komponenten werden dem Layout hinzugefügt, dann 
werden sie in drei Zeilen und drei Spalten angezeigt. 
Die Angabe einer Spaltenanzahl berührt das Layout nur, 
wenn die Anzahl der Zeilen mit "Null" angegeben wird.


2)
Ein und dieselbe Swing-Komponente (z.B. myl1) darf nicht die 
gleiche Eltern haben (z.B. myp1 und myp2). 

myp1.add(myl1);
myp1.add(myt1);
myp1.add(myb1);
myp1.add(myl2);
myp1.add(myt2);
myp1.add(myb2);

myp2.add(myl1);
myp2.add(myt1);
myp2.add(myb1);
myp2.add(myl2);
myp2.add(myt2);
myp2.add(myb2);

3)		
Es wurde mir im Java-Forum folgendes geraten:
pro JPanel ein eigenes Layout verwenden:
also folgendes nicht machen:
myp1.setLayout(myGL23);
myp2.setLayout(myGL23);
	
		
4)
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. nur wie hier 2 Elemente: 
mycont.add(myp1);
mycont.add(myz1);
dann wird myp2 nicht _neben_ myp1 in der ersten Zeile dargestellt,
sondern _unter_ myp1 in der 2. Zeile.
Es wird also nicht zuerst die 1. Zeile komplett gefüllt, 
dann die 2.Zeile, usw. wie es GridLayout eigentlich machen müsste. 
Warum?
Offensichtlich gruppiert dann Java um.
Man muss also alle Elemente befüllen.

5)
a)
Jeder Komponente wird standardmäßig ein Layout zugeordent:
new JPanel() -> FlowLayout
getContentPane() -> BorderLayout
new MyZeichenflaeche() -> extends JPanel -> FlowLayout

b)
getContentPane(), also mycont, verwendet BorderLayout, 
welches die Eigenschaft hat, die eingefügten Komponenten 
auf die maximale Fläche zu vergrößern, 
relativ egal was PreferredSize so zu vermelden hat
Deswegen funktioniert folgendes:
mycont.add(myp1);
mycont.add(myz);		
und Nichtimplementierung von getPreferredSize().

c)
Ein normales JPanel hat standardmäßig FlowLayout, 
welches nicht maximiert und auf PreferredSize achtet 
Deswegen funktioniert folgendes nicht:
mypan.add(myz);   
mycont.add(mypan); 		
und Nichtimplementierung von getPreferredSize().


*/


import java.awt.*;

import javax.swing.*;

// Hier wird ein Objekt der selbstgebastelten Klasse MyFenster erzeugt
public class MainLayout10 {
	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{
	// Stelle in MyFenster deklarieren, an die montiert wird.	
	private Container mycont;
	// Buttons (Schalter) deklarieren	
	private JButton myb1, myb2;
	//Textfelder deklarieren
	private JTextField myt1, myt2;
	// Labels (Beschriftungen) deklarieren	
	private JLabel myl1, myl2;
	// Zeichenflächen deklarieren	
	private JPanel myp1;
	private MyZeichenflaeche myz;
	
	// Ein Layout, genauer ein Gridlayout wie z.B:
	// GridLayout myGL23 = new GridLayout(2,3);
	// ist ein Layout (legt die Anordnung z.B. der Buttons und
	// Textfelder in einer Zeichenfläche bzw. einem Fenster fest).
	// Das obige Gridlayout bedeutet, dass die sichtbaren Komponenten
	// (z.B. Buttons, Textfelder, usw.) in einer Tabelle mit
	// 2 Zeilen und 3 Spalten angeordnet werden.
	// Dabei wird zuerst die 1. Zeile spaltenweise (mit z.B. Textfeld, 
	// Button, usw.) aufgefüllt, dann 2. Zeile.
	private GridLayout myGL62, myGL23;

	// Konstruktor
	public MyFenster(){
		// Liefert die Stelle in MyFenster, an die montiert wird.		
		mycont = getContentPane();
		// Erzeugt jeweils ein Button		
		myb1=new JButton("Go");
		myb2=new JButton("Ok");
		// 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("hier eingeben",30);
		// Erzeugt jeweils ein Label (Beschriftung) mit dem vorgegebenen 
		// Text Dieser Text kann (im Gegensatz zu einem Textfeld) nicht 
		// editiert werden
		myl1=new JLabel("Haarfarbe eingeben");
		myl2=new JLabel("Geschlecht");
		// Erzeugt jeweils eine Zeichenfläche		
		myp1 = new JPanel();
		myz = new MyZeichenflaeche();
		
		myGL62  = new GridLayout(6,2);
		myGL23  = new GridLayout(2,3);
		// Ordnet das Layout dem Fenster MyFenster zu
		// ("formatiert" das Fenster MyFenster)
		mycont.setLayout(myGL62);
		// Ordnet das Layout der Zeichenfläche (Panel) myp1 zu
		// ("formatiert" die Zeichenfläche damit)
		myp1.setLayout(myGL23);
		// Ordnet das Layout der Zeichenfläche (Panel) myp2 zu
		// ("formatiert" die Zeichenfläche damit)
		// Montiert die grafischen Komponenten in die Zeichenflächen
		
		myp1.add(myl1);
		myp1.add(myt1);
		myp1.add(myb1);
		myp1.add(myl2);
		myp1.add(myt2);
		myp1.add(myb2);
		/* So funktioniert es nicht, weil:
		myz wird maximiert angezeigt (BorderLayout),
		mypan nimmt nur einen kleinen Teil von myz ein (FlowLayout),
		da PreferredSize von mypan nur die Standardgröße der Buttons usw. 
		berücksichtigt ->
		also noch viel Platz um das paint von myz anzuzeigen
		*/ 		
	    // mypan.add(myz);   
	    // mycont.add(mypan); 		
		
		// Montiert die Zeichenflächen in das Fenster MyFenster		
		mycont.add(myp1);
		mycont.add(myz);		
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		mycont.add(new JLabel(""));
		
		

		// 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);
	}
	
}

// Eine Unterklasse des Containers JPanel erstellen
class MyZeichenflaeche extends JPanel{
/*
Die folgende Methode paintComponent(g) soll niemals direkt innerhalb des
selbstgeschriebenen Programms aufgerufen werden !
Java (bzw. das Betriebssystem) entscheidet selbst, wenn es 
paintComponent(g) aufruft. Dies geschieht:
-> bei der ersten Anzeige des Fensters (setVisible(true))
-> nachdem ein Fenster vergrößert (verkleinert) wurde,
-> nach dem Wegziehen überlagernder Fenster (verdeckter Elemente 
   werden aufgedeckt)
-> nach einer Größenänderung des Fensters
-> nach dem Aufruf des Befehls repaint() im Programm

Bem:
Den Parameter in paintComponent(...) kann man sich als den Teil des 
Bildspeicherbereichs vorstellen, der die zugehörige Komponente auf dem 
Bildschirm repräsentiert.
*/
	public void paintComponent(Graphics myg){
		/*
		Eigene Farben basteln:
		150, 180, 234 sind die Rot-, Grün- und Blauteile einer Farbe 
		jeweils im Bereich zwischen 0 und 255
		*/
		Color myfarbe = new Color(100, 250, 200);
		// Diese Farbe setzen
		myg.setColor(myfarbe);
		/*
		Zeichnet die Randlinie einer Ellipse, die sich in einem gedachten 
		Rechteck befindet. Der linke obere Punkt hat die Koordinaten 
		Koordinate x = 100, Koordinate y = 50.
		Die Breite des Rechtecks in x-Richtung = 300
		Die Breite des Rechtecks in y-Richtung = 100		
		*/
		myg.drawOval(100, 50, 250, 300);
		// Füllt die Ellipse mit der vorher gesetzten Farbe
		myg.fillOval(100, 50, 250, 300);
		
		// Die Farbe rot auswählen (setzen)
		myg.setColor(Color.red);
		// Text ausgeben
		myg.drawString("Das bin ich",200,20);
		// Linie zeichnen
		myg.drawLine(150,160,180,160);
		myg.drawLine(270,160,300,160);		
		myg.drawLine(230,200,230,230);
		myg.drawRect(200,280,50,30);		
	}

/*	
	public Dimension getPreferredSize(){
		  return (new Dimension(100,100));
	}
*/	
	

	
}


