Problem mit ActionListener , switch-Anweisung und Objekt

  • Themenstarter Themenstarter Maksmus
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

Maksmus

Gast
Hallo,

also ich hab folgendes Problem.

Ich möchte/soll ein Memory programmieren. In der GUI sind lauter Buttons(Klasse MemoryKarte) mit bestimmten IDs.
Bei der Betätigung des Buttons sollen diese IDs der zwei offenen (spricht text sichtbar) verglichen werden.

Ich habe allerdings ein Problem mit dem Vergleich der beiden ID der angewählten Objekte.
Hier meckert der Compiler immer das die eine Variablie nicht initalisiert seien möge.
Ich poste einfach mal den Code.


Code:
 import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class MemorySpiel {
    
    
    
    
    public static void main(String[] args) {
     
     

        JFrame.setDefaultLookAndFeelDecorated(false);

        //Create and set up the window.
        JFrame frame = new JFrame("TestGridLayout");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MemoryKarte b[] = new MemoryKarte[24];

	
	
		//for(int i=0; i < b.length; i++)
	        b[0] = new MemoryKarte(0);
			b[1] = new MemoryKarte(1);
			b[2] = new MemoryKarte(2);
			b[3] = new MemoryKarte(3);
			b[4] = new MemoryKarte(4);
			b[5] = new MemoryKarte(5);
			b[6] = new MemoryKarte(6);
			b[7] = new MemoryKarte(7);
			b[8] = new MemoryKarte(8);
			b[9] = new MemoryKarte(9);
			b[10] = new MemoryKarte(10);
		 	b[11] = new MemoryKarte(11);
			b[12] = new MemoryKarte(0);
			b[13] = new MemoryKarte(1);
			b[14] = new MemoryKarte(2);
			b[15] = new MemoryKarte(3);
			b[16] = new MemoryKarte(4);
			b[17] = new MemoryKarte(5);
			b[18] = new MemoryKarte(6);
			b[19] = new MemoryKarte(7);
			b[20] = new MemoryKarte(8);
			b[21] = new MemoryKarte(9);
			b[22] = new MemoryKarte(10);
			b[23] = new MemoryKarte(11);	
	

        JPanel pane = new JPanel();
        pane.setLayout(new GridLayout(6, 4, 2, 2));

		
		KlickActionListener KAL = new KlickActionListener();
		
		for(int i=0; i < b.length; i++)
	        {
	        b[i].addActionListener(KAL);
	        pane.add(b[i]); }
        

           
        // Add JPanel to JFrame
        frame.getContentPane().add(pane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
    
   
 
    
}


class KlickActionListener implements ActionListener {
	
		private Integer anzoffeneKarten = 0;
		private Integer MemoryKarte1 = 0;
		private Integer MemoryKarte2 = 99;
        private MemoryKarte Karte1 = null;
		private MemoryKarte	Karte2 = null;
		// Karte1 = new MemoryKarte(99);
		
		public void actionPerformed(ActionEvent e) {
		
					
	switch (anzoffeneKarten) {
	
	case 0:
	
		                MemoryKarte Karte1 = (MemoryKarte) e.getSource();
						if (Karte1.umdrehen()==true) {
						anzoffeneKarten++;
						MemoryKarte1 = Karte1.idausgabe();	
						System.out.println ("ID Karte 1 :" + MemoryKarte1);	
						System.out.println ("ID Karte 2 :" + MemoryKarte2);				}
						
						else {
						anzoffeneKarten--;
														}
														
		break;
	
	
	
		case 1: 
		
					
		
						MemoryKarte Karte2 = (MemoryKarte) e.getSource();
						if (Karte2.umdrehen()==true) {
						anzoffeneKarten++;
						MemoryKarte2 = Karte2.idausgabe();
						System.out.println ("ID Karte 1 :" + MemoryKarte1);	
						System.out.println ("ID Karte 2 :" + MemoryKarte2);									}
						else {
						anzoffeneKarten--;
						break;
														}
														
						if (Karte1.idausgabe() == MemoryKarte2)	{
							
							System.out.println ("Bingo");
						}							
														

		break;
	
	}
	
	
	
			
		
			System.out.println("AUA " + anzoffeneKarten );
		
		
	}	

	
}



Eigentlich habe ich das Problem nur mit den Action. Da ich dei Methode Karte1.ausgabe() nicht ausführen kann, da
die Karte eins eventuell nicht initallisiert seien könnte.....
Mir ist da nicht ganz klar. Weil die Variable anzoffeneKarten funktioniert ja auch.

Wäre toll wenn jemand einen Ratschlag hätte!




zu vollständigkeit poste ich noch die Klasse MemoryKarte

Code:
jmport java.awt.*;
import javax.swing.*;

public class MemoryKarte extends JButton{

private String vorderseite; // vorderseite ist Seite mit verschieden Bildern
private String	rueckseite;
private Boolean sichtbar; // Wenn True liegt karte offen
private Integer id; //

public MemoryKarte(Integer id){

this.id = id;
vorderseite = "karte id " + id;
rueckseite = "Rücken";

setText(rueckseite);
sichtbar = false;

}

private void zeigeBild()
{
	
	
	setText(vorderseite);
	sichtbar = true;
}


private void zeigeRuecken(){
	setText(rueckseite);
	sichtbar = false;
}


public Integer idausgabe() {
	return id;
}

public boolean umdrehen() {
	
	if (sichtbar == false) {
	zeigeBild();	
	//	test++;
	//System.out.println(test);
	return true;

	}
	
	
    else {
    zeigeRuecken();
    return false;
    }
	
}


}
 
Zeile 83:
Karte1 = null; nicht initialisiert, Karte1 ist globale Variable deines Actionlisteners


Zeile 94: MemoryKarte Karte1 = (MemoryKarte) e.getSource();
Erstellen einer localen Variable, deines Actionlisteners. Das hat keine Auswirkung auf die globale Variable

sobald die Methode actionPerformed durchlaufen wurde, wandert die locale Variable auf den Müll. Da kommt die Müllabfuhr. Die globale Variable bleibt weiterhin uninitialisiert.

Beim Zweiten durchlauf versuchst du auf der uninitialisierten Variable was aufzurufen. Funktioniert natürlich nicht. Zeile 124.

Daraus folgt, Zeile 94 in :
Code:
Karte1 = (MemoryKarte) e.getSource();

ändern.


Meinen Lohn spende doch bitte an das SOS-Kinderdorf. Die Höhe überlass ich dir.
 
Vielen Dank. Hat so wunderbar geklappt.



Noch eine kleine Frage. Ich hab alles jetzt prinzipiell fertig.

Allerdings möchte ich, wenn alle Karten aufgedeckt sind wieder alle zudecken.



Nun wie soll ich das realisieren.
Im ActionListener kann ich ja nicht mehr auf die bereits aufgedeckten objekte zugreifen, da bereits mit neuen Karten überschrieben wurden.

Meine idee wäre im ActionListener einfach einen MemoryKarten Array einzubauen. So kann ich dann auch noch auf die einzelnen karten zugreifen.



Gibts auch eine möglichkeit, einfach die main Methode nochmal neuzustarten?


Viele Grüße
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben