# MouseAdapter - auf Funktionen zugreifen



## Marco7757 (2. Feb 2010)

Wie kann ich in einem MouseAdapter auf Methoden der übergeordneten Klasse oder auf Klassenvariabeln zugreifen?


----------



## Michael... (2. Feb 2010)

Marco7757 hat gesagt.:


> Wie kann ich in einem MouseAdapter auf Methoden der übergeordneten Klasse oder auf Klassenvariabeln zugreifen?



Was heisst hier übergeordnet?
Ist der MouseAdapter eine anonyme innere Klasse, dann kann man darin auf alle Methoden und alle globalen Variablen der Klasse zu greifen.
Handelt es sich dabei um eine eigenständige Klasse, dann benötigt er eine Referenz auf ein Objekt der Klasse.

Vielleicht macht ein Codeausschnitt Deine Frage deutlicher.


----------



## SlaterB (2. Feb 2010)

bei überschreibenen Methoden gibts noch den Trick,
super.methodename(parameter);
aufzurufen, um dort ranzukommen,

MouseAdapter für sich ist aber ein schlechtes Beispiel, hat der doch schließlich nur leere Methoden und keine Klassenvariablen


----------



## Marco13 (2. Feb 2010)

Mein Kristallkugel sagt, dass es auch das hier sein könnte...:

```
class SomeClass
{
    private int something = 123;

    void method()
    {
        MouseAdapter a = new MouseAdapter()
        {
            public void mouseMoved(MouseEvent e)
            {
                [b]SomeClass.this[/b].something = 234; // <----------- 
            }
        };
    }
}
```


----------



## Marco7757 (2. Feb 2010)

Tut mir leid, dass ich den Codeausschnitt vergessen habe. Also das Ganze sieht so aus:


```
panel.addMouseListener(new MouseAdapter() {

			@Override
			public void mouseClicked(MouseEvent arg0) {
				// TODO Auto-generated method stub
				panel.setBackground(Color.lightGray);
			}});
		return panel;
	}
```

Das Panel 'panel' wird in einer Methode der Klasse 'card' erstellt. In meiner Main-Klasse instanziere ich diese Klasse 'card' und füge dann mittels dieser Methode ein Panel hinzu. Wenn man auf das Panel klickt, sollen Daten aus der Klasse 'card' (das Panel ist ein Objekt) ausgelesen und einem Array hinzugefügt werden, der in der Main-Klasse erstellt worden ist.

Main:

```
public class play extends JFrame {

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

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//CODE
		
		int[] setted = new int[3];

		//CODE
		
		for(int y = 1;y<=7;y++) {
			for(int x = 1;x<=7;x++) {
				//HINZUFÜGEN DES PANELS, BEI KLICK AUF PANEL SOLL DER ARRAY SETTED MIT EINIGEN INFORMATIONEN IN FORM VON INTEGER-ZAHLEN GEFÜLLT WERDEN!
cards[z] = new card();
				JPanel card = cards[z].add_card(z, x, y);
				play.add(card);
			}
		}
		//CODE
	}

}
```

Mein Ziel ist es jetzt also, mit einem MouseAdapter, der auf ein Panel gelegt wird, welches in einer anderen Datei/Klasse erzeugt wird und erst in der Hauptklasse dem Hauptfenster hinzugefügt wird, auf einen Array zuzugreifen, der ebenfalls in der Hauptklasse erstellt wird und dann Daten in ihm zu speichern.
Das Panel sollte, wenn ich mich richtig in JAVA eingelesen habe, ein Objekt sein. Es werden 49 Objekte erstellt und für alle die Koordinaten im Grid-Netz gespeichert! (x und y). Auf diese will ich später zugreifen!


----------



## Marco7757 (2. Feb 2010)

Marco13 hat gesagt.:


> Mein Kristallkugel sagt, dass es auch das hier sein könnte...:
> 
> ```
> class SomeClass
> ...



Genau! Ok, danke, auf die Daten kann ich nun zugreifen! Doch wie übergebe ich sie meinem Array in der Haupt-Klasse?


----------



## Michael... (2. Feb 2010)

Marco7757 hat gesagt.:


> Mein Ziel ist es jetzt also, mit einem MouseAdapter, der auf ein Panel gelegt wird, welches in einer anderen Datei/Klasse erzeugt wird und erst in der Hauptklasse dem Hauptfenster hinzugefügt wird, auf einen Array zuzugreifen, der ebenfalls in der Hauptklasse erstellt wird und dann Daten in ihm zu speichern.


Dazu muss die Klasse (mit dem MouseAdapter) eine Referenz auf die Hauptklasse bzw. das entsprechende Array besitzen.
Oder besser noch man erzeugt in der Hauptklasse einen MouseAdapter und übergibt diesen den Panels oder was auch immer.


----------



## Marco7757 (2. Feb 2010)

Nun gut, ich habe meinen MouseAdapter nun in die Hauptklasse verschoben. Doch jetzt kann ich nicht auf mein Panel zugreifen. Es will immer 'final' vornehin setzen? Weshalb? (Zeile 6)

Ausserdem sind meine Objekte in einem Array gespeichert. Als Zähler dient die Variable z. Doch auch die will Eclipse final ... Wieso? (Zeile 8-10)


```
card.addMouseListener(new MouseAdapter() {

					@Override
					public void mouseClicked(MouseEvent arg0) {
						// TODO Auto-generated method stub
						card.setBackground(Color.lightGray);
						int[] set = new int[3];
						set[0] = cards[z].value;
						set[1] = cards[z].x;
						set[2] = cards[z].y;
						setted[setted[0][0]][0] = set[0]; //INHALT
						setted[setted[0][0]][1] = set[1]; //X-KOORDINATE
						setted[setted[0][0]][2] = set[2]; //Y-KOORDINATE
						setted[0][0]++;
					}});
```
Erstellt werden die Objekte so:

```
cards[z] = new card();
				JPanel card = cards[z].add_card(z, x, y);
```

Vorher war der MouseAdapter in einer Methode die von add_card aufgerufen wurde!

Fehlermeldung ist diese:


> Description	Resource	Path	Location	Type
> Cannot refer to a non-final variable card inside an inner class defined in a different method	play.java	/Cardgame/src/Game	line 48	Java Problem


----------



## Marco13 (2. Feb 2010)

Ohne jetzt den Kontext zu  kennen: Meistens reichen kleine "finale Helper"

```
for (int i=0; i<10; i++)
{
    ... someInnerClass ...
    {
        // Hier wird das i benötigt, aber final
        doSomethingWith(i);
    }
}
```
dann kann man einfach sowas machen

```
for (int i=0; i<10; i++)
{
    final int finalValue = i;
    ... someInnerClass ...
    {
        // Hier wird das i benötigt, aber final
        doSomethingWith(finalValue);
    }
}
```


----------



## Marco7757 (2. Feb 2010)

Cool! Vielen Dank, es funktioniert prima!

Es geht jetzt alles soweit! Vielen Dank!

Wisst ihr, ob man in Java einen ganzen Array einfach leeren und wieder zurücksetzen kann (mehrdimensional)?


----------



## Michael... (2. Feb 2010)

Die Meldung bekommt man in der Regel, wenn man in einer inneren Klasse auf eine nicht globale Variable zu greifen will. In Deinem Fall ist *card* vermutlich nur eine lokale Variable innerhalb der Methode in der Du den den MouseAdapter erzeugst. 
Vermutlich schaut es bei Dir in etwa so aus:

```
JPanel card = new JPanel();
    card.addMouseListener(new MouseAdapter() {
    public void mouseClicked(MouseEvent arg0) {
         card.setBackground(Color.lightGray);
...
```


und das da ist auch recht merkwürdig


Marco7757 hat gesagt.:


> ```
> int[] set = new int[3];
> set[0] = cards[z].value;
> set[1] = cards[z].x;
> ...


----------



## Marco7757 (2. Feb 2010)

Was soll daran merkwürdig sein, ausser dass ich drei überflüssige Zeilen habe?


----------



## Michael... (2. Feb 2010)

Marco7757 hat gesagt.:


> Was soll daran merkwürdig sein, ausser dass ich drei überflüssige Zeilen habe?


Davon mal abgesehen.

Mit merkwürdig meinte ich speziell sowas:

```
setted[setted[0][0]][0] = set[0];
```
Du scheinst setted[0][0] als Zählvariable zu benutzten, wobei setted - sofern ich das richtig verstehe - eigentlich ja ein "Informationsspeicher" sein soll.

Wenn ich jetzt davon ausgehe, das setted[0][0] zu Beginn 0 ist und card[z].value bzw. set[0] z.B. 5 ist, dann würde das folgendes bedeuten:
Zeile 11: setted[setted[0][0]][0] = set[0];
    entspricht, da in dem Bsp. setted[0][0] = 0
    setted[*0*][0] = set[0];
    -->setted[0][0] = 5
In der darauf folgenden Zeile kommt dann:
Zeile 12: setted[setted[0][0]][1] = set[1]; 
    entspricht setted[*5*][0] = set[0];

Und da bin ich mir nicht sicher, ob Du sowas willst.


----------



## Marco7757 (2. Feb 2010)

Da liegt ein kleiner Fehler vor! Ich schreibe zur Zeit noch nicht allzu komplexe Programme, und da kann man sich solche kleinen "Unschönheiten" auch mal leisten. Der Zähler beginnt nämlich bei 1, wobei die Zählervariable dann nie überschrieben wird ...

Ich habe inzwischen jedoch meinen Code optimiert und diese Variable kommt jetzt nicht mehr vor!


----------

