JLabel clonen/kopieren

Skrilay

Neues Mitglied
Hallo Java Community,
ich habe ein kleines Problem und zeige euch hier den Teufelscode.
Hier ist der MouseListener eines Memory Spiels.
Wenn der Code in der Zeile 32 ausgeführt werden soll bekomme ich eine NullPointerExeption.
Leider kann ich nicht ganz nachvollziehen wieso?

Java:
class Cardklick implements MouseListener{				
Karte card;	
Karte pervcard;	
JLabel klabell;
JLabel pervklabell;
int[] auswahl;

	public Cardklick(Karte k)
	{
	this.card = k;	
	auswahl = new int[2];
	Arrays.fill(auswahl, 0);
	}
	
	@Override
	public void mousePressed(MouseEvent evt) {
		
		klabell = (JLabel) evt.getComponent();
		klabell.setIcon(card.getBlatt());
		card.setAufgedeckt(true);
		auswahl=memorygame.SpielerObj1.auswaehlen(card);
				
		if(memorygame.SpielerObj1.versuche % 2 == 0)
			{
				if (memorygame.SpielerObj1.vergleiche(auswahl))
					{
						card.blackcard();
					}
				else 
					{
						klabell.setIcon(card.getDeck());
						pervklabell.setIcon(pervcard.getDeck());
					}
			}
			else
			{
				pervklabell = klabell;
				pervcard = card;
			}
					
	}
	
}

Das Attribut versuche startet mit 0 und wird mit der Methode auswaehlen inkrementiert.
Die if Abfrage soll mit module 2 kontrollieren das nur zwei Karten aufgedeckt werden.


Java:
pervklabell = klabell; pervcard = card;
Sollte diese Zuweisung eine Deep Copy sein?
 
Zuletzt bearbeitet:
eine Zuweisung ist immer nur eine Zuweisung, nicht immer eine Deep Copy und schon gar nicht ab und zu das eine oder das andere,
aus deinem Code kann man kaum den gesamten Ablauf erkennen, z.B. nicht wann wo warum memorygame.SpielerObj1.versuche gesetzt wird,

aber es ist doch wirklich einfach, alles selbst zu kontrollieren,
an allen wichtigen Stellen schreibe Ausgaben a la
System.out.println("spieler dran: "+..+", Versuch Nr: "+...);
..
System.out.println("merke nun folgende Karte unter der Variablen klabell: "+..);
..
System.out.println("greife nun auf klabell zu, dort steht derzeit drin: "+..);

usw.
dein Programm verheimlicht dir nichts, du kannst jeden einzelnen Schritt genauestens verfolgen,
wenn nicht durch Denken dann allein durch Tippen..

----

leicht erhöhte Schwierigkeit bilden doppelte Objekte,
wenn du jeder Karten einen eigenen Listener zuweist, worauf dein Konstruktor hindeutet,
dann bringt es natürlich wenig, in Listener X etwas zu merken worauf Listener Y dann nicht zugreifen kann,
speichere allgemeine Daten zum Spieler evtl. im Spieler-Objekt statt im Listener
 
Zuletzt bearbeitet von einem Moderator:
leicht erhöhte Schwierigkeit bilden doppelte Objekte,
wenn du jeder Karten einen eigenen Listener zuweist, worauf dein Konstruktor hindeutet,
dann bringt es natürlich wenig, in Listener X etwas zu merken worauf Listener Y dann nicht zugreifen kann,
speichere allgemeine Daten zum Spieler evtl. im Spieler-Objekt statt im Listener

Das war es, jede Karte hat ein Listener (Memory gibts jede Karte doppelt) somit konnte ich die Karten nicht eindeutig indentifizieren. Danke für den Tipp mit dem Spieler manchmal sind Lösungen so einfach 😉

Hier ist der neue Code, jetzt brauche ich auch nicht mehr über das Objekt card die Karten schwärzen.


Java:
class Cardklick implements MouseListener{
Karte card;	
Karte pervcard;	
JLabel klabell;
JLabel pervklabell;
int[] auswahl;

	public Cardklick(Karte k)
	{
	this.card = k;	
	auswahl = new int[2];
	Arrays.fill(auswahl, 0);
	}
		
	@Override
	public void mousePressed(MouseEvent evt) {
		klabell = (JLabel) evt.getComponent();
		klabell.setIcon(card.getBlatt());
		card.setAufgedeckt(true);
		auswahl=memorygame.SpielerObj1.auswaehlen(card);
		if(memorygame.SpielerObj1.versuche % 2 == 0)
			{
				if (memorygame.SpielerObj1.vergleiche(auswahl))
					{
					//	card.blackcard();
						pervklabell=memorygame.SpielerObj1.getPervcardlabel();
						pervcard=memorygame.SpielerObj1.getPervcardobj();					
		// TIMER				
						pervklabell.setIcon(pervcard.getBlack());
						klabell.setIcon(card.getBlack());
					}
				else 
					{
						pervklabell=memorygame.SpielerObj1.getPervcardlabel();
						pervcard=memorygame.SpielerObj1.getPervcardobj();
						
		// TIMER				
						pervklabell.setIcon(pervcard.getDeck());
						klabell.setIcon(card.getDeck());
					}
				
			}
			else
			{
				memorygame.SpielerObj1.setPervcardlabel(klabell);
				memorygame.SpielerObj1.setPervcardobj(card);
			}
				
		
	}

Jetzt speicher ich einfach im Objekt Spieler und hab dann auch kein Problem mehr mit den X und Y Listener.

Nur muss da jetzt noch ein Timer rein der erst nach einer bestimmten Zeit die Karten schwärzt oder wieder umdreht.
 
Zuletzt bearbeitet:

Zurück
Oben