Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
Tut mir leid, dass ich den Codeausschnitt vergessen habe. Also das Ganze sieht so aus:
Java:
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:
Java:
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!
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.
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)
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
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:
Java:
JPanel card = new JPanel();
card.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent arg0) {
card.setBackground(Color.lightGray);
...
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.
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!