/*
P R O G R A M M B E S C H R E I B U N G
In diesem Programm wird an ein Label und einen Button (Schalter) jeweils 
eine Wanze montiert.
Jede Wanze reagiert auf verschiedene Ereignisse:

Wanze am Button: 
Maus wird geklickt, Leertaste wird gedrückt. 

Wanze am Label: 
Maus wird geklickt, Maus wird gedrückt, Maus wird losgelassen,
Maus betritt Label, Maus verlässt Label
*/

package de;
import javax.swing.*;      // GUI Komponente

import java.awt.*;         // Layouts
import java.awt.event.*;   // Ereignisse

// Hier wird ein Objekt der selbstgebastelten Klasse MyFenster erzeugt
public class MainListener13 {
	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;
	// Eine Zeichenfläche deklarieren	
	private  JPanel mypan1;
	// Die folgenden Variablen myl1 und myb1 sind ohne Bezeichner (private, public)
	// Auf sie kann deshalb innerhalb des packages zugegriffen werden.
	// Dies ist keine gute Lösung, da auf Membervariablen mit 
	// Methoden zugegriffen werden soll. Allerdings ist dies damit für den 
	// Anfänger der direkte Zugriff (über die Memebervariable) in der Wanze 
	// auf das Fenster vielleicht leichter zu durchschauen.
	// Lösung mit Zugriff über eine Methode erfolgte in einer früheren Version 
	// Ein Label (Beschriftung) deklarieren
	JLabel myl1;
	// Ein Button (Schalter) deklarieren
	JButton myb1;
	
	// Wanzen deklarieren
	private MyKlickWanze mykw;
	private MyMausWanze mymw;

	// Konstruktor: Bringt Wanzen an die Buttons an.
	public MyFenster(){
		super("Ein Klick-Test");
		// Liefert die Stelle in MyFenster, an die montiert wird.		
		mycont = getContentPane();
		// Erzeugt eine Zeichenfläche		
		mypan1 = new JPanel();
		// Erzeugt Labels (Beschriftungen)
		myl1 = new JLabel("Bitte Klicken");
		// Erzeugt Buttons (Schalter)
		myb1 = new JButton("Bitte klicke mich");
		// Erzeugt Wanzen, die nacher an die Buttons angebracht werden.
		mykw = new MyKlickWanze(this);
		mymw = new MyMausWanze(this);
		// Montiert die Klickwanze an den Button
		myb1.addActionListener(mykw);
		// Montiert die Mauswanze an das Label		
		myl1.addMouseListener(mymw);
		// Montiert das Label an die Zeichenfläche		
		mypan1.add(myl1);
		// Montiert den Button an die Zeichenfläche		
		mypan1.add(myb1);
		// Montiert die Zeichenfläche in das Fenster MyFenster
		mycont.add(mypan1);
		myl1.setBackground(Color.red);
		myb1.setBackground(Color.yellow);
		// Koordinaten des linken, oberen Ecks des Fensters festlegen
		// Koordinate x = 100, Koordinate y = 200.		
		setLocation(100,200);
		// Die Breite des Fensters in x-Richtung = 400
		// Die Breite des Fensters in y-Richtung = 200		
		setSize(400,200);
		// Macht das Fenster sichtbar		
		setVisible(true);
	};
}


class MyKlickWanze implements ActionListener {
	private MyFenster myfVerweis;
	private int myStatus;
	
	// Konstruktor
	public MyKlickWanze(MyFenster f){
		myfVerweis = f;
		myStatus = 1;
	}

	// Ereignisobjekt wird erzeugt durch: Mausklick oder Leertaste
	public void actionPerformed (ActionEvent myae) {
		if(myStatus==1){
			myfVerweis.myb1.setBackground(Color.blue);
			myStatus=0;
		}
		else{
			myfVerweis.myb1.setBackground(Color.red);
			myStatus=1;
		}
		// Bringt Meldung auf den Bildschirm
		System.out.println("Ich komme von der KLICK-WANZE");
	}
}


class MyMausWanze implements MouseListener {
	private MyFenster myfVerweis;
	private int myStatus;

	// Konstruktor
	public MyMausWanze(MyFenster f){
		myfVerweis = f;
	    myStatus = 1;
	    // siehe Java-Hilfe: setBackground in JComponent
	    myfVerweis.myl1.setOpaque(true);	    
	}

	public void mouseEntered (MouseEvent myae) {
		// setzt das Label auf undurchsichtig, ansonsten würden die darunterliegenden
		// Komponenten durchscheinen.
		if(myStatus==1){
			myfVerweis.myl1.setBackground(Color.black);
			System.out.println("Background Black");
			myStatus=0;
		}
		else{
			myfVerweis.myl1.setBackground(Color.pink);
			System.out.println("Background Pink");
			myStatus=1;
		}
		// Bringt Meldung auf den Bildschirm
		System.out.println("mouseEntered");
	}

	public void mouseClicked (MouseEvent myae) {
		// myf.myjl1.setOpaque(true);		
		if(myStatus==1){
			myfVerweis.myl1.setBackground(Color.lightGray);
			System.out.println("Background Lightgray");
			myStatus=0;
		}
		else{
			myfVerweis.myl1.setBackground(Color.darkGray);
			System.out.println("Background DarkGray");
			myStatus=1;
		}
		// Bringt Meldung auf den Bildschirm
		System.out.println("Mouse clicked");
	};
  
	public void mouseExited (MouseEvent myae) {
		if(myStatus==1){
			myfVerweis.myl1.setBackground(Color.cyan);
			System.out.println("Background Cyan");
			myStatus=0;
		}
		else{
			myfVerweis.myl1.setBackground(Color.orange);
			System.out.println("Background Orange");
			myStatus=1;
		}
		// Bringt Meldung auf den Bildschirm
		System.out.println("mouseExited");
	};
  
	public void mousePressed (MouseEvent myae) {
		if(myStatus==1){
			myfVerweis.myl1.setBackground(Color.blue);
			System.out.println("Background Blue");
			myStatus=0;
		}
		else{
			myfVerweis.myl1.setBackground(Color.yellow);
			System.out.println("Background Yellow");
			myStatus=1;
		}
		// Bringt Meldung auf den Bildschirm
		System.out.println("mousePressed");
	};

	public void mouseReleased (MouseEvent myae) {
		if(myStatus==1){
			myfVerweis.myl1.setBackground(Color.green);
			System.out.println("Background Green");
			myStatus=0;
		}
		else{
			myfVerweis.myl1.setBackground(Color.red);
			System.out.println("Background Red");
			myStatus=1;
		}
		// Bringt Meldung auf den Bildschirm
		System.out.println("mouseReleased");
	}
}


