MouseAdapter und Arraylist

cuanu

Mitglied
Hallo,

ich versuche mich gerade an einer Memoryfunktion die mir "Karten" umdrehen kann.
Ich habe mehrere geometrische Figuren erstellt die mehrfach vorkommen und beim erstellen jeweils in die dazugehörige Arraylist gesteckt werden. Bei folgendem Code stecke ich jetzt aber fest.

Java:
circle.add(0, new Circle());
	circle.get(0).setColor(new Color(setColor(),setColor(),setColor()));
	circle.get(0).setID(i);
	circle.get(0).setTurned(true);
	add(circle.get(0));
	circle.get(0).addMouseListener(new MouseAdapter()
	{
	        public void mouseClicked(MouseEvent e)
		{
			System.out.println("Kreis Gedrückt!");
		}
	});

Er erstellt mir schön brav meine Kreise, Quadrate etc. Das MouseEvent reagiert auch auf das System.out nur möchte ich jetzt gerne, dass er weiß welche Karte genau geklickt wurde ( dafür war die setID gedacht) wonach er dann das setTurned auf false setzen soll damit eine art Rückseite gezeigt wird. Ich weiß jedoch nicht wie ich herausfinde welches der Kreise, Quadrate geklickt wurde um es umzustellen auf false.
 
dem MouseEvent wird die Quelle des Klicks mitgegeben, in dem Fall deine geometrischen Objekte. Du kannst, am besten mit vorheriger Typprüfung, dann e.getSource() in die jeweilige Klasse casten und hast damit dein Objekt welches geklickt wurde verfügbar
 
Das was du vorhast setzt voraus, dass du ein und den selben EventHandler (in deinem Fall einen einzigen MouseListener bzw. MouseAdapter) bei allen Komponenten registrierst und nicht für jede Komponente einen eigenen neuen Listener bzw. Adapter.

Danach so verfahren wie diggaa1984 es bereits gepostet hat.

z.B. mit der Typprüfung "instanceof Circle" und casten mit (Circle) e.getSource()

Gruß
JP
 
Ich habe jetzt noch den ganzen Abend und heute morgen probiert das Problem von euch zu verstehen. Leider ohne Erfolg.
In unseren Beispielen hatten wir immer nur 1 oder maximal 2 JLabels die dann direkt angesprochen wurden aber irgendwie kriege ich das nicht auf dieses Problem transportiert.

Ich habe mir jetzt mal mit e.getSource() die Daten ausgeben lassen und bekomme einen String zurück der den Typ enthällt( Kreis,Quadrat etc.), eine koordinate wo geklickt wurde und noch so einige andere Daten.

Wenn ich eure Posts richtig verstanden habe soll ich nicht bei jedem Object ein (new MouseAdapter) erstellen sondern nur einen nehmen?

Ich hoffe ihr könnt es mir "anders" erklären ohne, dass es mir komplett vorgekaut werden muss. Wahrscheinlich denke ich mal wieder zu kompliziert.

MfG cuanu
 
es wurde doch gesagt, dass du e.getSource() auf Circle casten kannst/ sollst,
ich hoffe du weist was Grundlagen wie Casten bedeuten, jedenfalls hättest du dann das Circle-Objekt vorliegen, was gibt es mehr an Freude?

du solltest auch versuchen, mit einfachen Variablen zu arbeiten, statt zigmal circle.get(0) zu schreiben

Variante mit nur einem Listener:
Java:
MouseAdapter m = new .. {
   // Mouseadapter definieren, Source auf Circle casten

};
for (...) {
   Circle c = new ..; // kurze Variable c
   list.add(c);
   c.setId usw.
   c.addMouseListener(m); // ein Listener für alle
}


oder auch denkbar:
Java:
for (...) {
   final Circle c = new ..; // kurze Variable c, final wichtig für Listener
   list.add(c);
   c.setId usw.
   c.addMouseListener(new MouseAdapter... {
        // wieder getrennte Listener
        // source immer noch möglich oder ganz einfach mit c arbeiten, das geht (nur mit final)

        // list.get(0) ginge natürlich nicht, weil wahrscheinlich noch andere in die Liste kommen?
        // man könnte aber auch die Liste normal befüllen und den Index merken usw.,
       
    }); 
}
 
Zuletzt bearbeitet von einem Moderator:
Vielen dank für deine Antwort.
Die ArrayList haben wir offiziell noch nicht behandelt und ich dachte man muss immer ein Index mit auf den Weg geben aber deine Variante ist wirklich sauberer. Habe dies auch gleich übernommen.

Das Problem beim Casten war eigentlich zu einfach denn ich hatte es schon fast richtig vor deinem Post aber vergessen eine Klammer um das komplette Casten zu setzen. Hatte natürlich nur die Standardvariante mit z.B. (int)a und hier bracuht man ja ((object)e.getSource()).getID.🙂

Also vielen dank euch 3 nochmal und jetzt muss ich mich erstmal ans repaint() setzen. Mal schauen was dort für Herausforderungen warten.

MfG cuanu
 

Zurück
Oben