Zugriffsproblem - Funktion von Grafik trennen

  • Themenstarter Themenstarter Firephoenix
  • Beginndatum Beginndatum
F

Firephoenix

Gast
viel gesucht und in meinem Buch geblättert und ich komme nicht auf meinen Fehler ;(

Eine Java-Datei, 2 Klassen:

Fenster erzeugt ein einfaches Fenster mit 2 Buttons, Fenster_Aktionen soll nun die Funktionalität der Buttons steuern, dazu habe ich den auskommentierten Teil in die Klasse überschrieben und die Action listener der Buttons angepasst.
Das Problem ist jetzt (wie ich vermute): Die Klasse Fenster_Aktionen erlaubt den Zugriff auf Window.setBackground nicht... zumindest nicht über die Buttons.

Das Problem sind Zeile 69 und 75

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;

public class Fenster
extends Frame
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Fenster_Aktionen F_A = new Fenster_Aktionen();
		Fenster Window = new Fenster(F_A);
		
		Window.setVisible(true);
	}

	public Fenster(ActionListener F_A)
	{
		super("Aufzug");
		addWindowListener(new WindowClosingAdapter(true));
		setBackground(Color.ORANGE);
		setSize(500,600);
		setLayout(null);
			Button B0 =new Button("Erdgeschoss");
			B0.setBounds(50, 60, 100, 30);
			B0.addActionListener(F_A);
			add(B0);		
			
			Button B1 =new Button("Stockwerk 1");
			B1.setBounds(50, 120, 100, 30);
			B1.addActionListener(F_A);
			add(B1);

		
	}
	/*
	public void actionPerformed(ActionEvent event)
	{
		String cmd = event.getActionCommand();
		if (cmd.equals("Erdgeschoss"))
			setBackground(Color.BLACK);
			else
			{
				//nichts
			}
		if (cmd.equals("Stockwerk 1"))
			setBackground(Color.GREEN);
			else
			{
				//nichts
			}
	}
	*/
	
}

class Fenster_Aktionen
implements ActionListener
{
	public void actionPerformed(ActionEvent event)
	{
		String cmd = event.getActionCommand();
		if (cmd.equals("Erdgeschoss"))
			Window.setBackground(Color.BLACK);
			else
			{
				//nichts
			}
		if (cmd.equals("Stockwerk 1"))
			Window.setBackground(Color.GREEN);
			else
			{
				//nichts
			}
	}
}

Hättet ihr einen Vorschlag wie ich es schaffe Manipulationen im Fenster der 1. Klasse mit der 2. Klasse vorzunehmen, die die Events der Buttons aus Klasse 1 abfängt?
Bin seit über ner Stunde auf der Suche nach ner Lösung und komme nicht weiter, der Rest vom Programm steht schon (war ne alte eigene Übung), nur da ich gerade an Grafikübungen bin würde ich es gerne auf eine Oberfläche übertragen. Und ohne eine GUI die ich ordentlich aufbauen und manipulieren kann geht das leider nicht, dazu fehlt mir aber die Erfahrung.

Danke für Hilfe/Antworten

Lg,
Firephoenix
 
Code:
class Fenster_Aktionen 
{
    private Fenster fenster;

    public void setFenster(Fenster fenster)
    {
        this.fenster = fenster;
    }

    // In der actionPerformed einfach fenster.setBackground oder so...

}

// In der main:
Fenster_Aktionen F_A = new Fenster_Aktionen();
Fenster Window = new Fenster(F_A);
[b]F_A.setFenster(Window);[/b]



Naming conventions beachten: Klassennamen ohne Unterstrich (FensterAktionen), Variablennamen klein ('window', oder besser 'fenster' - denn es ist ja ein Fenster, und kein Window).
 
Danke, funktioniert, war einfach zu doof das als Ding über eine set in die andere Klasse zu schieben 😀

das mit den Namensregeln habe ich auch soweit überarbeitet

fertiger Code:

Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics;

public class Fenster
extends Frame
{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FensterAktionen fa = new FensterAktionen();
		Fenster window = new Fenster(fa);
		fa.setFenster(window);
		
		window.setVisible(true);
	}

	public Fenster(ActionListener F_A)
	{
		super("Aufzug");
		addWindowListener(new WindowClosingAdapter(true));
		setBackground(Color.ORANGE);
		setSize(500,600);
		setLayout(null);
			Button B0 =new Button("Erdgeschoss");
			B0.setBounds(50, 60, 100, 30);
			B0.addActionListener(F_A);
			add(B0);		
			
			Button B1 =new Button("Stockwerk 1");
			B1.setBounds(50, 120, 100, 30);
			B1.addActionListener(F_A);
			add(B1);

		
	}

	
}

class FensterAktionen
implements ActionListener
{
	private Fenster fenster;
	
	public void setFenster(Fenster fenster)
	{
		this.fenster = fenster;
	}
	
	
	public void actionPerformed(ActionEvent event)
	{
		String cmd = event.getActionCommand();
		if (cmd.equals("Erdgeschoss"))
			fenster.setBackground(Color.BLACK);
			else
			{
				//nichts
			}
		if (cmd.equals("Stockwerk 1"))
			fenster.setBackground(Color.GREEN);
			else
			{
				//nichts
			}
	}
}

Lg,
Firephoenix
 
Das war jetzt die Schnellschuss-Lösung. Ob das ganze strukturell so sinnvoll ist, sei mal dahingestellt. Es kann schnell chaotisch werden, wenn man "alle" Button-Aktionen mit EINEM ActionListener machen will. Eine (ungestestete, nur anskizzierte) Alternative mit anonymen Listenern:
Java:
public class Fenster extends Frame
{
    public static void main(String[] args) 
    {
        Fenster window = new Fenster();
        window.setVisible(true);
    }
 
    public Fenster()
    {
        super("Aufzug");
        addWindowListener(new WindowClosingAdapter(true));
        setBackground(Color.ORANGE);
        setSize(500,600);
        setLayout(null);

            Button B0 =new Button("Erdgeschoss");
            B0.setBounds(50, 60, 100, 30);
            B0.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    setBackground(Color.BLACK);
                }
            });
            add(B0);        
            
            Button B1 =new Button("Stockwerk 1");
            B1.setBounds(50, 120, 100, 30);
            B1.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent e)
                {
                    setBackground(Color.GREEN);
                }
            });
            add(B1);
 
        
    }
 
    
}

Bei mehr Stockwerken würde man es aber ggf. auch anders machen....

Und btw: Sowas wie
Code:
else
{
    // Nichts
}
ist IMHO ziemlich sinnlos 😉
 
Das mit dem Else mit nichts ist so ne Angewohnheit von mir, hab immer Probleme wenn ich das Else komplett vergesse, daher setze ich immer ein leeres Else - einfach für meine Übersicht.

Wie würdest du das mit den Stockwerken denn anders machen?
Einzige "elegantere" Methode die mir selbst einfällt, wäre die Verwendung einer Schleife zum erzeugen, bzw bei der If-Abfrage eine Case Anweisung (wird auf 5 Buttons ausgeweitet)

Edit: mehrere Actionlistener werde ich zwar mal antesten (danke für den Vorschlag), mein Programm kann später aber schon mit einem aufgebaut werden, da die Buttons nicht mehr machen werden, als in einer Klasse aufzug eine Setmethode mit einem Wert zu übergeben, erschwert also in meinem Fall die Übersicht nicht.

Lg,
Firephoenix
 
Zuletzt bearbeitet von einem Moderator:
Wie man das konkret macht, hängt davon ab, was man am Ende erreichen will 😉 Du kannst dir mal http://www.java-forum.org/bilder-gui-damit-zusammenhaengt/49255-componenten-listener.html ansehen, aber man könnte das grundsätzlich so machen, dass man irgendwann nur noch ein paar Methodenaufrufe hat wie
Code:
somePanel.add(createButton("Keller", Color.BLACK));
somePanel.add(createButton("Erdgeschoss", Color.RED));
somePanel.add(createButton("Erster", Color.GREEN));
somePanel.add(createButton("Zwoter", Color.BLUE));
somePanel.add(createButton("Dritter", Color.YELLOW));
somePanel.add(createButton("Dach", Color.WHITE));
Die createButton-Methode würde dann einen Button mit der gegebenen Aufschrift erstellen, mit einem anonymen ActionListener dran, der die gegebene Farbe setzt...

Wenn das allgemeiner werden soll (eine allgemeine Modellierung eines Hauses mit beliebig vielen Stockwerken und Farben) dann würde man sich erstmal ein vernünftiges Datenmodell überlegen.

Ist aber nur EINE Möglichkeit, ob das für dich passend wäre, musst du selbst entscheiden...
 
muss erstmal schauen, inwieweit das auf mein fertiges Programm passt, da die Änderung der Hintergrundfarbe einfach nur ein test war um zu testen ob der Button auch etwas macht.

Ich werd die Tage auf alle Fälle aber das Tool fertig schreiben und dann hier reinstellen, stehe im Moment aber noch vor einem anderem Problem, das kriege ich aber selbst gelöst denke ich.

Lg,
Firephoenix
 

Zurück
Oben