EreignisListener verschiedener Klassen aus einer Ereignisklasse verwalten

Becksgold

Mitglied
Hallo erstmal :)

Ich bin zwar ganz neu hier, aber ich hoffe das hält euch nicht davon ab mir eine Hilfreiche Antwort auf meine Frage zu geben :)

Zuerstmal zu meinem Problem:
Ich habe mehrere Klassen angelegt, eine Klasse erzeugt bei Mouseclick verschiedene Frames die sich dann öffnen, in den jetzt neu entstandenen Frames die jewals eine eingene Klasse besitzen sind Button und ein Textfeld sowie ein Slider, mein Vorhaben ist es wenn ich auf einen der Buttons klicke das die Klasse "Ereignis" dieses Erkennt und das Frames der richtigen Klasse neu lädt

das Problem hierbei ist das wenn ich die MouseListener in den unterschiedlichen Klassen implementiere und versuche diese in der Klasse ereignis zu verknüpfen das ich eine Fehlermeldung bekomme:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Ereignis.mousePressed(Ereignis.java:45)
at java.awt.AWTEventMulticaster.mousePressed(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
.......

Die Klasse weis also nicht wo dieses ereignis hergekommen ist und kann dementsprechned nicht handeln, ich werde den redundanten Quelle code mal posten ;)
ich hoffe jemand weiß eine Lösung :)

Java:
Klasse "Kueche":

public class Kueche extends JFrame 
{
	JButton ein = new JButton("EIN");
	JButton aus = new JButton ("AUS");
	
	JLabel heizungeins = new JLabel(heizungan);
	JLabel heizungnull = new JLabel(heizungaus);
	
	Ereignis ereigniskueche = new Ereignis(this, null);
		
	public Kueche()
	{			
		setLayout(null);
		ein.setBounds(180,50,70,30);
		add(ein);
		aus.setBounds(250,50,70,30);
		add(aus);
		
		setzen();
		ein.addMouseListener(ereigniskueche);
		aus.addMouseListener(ereigniskueche);
	}
	
	public void setzen(){
	if (ereigniskueche.check == 1)
	{
		heizungeins.setBounds(215,80,70,70);
		add(heizungeins);
		System.out.println("Heizung ist 1 Methode setzen");
		repaint();
	}
	if (ereigniskueche.check == 0)
	{
		heizungnull.setBounds(215,80,70,70);
		add(heizungnull);
		System.out.println("Heizung ist 0 Methode setzen");
		repaint();
	}
	}
}

Klasse 2 "Wohnen" 

public class Wohnen extends JFrame 
{
	JButton ein = new JButton("EIN");
	JButton aus = new JButton ("AUS");
	
	Ereignis ereigniswohnen = new Ereignis(null, this);
		
	public Wohnen()
	{		
		setLayout(null);
		
		JLabel heizungeins = new JLabel(heizungan);
		JLabel heizungnull = new JLabel(heizungaus);
		 
		ein.setBounds(180,50,70,30);
		add(ein);
		aus.setBounds(250,50,70,30);
		add(aus);
		
		
		ein.addMouseListener(ereigniswohnen);
		aus.addMouseListener(ereigniswohnen);
		
	}
}

und die "Ereignis" Klasse :) 


public class Ereignis extends MouseAdapter {

		
		public Kueche cooking;
		public Wohnen living;
		
		Ereignis (Kueche cooking, Wohnen living)
		{
			this.cooking = cooking;
			this.living = living;
		}
			
		public void mousePressed(MouseEvent e)
		{
			Object source = e.getSource();
		
			if (source == cooking.ein)
			{
				System.out.println("Heizung in Küche ist EIN");
				cooking.setzen();
			}
			if (source == cooking.aus)
			{
				System.out.println("Heizung in Küche ist AUS");
				cooking.setzen();
			}
			
			if (source == living.ein)
			{
				System.out.println("Heizung in Wohnzimmer ist EIN");
			}
		}
}

Der Fehler der mir angezeitgt wird ist in zeile 102
Ich will erstmal nur das er je nach der Quelle "Klasse" wo das ereignis her kommt mir den text ausgibt damit wäre ich schon zufrieden :)

--> Wenn ich die Ereignisverarbeitung aus nur einer Klasse raus mache klappt es <--
dann habe ich natürlich auch nur das ÜbergabeArgument "this" und nicht (this,null)

Wäre schön ne schnelle Antwort zu erhalten :)

Mfg
BecksGOld
 
Zuletzt bearbeitet:

Foermchen82

Top Contributor
Also aus deiner Beschreibung werde ich nicht schlau was du eigentlich versuchst. Poste doch bitte mal einen lauffähigen Code. Der hier ist voller pseudocode.!
 

Marco13

Top Contributor
Erstmal ist die Struktur nicht sooo schön... Es gibt zwar eine Klasse, die sowohl Küche (kitchen) als auch Wohnen behandlen soll, aber wenn die Instanzen dieser Klasse erstellt werden, wird immer nur jeweils eines von beidem übergeben (und das andere ist null). Deswegen kracht's da. Man könnte das jetzt ganz pragmatisch lösen

Code:
if (cooking != null)
{
            if (source == cooking.ein)
            {
                System.out.println("Heizung in Küche ist EIN");
                cooking.setzen();
            }
            if (source == cooking.aus)
            {
                System.out.println("Heizung in Küche ist AUS");
                cooking.setzen();
            }
}

// (Genauso für 'living')
...

Aber wenn dort noch 3 andere Raum-Arten dazukommen wird das ziemlich krampfig...

An einen JButton sollte man übrigens einen ActionListener hängen, und keinen MouseListener. Was das mit dem "check" werden soll ist mir auch nicht ganz klar... Eine Möglichkeit, das zu verallgemeinern wäre vielleicht ein Interface
Code:
interface HeizungOwner
{
    public void setzeHeizungAn(boolean anOderAus);
}
das von Kücke und Wohnen implementiert wird. Dann kann man dem "Ereignis" nurnoch irgendeinen HeinzungOwner (also einmal die Küche und einmal das Wohnen) übergeben, und das "Ereignis" steuert diesen HeizngOwner dann, aber das sollte man sich noch genauer überlegen...
 

Becksgold

Mitglied
Danke erstmal für die Antworten, ich stelle mal den Kompletten Code zur Verfügung :D
allerdings ist das alles wohl net so gut strukturiert :(
Naja man lernt ja immer dazu ;)

Das mit dem Check sollte nur was zum testen werden :)
Im Enddefekt soll das Programm so laufen:
Man startet und bekommt eine Übersicht:
in der 4 Buttons zum auswählen sind, klickt man einen der Buttons an öffnet sich ein neuer Frame in dem dann z.b. Heizung EIN oder AUS gesetzt werden kann, gleichzeitig mit dem klicken soll sich dann das ICON im Frame ändern :)
Alle Ereignisse sollen über die eine Ereignissklasse gesteuert werden und da ist eben mein Problem, das ich iregdnwie immer nur eine Klasse implementieren kann und die anderen Klassen außenvorbleiben weil die Übergabe der ActionHandlers murks ist :) also das was ich da versucht habe :D
Benutze ich nur eine Klasse die die Ereignisklasse aufruf klappt das alles wunderbar, aber sobald ne zweite dazu kommt wie die klasse Kueche gehts nichts mehr weil da wie gesagt was mit den Übergabeparametern nicht läuft

Das Problem an meinen Klassen ist das diese noch lange nicht fertig sind, die sind noch im Entwicklungsstadium, ich wollte ja erstmal nur testen ob die Ereignisklasse unterscheiden kann von welche Klasse das Ereignis ausgeht daher ist mein Quellcode auch nicht komplett.
ich werde das soweit ich es hab mal posten sollten 7 Klassen sein

Java:
"Hauptteil"

import javax.swing.*;

public class Hauptteil {
	public static void main(String[] args) {
		
		JPanel oben = new JPanel();
		JPanel unten = new JPanel ();
		JPanel mitte = new JPanel ();
		
		JFrame f = new Uebersicht();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    f.setSize(550, 750);
	    f.setVisible(true);
	  }
}

"Übersicht" 

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class Uebersicht extends JFrame implements ActionListener {
	
	Wohnen w = new Wohnen();
	Kueche k = new Kueche();
	Schlafen s = new Schlafen();
	Badezimmer b = new Badezimmer();
	
	JTextField t1 = new JTextField("°C");
	JTextField t2 = new JTextField("°C");
	JTextField t3 = new JTextField("°C");
	JTextField t4 = new JTextField("°C");
    JButton b1 = new JButton("Vorgabe Schlafzimmer");
    JButton b2 = new JButton("Vorgabe Küche");
    JButton b3 = new JButton("Vorgabe Wohnzimmer");
    JButton b4 = new JButton("Vorgabe Badezimmer");
    JLabel l1 = new JLabel ("Schlafzimmer",SwingConstants.CENTER);
    JLabel l2 = new JLabel ("Küche",SwingConstants.CENTER);
    JLabel l3 = new JLabel ("Wohnzimmer",SwingConstants.CENTER);
    JLabel l4 = new JLabel ("Badezimmer",SwingConstants.CENTER);
    	
	public Uebersicht() {
		  	  
    JLayeredPane lp = getLayeredPane();
    
    t1.setBounds(25,25,50,20);
    t2.setBounds(25,315,50,20);
    t3.setBounds(445,265,50,20);
    t4.setBounds(445,25,50,20);    
    b1.setBounds(20, 270, 180, 20);
    b2.setBounds(20, 580, 180, 20);
    b3.setBounds(270, 580, 180, 20);
    b4.setBounds(315, 220, 180, 20);    
    l1.setBounds(20, 130, 180, 20);    
    l2.setBounds(20, 430, 180, 20);    
    l3.setBounds(280, 430, 180, 20);   
    l4.setBounds(320, 100, 180, 20);
    
    Zeichnung z = new Zeichnung(); 
    z.setBounds(0, 0, 800, 700);  

	b1.addActionListener(this);
	b2.addActionListener(this);
	b3.addActionListener(this);
	b4.addActionListener(this);
    
    // Anordnung in Ebenen
    lp.add(z, new Integer(1));  
    lp.add(t1, new Integer(2));
    lp.add(t2, new Integer(2));
    lp.add(t3, new Integer(2));
    lp.add(t4, new Integer(2));
    lp.add(b1, new Integer(2));
    lp.add(b2, new Integer(2));
    lp.add(b3, new Integer(2));
    lp.add(b4, new Integer(2));
    lp.add(l1, new Integer(2));
    lp.add(l2, new Integer(2));
    lp.add(l3, new Integer(2));
    lp.add(l4, new Integer(2));
    
    lp.setVisible(true);

    }
	public void actionPerformed(ActionEvent e) {
	Object source = e.getSource();
		if (source == b3)
		{
			 System.out.println("wohnen");	
			 w.popup();
		}
		if (source == b1)
		{
			 System.out.println("wohnen");	
			 s.popup();
			 
		}
		if (source == b4)
		{
			 System.out.println("bad");	
			 b.popup();
		}
		if (source == b2)
		{
			 System.out.println("wohnen");	
			 k.popup();
		}
	}
}

"Zeichnung"

import java.awt.*;
import javax.swing.*;

class Zeichnung extends JPanel{

	protected void paintComponent( Graphics g ) 
	  { 
	    super.paintComponent( g );
	    g.setColor(Color.blue);
	    g.drawRect(10, 10, 500 , 600);	//Grundriss
	    g.drawRect(10, 10, 200, 290);	//Schlafen
	    g.drawRect(300, 10, 210, 240);	//Bad
	    g.drawRect(10, 300, 200, 310);	//Küche
	    g.drawLine(210, 250, 300, 250);
	    g.drawArc(160, 20, 100, 100, 180, 90);	//Tür Schlafen
	    /*Pos. X, Pos. Y, Durchmesser x Kreis, Durchmesser y Kreis, Startwinkel, Endwinkel*/
	    g.drawLine(210, 70, 160, 70);
	    g.drawArc(250, 90, 100, 100, 0, 90);	//Tür Bad
	    g.drawLine(300, 140, 350, 140);
	    g.drawArc(160, 300, 100, 100, 180, 90);	//Tür Küche
	    g.drawLine(160, 350, 210, 350);
	    g.drawArc(235, 200, 100, 100, 180, 90);	//Tür Wohnzimmer
	    g.drawLine(285, 250, 285, 300);
	    g.drawArc(230, -40, 100, 100, 180, 90);	//Tür Wohnung
	    g.drawLine(280, 10, 280, 60);	    
	  } 		
}

"Kueche"

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;


public class Kueche extends JFrame 
{
	JButton ein = new JButton("EIN");
	JButton aus = new JButton ("AUS");
	JTextField aTemp = new JTextField("20°C" , 10);
	Icon heizungan = new ImageIcon("on.png");
	Icon heizungaus = new ImageIcon("off.png");
	JSlider einstellen = new JSlider(15,25,20);
	JLabel header = new JLabel("Küche");
	JLabel heizung = new JLabel("Status der Heizung");
	JLabel tempein = new JLabel("Temperatur einstellen");
	JLabel heizen = new JLabel("Heizung");
	JLabel temp = new JLabel("Aktuelle Temperatur");
	
	JLabel heizungeins = new JLabel(heizungan);
	JLabel heizungnull = new JLabel(heizungaus);
	
	Ereignis ereigniskueche = new Ereignis(this, null);

	public void popup()
	{		
		JFrame b = new Kueche();
		b.setBounds(400,100,350,290);
		b.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		b.setVisible(true);
	}
	
	public Kueche()
	{			
		setLayout(null);
				 
		header.setFont(new Font("Times New Roman", Font.BOLD,24));
		aTemp.setFont(new Font("Times New Roman", Font.BOLD,24));
		heizen.setFont(new Font("Times New Roman", Font.BOLD,16));
		heizung.setFont(new Font("Times New Roman", Font.BOLD,16));
		tempein.setFont(new Font("Times New Roman", Font.BOLD,16));
		temp.setFont(new Font("Times New Roman", Font.BOLD,16));
		
		einstellen.setMinorTickSpacing(5);
		einstellen.setMajorTickSpacing(2);
		einstellen.setPaintLabels(true);
		einstellen.setPaintTicks(true);
		
		header.setBounds(140,5,150,30);
		add(header);
		heizen.setBounds(10,50,150,30);
		add(heizen);
		heizung.setBounds(10,100,150,30);
		add(heizung);
		tempein.setBounds(10,150,150,30);
		add(tempein);
		temp.setBounds(10,200,150,30);
		add(temp);
		ein.setBounds(180,50,70,30);
		add(ein);
		aus.setBounds(250,50,70,30);
		add(aus);
		einstellen.setBounds(180,150,140,50);
		add(einstellen);
		aTemp.setBounds(180,200,140,30);
		add(aTemp);
		
		setzen();
		
		ein.addMouseListener(ereigniskueche);
		aus.addMouseListener(ereigniskueche);
	}
	
	public void setzen(){
	if (ereigniskueche.check == 1)
	{
		heizungeins.setBounds(215,80,70,70);
		add(heizungeins);
		System.out.println("Heizung ist 1 Methode setzen");
		repaint();
	}
	if (ereigniskueche.check == 0)
	{
		heizungnull.setBounds(215,80,70,70);
		add(heizungnull);
		System.out.println("Heizung ist 0 Methode setzen");
		repaint();
	}
	}
	
}

"Wohnen"

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class Wohnen extends JFrame 
{
	JButton ein = new JButton("EIN");
	JButton aus = new JButton ("AUS");
	JTextField aTemp = new JTextField("20°C" , 10);
	Icon heizungan = new ImageIcon("on.png");
	Icon heizungaus = new ImageIcon("off.png");
	JSlider einstellen = new JSlider(15,25,20);
	JLabel header = new JLabel("Wohnzimmer");
	JLabel heizung = new JLabel("Status der Heizung");
	JLabel tempein = new JLabel("Temperatur einstellen");
	JLabel heizen = new JLabel("Heizung");
	JLabel temp = new JLabel("Aktuelle Temperatur");
	
	Ereignis ereigniswohnen = new Ereignis(null, this);
	
	public void popup()
	{		
		JFrame b = new Wohnen();
		b.setBounds(400,100,350,290);
		b.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		b.setVisible(true);
	}
	
	public Wohnen()
	{		
		setLayout(null);
		
		JLabel heizungeins = new JLabel(heizungan);
		JLabel heizungnull = new JLabel(heizungaus);
		 
		header.setFont(new Font("Times New Roman", Font.BOLD,24));
		aTemp.setFont(new Font("Times New Roman", Font.BOLD,24));
		heizen.setFont(new Font("Times New Roman", Font.BOLD,16));
		heizung.setFont(new Font("Times New Roman", Font.BOLD,16));
		tempein.setFont(new Font("Times New Roman", Font.BOLD,16));
		temp.setFont(new Font("Times New Roman", Font.BOLD,16));
		
		einstellen.setMinorTickSpacing(5);
		einstellen.setMajorTickSpacing(2);
		einstellen.setPaintLabels(true);
		einstellen.setPaintTicks(true);
		
		header.setBounds(100,5,150,30);
		add(header);
		heizen.setBounds(10,50,150,30);
		add(heizen);
		heizung.setBounds(10,100,150,30);
		add(heizung);
		tempein.setBounds(10,150,150,30);
		add(tempein);
		temp.setBounds(10,200,150,30);
		add(temp);
		ein.setBounds(180,50,70,30);
		add(ein);
		aus.setBounds(250,50,70,30);
		add(aus);
		heizungeins.setBounds(215,80,70,70);
		add(heizungeins);
		einstellen.setBounds(180,150,140,50);
		add(einstellen);
		aTemp.setBounds(180,200,140,30);
		add(aTemp);
		
		ein.addMouseListener(ereigniswohnen);
		aus.addMouseListener(ereigniswohnen);
		
	}
}
	
"Schlafen"

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class Schlafen extends JFrame  
{
	JButton ein = new JButton("EIN");
	JButton aus = new JButton ("AUS");
	JTextField aTemp = new JTextField("20°C" , 10);
	Icon heizungan = new ImageIcon("on.png");
	Icon heizungaus = new ImageIcon("off.png");
	JSlider einstellen = new JSlider(15,25,20);
	JLabel header = new JLabel("Schlafzimmer");
	JLabel heizung = new JLabel("Status der Heizung");
	JLabel tempein = new JLabel("Temperatur einstellen");
	JLabel heizen = new JLabel("Heizung");
	JLabel temp = new JLabel("Aktuelle Temperatur");
	
	public void popup()
	{		
		JFrame b = new Schlafen();
		b.setBounds(400,100,350,290);
		b.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		b.setVisible(true);
	}
	
	public Schlafen()
	{		
		setLayout(null);
		
		JLabel heizungeins = new JLabel(heizungan);
		JLabel heizungnull = new JLabel(heizungaus);
		 
		header.setFont(new Font("Times New Roman", Font.BOLD,24));
		aTemp.setFont(new Font("Times New Roman", Font.BOLD,24));
		heizen.setFont(new Font("Times New Roman", Font.BOLD,16));
		heizung.setFont(new Font("Times New Roman", Font.BOLD,16));
		tempein.setFont(new Font("Times New Roman", Font.BOLD,16));
		temp.setFont(new Font("Times New Roman", Font.BOLD,16));
		
		einstellen.setMinorTickSpacing(5);
		einstellen.setMajorTickSpacing(2);
		einstellen.setPaintLabels(true);
		einstellen.setPaintTicks(true);
		
		header.setBounds(100,5,150,30);
		add(header);
		heizen.setBounds(10,50,150,30);
		add(heizen);
		heizung.setBounds(10,100,150,30);
		add(heizung);
		tempein.setBounds(10,150,150,30);
		add(tempein);
		temp.setBounds(10,200,150,30);
		add(temp);
		ein.setBounds(180,50,70,30);
		add(ein);
		aus.setBounds(250,50,70,30);
		add(aus);
		heizungeins.setBounds(215,80,70,70);
		add(heizungeins);
		einstellen.setBounds(180,150,140,50);
		add(einstellen);
		aTemp.setBounds(180,200,140,30);
		add(aTemp);
		
	}
}

"Badezimmer"

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class Badezimmer extends JFrame 
{
		
	JButton ein = new JButton("EIN");
	JButton aus = new JButton ("AUS");
	JTextField aTemp = new JTextField("20°C" , 10);
	Icon heizungan = new ImageIcon("on.png");
	Icon heizungaus = new ImageIcon("off.png");
	JSlider einstellen = new JSlider(15,25,20);
	JLabel header = new JLabel("Badezimmer");
	JLabel heizung = new JLabel("Status der Heizung");
	JLabel tempein = new JLabel("Temperatur einstellen");
	JLabel heizen = new JLabel("Heizung");
	JLabel temp = new JLabel("Aktuelle Temperatur");
	JLabel heizungeins = new JLabel(heizungan);
	JLabel heizungnull = new JLabel(heizungaus);
	
	
	public void popup()
	{		
		JFrame b = new Badezimmer();
		b.setBounds(400,100,350,290);
		b.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
		b.setVisible(true);
	}
	
	public Badezimmer()
	{		
		setLayout(null);
		
		JLabel heizungeins = new JLabel(heizungan);
		JLabel heizungnull = new JLabel(heizungaus);
		 
		header.setFont(new Font("Times New Roman", Font.BOLD,24));
		aTemp.setFont(new Font("Times New Roman", Font.BOLD,24));
		heizen.setFont(new Font("Times New Roman", Font.BOLD,16));
		heizung.setFont(new Font("Times New Roman", Font.BOLD,16));
		tempein.setFont(new Font("Times New Roman", Font.BOLD,16));
		temp.setFont(new Font("Times New Roman", Font.BOLD,16));
		
		einstellen.setMinorTickSpacing(5);
		einstellen.setMajorTickSpacing(2);
		einstellen.setPaintLabels(true);
		einstellen.setPaintTicks(true);
		
		header.setBounds(100,5,150,30);
		add(header);
		heizen.setBounds(10,50,150,30);
		add(heizen);
		heizung.setBounds(10,100,150,30);
		add(heizung);
		tempein.setBounds(10,150,150,30);
		add(tempein);
		temp.setBounds(10,200,150,30);
		add(temp);
		ein.setBounds(180,50,70,30);
		add(ein);
		aus.setBounds(250,50,70,30);
		add(aus);
		heizungeins.setBounds(215,80,70,70);
		add(heizungeins);
		einstellen.setBounds(180,150,140,50);
		add(einstellen);
		aTemp.setBounds(180,200,140,30);
		add(aTemp);
		
		
			
	}
	
	
}
	
"Ereigniss"

import javax.swing.*;

import java.awt.event.*;
import java.awt.*;

public class Ereignis extends MouseAdapter {

		
		public Kueche cooking;
		public Wohnen living;
			
		Ereignis (Kueche cooking, Wohnen living)
		{
			this.cooking = cooking;
			this.living = living;
		}
			
		public void mousePressed(MouseEvent e)
		{
			Object source = e.getSource();
	
			if (source == cooking.ein)
			{
				System.out.println("Heizung in Küche ist EIN");
			        cooking.setzen();
			}
			if (source == cooking.aus)
			{
				System.out.println("Heizung in Küche ist AUS");
				cooking.setzen();
			}
			
			if (source == living.ein)
			{
				System.out.println("Heizung in Wohnzimmer ist EIN");
				//living.setzen();
			}
		}
}


Ich hoffe es ist alles soweit dabei und wird verstanden ;)
Wie gesagt --> Anfänger :(

MFG BecksGold
 

Becksgold

Mitglied
@ Marco13

deine Lösung mit der Bedingung
Java:
if (cooking != null)
{.....}

klappt :)
ist zwar nicht die schönste aber immerhin ein erfolg :)
DANKE schonmal dafür
vielleicht hat ja nochjemand einen Verbesserungsvorschlag?!? :)
schön ist das was ich da gemacht habe ja leider net so :(

MFG BecksGold
 

Foermchen82

Top Contributor
Marco13 hat schon eine prima Lösung geschrieben.

Du nimmst ein Iterface
[Java]
interface EinAusInterface
{
public JButton getEin();//gibt den aus-button zurück
public JButton getAus(); //gibt den ein-button zurück
}
[/code]

Deine Räume müssen das dann implementieren.

das Ereignis sieht dann so aus:
Java:
public int check = 0;
        public EinAusInterface raum;
            
        Ereignis (EinAusInterface raum)
        {
            this.raum= raum;
        }
            
        public void mousePressed(MouseEvent e)
        {
            Object source = e.getSource();
    
            if (source == raum.ein)
            {
                System.out.println("Heizung ist EIN");
            }
            if (source == raum.aus)
            {
                System.out.println("Heizung ist AUS");
            }
        }

probiers mal
 

Marco13

Top Contributor
Hui... nee :noe: naja, das Interface bezug sich eigentlich eher auf das "Datenmodell". Also auf "irgendwas, wo man die Heizung ein und ausschalten kann". Für das GUI macht das IMHO nicht viel Sinn: Stell dir vor, das sieht irgendwann ein Benutzer (so ein richtiger DAU). Und der sagt dann: "Öhhh, zwo Buttons sind voll plöt, ich will so einen den man so an- und aus machen kann". (Dann meint er vermutlich einen JToggleButton ;) ). Dann muss man das GUI ändern, und das Interface, und die Ereignisbehandlungsklasse... Und dann zeigt man ihm das, und er sagt: "Öhh, nee, ich meinte so ein Ding wo man ein Häckchen setzen kann" (also eine JCheckBox :rolleyes: ). Wieder GUI, Interface und Ereignisding ändern.... (dann sagt er, dass da ja ein Kreuzchen in der CheckBox ist, und er lieber ein Häckchen haben will, und dann hält man ein Schild hoch, wo "Screw you" draufsteht, aber das hat dann nur noch sehr indirekt Einfluß auf das, was man danach machen muss :D )... Also kurz: So ein Interface für's GUI bringt IMHO selten bis nie einen Vorteil (und wenn, dann sollte man sich seiner Sache schon SEHR sicher sein...)

Wie die "beste" Lösung in diesem Fall aussehen würde, ist schwer zu sagen. Ich würde ja - statt einer einzigen, großen, unspezifischen "Ereignisbehandlungsklasse" lieber kleine, praktische anonyme Listener verwenden (und zwar ActionListener... keine MouseListener), aber die Details hängen von vielen Faktoren ab, die man jetzt abklopfen müßte, und den bisherigen Posts nach ist diese große, undpezifische Klasse ja gerade das, was (warum auch immer) "gewünscht" ist........
 

Foermchen82

Top Contributor
ich wollte ihm nur eine Lösung stricken, die "nahe" an seinem Design ist.

Prinzipiell muss die ganze Architektur überdacht werden. und schon gar nicht sollte man mit MouseListenern auf Buttons lauschen. Dafür gibts die action-Listener
 

Becksgold

Mitglied
@ Marco13

Also das eine große unspezifische Klasse gewünscht ist kann man net so sagen :D
ich wollte einfach mal testen ob das alles so klappt wie ich mir das vorgestellt habe :)
um nicht für jede einzelne Klasse eine innere annonyme klasse zu haben dachte ich mir ich pack einfach alles in eine, scheinbar war das wohl nicht die beste idee :D

ich denke ich werde das jetzt erstmal so umsetzen mit nur einer Klasse und mal schauen wie weit ich komme und wie "übersichtlich" das dann alles noch ist....
sicherlich wäre es einfach ne innere Klasse zu nehmen wie ich das auch in der Klasse "Uebersicht" gemacht habe aber an sich wollte ich mal schauen wie das auch ner externen Funktioniert!
schließlich will ich dabei ja auch selber was lernen :)
und ner wagt der gewinnt ;)

an sich ist es und auch erstmal Freigestellt was wir machen, Hauptsache es funktioniert nachher und es ist einigermaßen verständlich, den rest.... "Feinheiten :D" kann man dann immernoch ändern
obwohl es für den Anfang wohl einfach wäre das zu machen was man kann :D und später wenn alles läuft ne neue Version aufzusetzen um dann zu sehen was man verbessern oder vielleicht schöner "übersichtlicher" machen kann
naja so habe ich mir wohl den "schwereren" weg zuerst gewählt :D

soweit schonmal Danke, und naja das mit dem Interface habe ich zwar noch net so ganz verstanden aber vielleicht setze ich das auch mal um :) man muss sich ja auch weiter entwickeln ;)

MFG BecksGold
 

Marco13

Top Contributor
Den Codeteil mit der "Übersicht"-Klasse hatte ich noch nicht angesehen, aber jetzt... erwähne ich mal, dass diese Klasse ihren Namen nicht zu Recht trägt :autsch: ;)

Insgesamt gibt es da einiges zu verbessern, in vieler Hinsicht.

Es bietet sich an, in Englisch zu Programmieren. Ist natürlich nicht notwendig, aber ich finde, sowas wie z.B.
setGröße
sieht blöd aus, und Umlaute sind so eine Sache.... Ist aber für dich im Moment vielleicht erstmal nicht so wichtig.

Ganz grundlegend: Über die Frage, wie man rein technisch so einen Grundriss am besten modelliert könnte man sich sehr lange Gedanken machen. Ich gehe jetzt mal davon aus, dass die Grundriß-Daten (also die Formen der Räume, Orte der Türen usw) irgendwie gespeichert und mit den Räumen in Verbindung gebracht werden können. (D.h. sie könnten direkt in den Räumen gespeichert werden, oder in einer Map).

Zum GUI an sich: Du solltest dir mal ansehen, wie man LayoutManager verwendet: Using Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container) - Das 'null'-Layout und etliche "setBounds"-Aufrufe sind sehr unschön....

Meine "Kristallkugel-Vision", dass es dort auch noch andere Raum-Arten geben würde außer Küche und Wohnen hat sich ja dann schon bewahrheitet ;) Das ist aber ein wichtiger Punkt, über den du dir Gedanken machen solltest: Wie kann man sowas allgemeiner und im Idealfall vielleicht trotzdem übersichtlicher machen? Stell dir vor, du wolltest jetzt einen weiteren Raum hinzufügen - was du dann alles ändern müßtest... Oder es soll irgendein Grundriss verändert werden (eine Wand ein bißchen verschoben, eine Tür "offen" gezeichnet...).

Und eine vermeintliche KLeinigkeit, die damit zusammenhängt: Solche Variablennamen wie 'w' und 'b1' sehen im ersten Moment vielleicht praktisch aus, aber Variablennamen sollten sprechend sein - d.h. man sollte ihnen ansehen, was sie sind:
temperaturTextField
heizungAnButton
vorgabeButton
...
So eine Nummerierung von Variablennamen 'b1', 'b2'... ist sehr unflexibel. Das geht so weit, dass manche Leute die (formal falsche, aber doch passende) Aussage postulieren: Die Zahl 2 existiert nicht! ;) Das soll heißen, dass man von einer Objektart entweder EIN Objekt hat, oder beliebig viele, aber fast nie genau ZWEI. Und wenn man beliebig viele Objekte haben kann (also die Nummerierung über die '1' (!) hinausgeht) sollte man sich überlegen, wie man das besser machen könnte.

Nur ein (uncompilierbares, nur zur Verdeutlichung dienendes) Beispiel, wie die Übersicht-Klasse und die Zeichung-Klasse bei geeigneter Ausimplementierung vielleicht aussehen könnten:
Java:
class Übersicht
{
    private List<Raum> räume = new ArrayList();
    private Zeichnung zeichnung  = new Zeichnung();
    
    public Übersicht()
    {
        räume.add(new Wohnen());
        räume.add(new Kueche());
        räume.add(new Schlafen());
        räume.add(new Badezimmer());
        // räume.add(new Lagerraum()); // Hinzufügen eines neuen Raumes mit EINER Zeile!

        initGUI();
    }

    private void initGUI()
    {
        getContentPane().setLayout(new BorderLayout());

        for (Raum raum : räume)
        {
             zeichnung.addGrundriss(grundrissFür(raum)); // Wie auch immer man an den Grundriss kommt...
        }

        getContentPane().add(zeichnung, BorderLayout.CENTER);

        JPanel controlPanel = new JPanel(new GridLayout(0,1));
        for (Raum raum : räume)
        {
            JPanel raumPanel = erzeugeRaumPanel(raum);
            controlPanel.add(raumPanel);
        }
        getContentPane().add(controlPanel, BorderLayout.EAST);
    }

    private JPanel erzeugeRaumPanel(final Raum raum)
    {
        // Erzeuge ein JPanel mit TextField, JButton und Label für den Raum...
        ....
        // Anonymer ActionListener für jeden Button:
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            { 
                raum.popup();
            }
        });
        ...
        return panel;
    }
}
 
class Zeichnung extends JPanel
{
    private List<Grundriss> grundrisse = new ArrayList<Grundriss>();

    public void addGrundriss(Grundriss grundriss)
    {
        grundrisse.add(grundriss);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for (Grundriss grundriss : grundrisse)
        {
            grundriss.zeichneAuf(g);
        }
    }
}


Darüber hinaus... eben die Einstellungsfenster und so ... kannst dir ja mal was überlegen... ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Best Practice Tabulatoren verschiedener Länge ersetzen Java Basics - Anfänger-Themen 8
S Array erzeugen mit verschiedener Verteilung Java Basics - Anfänger-Themen 11
H Anzahl verschiedener Buchstaben im String Java Basics - Anfänger-Themen 41
F Interaktion von Objekten verschiedener Klassen... Java Basics - Anfänger-Themen 13
D Liste verschiedener konkreter Klassen möglich? Java Basics - Anfänger-Themen 2
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4
E Array Anzahl verschiedener Werte ausgeben Java Basics - Anfänger-Themen 3
P Windows vs. Ubuntu verschiedener Output Java Basics - Anfänger-Themen 31
L Vererbung - Wie Objekte verschiedener Klassen unterscheiden Java Basics - Anfänger-Themen 3
J OOP Ausgabe verschiedener Variabeln aus verschiedenen Subclasses Java Basics - Anfänger-Themen 2
N Folge verschiedener Nährwerte zur Kubikwurzel Java Basics - Anfänger-Themen 15
4 OOP Problem beim Speichern verschiedener Klassen in verschiedenen Dateien Java Basics - Anfänger-Themen 25
T Collection von Objekten verschiedener Klassen Java Basics - Anfänger-Themen 4
G Listenartige Speicherung verschiedener Objekte Java Basics - Anfänger-Themen 5
T Rückgabewerte verschiedener Typen Java Basics - Anfänger-Themen 3
N Vergleich zweier Elemente verschiedener Vectoren Java Basics - Anfänger-Themen 2
S Zugriffsdeklinationen verschiedener Klassen? Java Basics - Anfänger-Themen 3
V Threads verschiedener Klassen synchronisieren Java Basics - Anfänger-Themen 5
G Installation verschiedener JREs Java Basics - Anfänger-Themen 3
W Berechnung verschiedener Eigenschaften von Geraden Java Basics - Anfänger-Themen 4
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
Detlef Bosau Nachladen von Klassen zur Laufzeit Java Basics - Anfänger-Themen 24
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
MoxMorris Einige Methoden aus verschiedenen Klassen nacheinander auszuführen läuft seltsam Java Basics - Anfänger-Themen 2
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
I 2 verschiedene Klassen mit gleichen Property vergleichen Java Basics - Anfänger-Themen 13
C Array von Klassen Java Basics - Anfänger-Themen 2
monsterherz 2 Klassen daher Probs mit dem Dateinamen Java Basics - Anfänger-Themen 9
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 9
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
S IntelliJ geht alle Klassen durch Java Basics - Anfänger-Themen 9
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
N Klassen Methoden anderer Klassen aufrufen Java Basics - Anfänger-Themen 4
D Klassen Klassen Kommunikation Java Basics - Anfänger-Themen 12
Encera Auf Objekte aus anderer Klassen zugreifen Java Basics - Anfänger-Themen 20
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
M Andere Methoden in anderen Klassen aufrufen Java Basics - Anfänger-Themen 11
L Methoden in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
D Klassen und Vererbung Java Basics - Anfänger-Themen 2
L Best Practice Annotierte Klassen im Classpath herausfinden Java Basics - Anfänger-Themen 1
P Mit dem Scanner Klassen aufrufen Java Basics - Anfänger-Themen 3
O Klassen Zusammenspiel zwischen 2 Klassen Java Basics - Anfänger-Themen 1
K Zweite Ausgabe von vererbten Klassen Java Basics - Anfänger-Themen 3
M Wie können Klassen nicht-materialisierte Attribute haben, die nur über get/ set-Mehoden simuliert sind? Java Basics - Anfänger-Themen 6
Speedrunner klassen aufrufen Java Basics - Anfänger-Themen 41
M Log4J (v2) nachträglich in allen Klassen hinzufügen Java Basics - Anfänger-Themen 9
D importieren eigener Klassen Java Basics - Anfänger-Themen 12
W Wo ist der Wurm in meinem Grundverständnis von Klassen? Java Basics - Anfänger-Themen 22
S Daten/Klassen/Packages richtig updaten!? Java Basics - Anfänger-Themen 2
alice98 Erste Schritte Liste erstellen ohne vorgefertigte Klassen Java Basics - Anfänger-Themen 1
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
elsaaaaaa Wochentag als String ausgeben mit JDK Klassen Java Basics - Anfänger-Themen 6
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
B Inventar als einzelne Klassen anlegen? Java Basics - Anfänger-Themen 12
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
C Kommunikation zwischen 2 Klassen Java Basics - Anfänger-Themen 3
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
S Klassen instanziieren und verwenden von Getter und Setter Java Basics - Anfänger-Themen 4
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
C Fernseher-Aufgabe (Methoden, Klassen und Objekte) Java Basics - Anfänger-Themen 63
H Methoden in großen Klassen gruppieren oder auslagern? Java Basics - Anfänger-Themen 10
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
Y Klassen Klassen und Objekte Java Basics - Anfänger-Themen 3
Y Klassen Klassen und Objekte mit set und get Java Basics - Anfänger-Themen 0
A Generischen Klassen Java Basics - Anfänger-Themen 8
A Vererbung Klassen im Bezug auf Auto´s Java Basics - Anfänger-Themen 18
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
A Klassen Vererbung und zusätzliche Unterklassen Java Basics - Anfänger-Themen 23
J 2 klassen benutzen Java Basics - Anfänger-Themen 5
A Klassen und methoden Java Basics - Anfänger-Themen 15
A Bankweverwaltung mit Klassen und Methoden Java Basics - Anfänger-Themen 14
J Klassen Problem Java Basics - Anfänger-Themen 8
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
I Klassen als Datentyp nutzen? Java Basics - Anfänger-Themen 11
M Aufsplitten von Methoden in andere Klassen Java Basics - Anfänger-Themen 2
M (Sehr großes Problem) Listen als static in anderen Klassen verwendet Java Basics - Anfänger-Themen 12
C Klassen objektorientiert aufteilen Java Basics - Anfänger-Themen 6
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
A Auf Eigenschaften von Objekten anderer Klassen zugreifen Java Basics - Anfänger-Themen 5
F Klassen und Pakete Projektübergreifend (Eclipse) Java Basics - Anfänger-Themen 6
V_Fynn03 Klassen Überweisungen tätigen und einzahlen mit 2 Klassen Java Basics - Anfänger-Themen 1
W Abarbeitungsreihenfolge Anonyme Klassen Java Basics - Anfänger-Themen 2
V_Fynn03 Bruchrechner programmieren (2 Klassen) Java Basics - Anfänger-Themen 9
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
J Problem mit Array: 2 Klassen Java Basics - Anfänger-Themen 2
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
E Klassen implementieren Java Basics - Anfänger-Themen 94
T Interfaces in erbenden Klassen Java Basics - Anfänger-Themen 2
C Methoden/Klassen Übergabewerte Java Basics - Anfänger-Themen 8
C Java Klassen/Methoden/Übergabeparameter Java Basics - Anfänger-Themen 4
L Wie geht man bei mehreren Action Klassen vor? Java Basics - Anfänger-Themen 0
P Datentypen, Klassen, Operatoren, Wrapperklassen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben