/*
P R O G R A M M B E S C H R E I B U N G
Experimentieren mit GridBagLayout.
*/


import java.awt.*;

import javax.swing.*;

// Hier wird ein Objekt der selbstgebastelten Klasse MyFenster erzeugt
public class MainLayout12 {
	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;
	private JLabel dummyl1, dummyl2;
	
	// 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 GridBagLayout gbl;
	private GridBagConstraints gbc;	
	
	// Konstruktor
	public MyFenster(){
		// Liefert die Stelle in MyFenster, an die montiert wird.		
		mycont = getContentPane();
		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");
		dummyl1=new JLabel("");
		dummyl2=new JLabel("");
		
		myz = new MyZeichenflaeche();		
		myp1=new JPanel();

		gbl = new GridBagLayout();		

		myp1.setLayout(gbl);
		gbc = new GridBagConstraints();
		
		gbc.fill = gbc.BOTH;

		festlegen(gbl, gbc, myl1,    0, 0 , 1 , 1 , 1.0 , 1.0);
		// macht das Gleiche wie:
		/*		
		gbc.gridx = 0; 
		gbc.gridy = 0;
		gbc.gridwidth = 1; 
		gbc.gridheight = 1;
		gbc.weightx = 1.0; 
		gbc.weighty = 1.0;
		gbl.setConstraints(myl1, gbc );
		*/
		festlegen(gbl, gbc, dummyl1, 1, 0 , 1 , 1 , 1.0 , 1.0);
		festlegen(gbl, gbc, myt1,    2, 0 , 2 , 1 , 1.0 , 1.0);
		festlegen(gbl, gbc, myb1,    4, 0 , 1 , 1 , 1.0 , 1.0);
		festlegen(gbl, gbc, dummyl2, 5, 0 , 3 , 1 , 64.0 , 1.0);
		festlegen(gbl, gbc, myl2,    0, 1 , 1 , 1 , 1.0 , 1.0);		
		festlegen(gbl, gbc, myt2,    2, 1 , 1 , 1 , 1.0 , 1.0);
		festlegen(gbl, gbc, myb2,    4, 1 , 1 , 1 , 1.0 , 1.0);		
		festlegen(gbl, gbc, myz,     0, 2 , 200 , 200 , 100.0 , 100.0);		

		myp1.add(myl1);
		myp1.add(dummyl1);		
		myp1.add(myt1);
		myp1.add(dummyl2);		
		myp1.add(myb1);
		myp1.add(myl2);
		myp1.add(myt2);
		myp1.add(myb2);
		myp1.add(myz);
				
		mycont.add(myp1);

		// 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(800,600);
		// Macht das Fenster sichtbar		
		setVisible(true);
	}
	
	public void festlegen(GridBagLayout gl, GridBagConstraints gc, Component c,  
							int gridx, int gridy, int gridwidth, int gridheight, 
							double weightx, double weighty){

		gc.gridx = gridx;
		gc.gridy = gridy;
		gc.gridwidth = gridwidth;
		gc.gridheight = gridheight;
		gc.weightx = weightx;
		gc.weighty = weighty;		
		gl.setConstraints(c, gc );
	}
	
	
	
}

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));
		}
	*/	
}
	

	






