JLabel läßt sich auf GUI einfach nicht aktualisieren

Codenix

Grünschnabel
Hallo liebe Community,

ich habe ein Problem mit einer Label-Aktualisierung in meinem Memory-Spiel und ich hoffe ihr könnt mir weiterhelfen, da mir mittlerweile die Einfälle ausgehen.
Mein Memory-Spiel besteht aus einem FlowLayout in dem 3 Panels liegen, Panel 1 -> Spielfeld, Panel 2 -> Punktanzeige Spieler /Computer (hier aktualisiert das Label), Status Anzeige wer gerade dran ist -> Hier erfolgt die Labelaktualisierung einfach nicht...:-(
Panel 3 mit einem Schummelbutton:

Anbei meine init-Methode des Konstruktors:

Code:
//die Methode erstellt die Oberfläche und zeichnet die Karten
	private void initGUI() {
		//das Layout setzen
		setLayout(new FlowLayout(FlowLayout.LEFT));
		
		//ein Panel für das eigentliche Spielfeld
		feld = new JPanel();
		//das Panel bekommt ein Gridlayout mit 7 Zeilen
		feld.setLayout(new GridLayout(7,0));
		//die Karten erstellen und zeichnen
		kartenZeichnen(feld);

		add(feld);
		
		//für die Ausgaben
		ausgabe = new JPanel();
		statusleiste = new JPanel();
		menschPunkteLabel = new JLabel();
		computerPunkteLabel = new JLabel();
		/**
		 * Bei der Einsendeaufgabe kommt noch ein Label hinzu, 
		 * welches anzeigt ob der Computer oder der Spieler
		 * aktuell am Zug ist, die Anlage des Labels erfolgt
		 * in der init-Methode
		 */
		werIstdranLabel = new JLabel();
		menschPunkteLabel.setText(Integer.toString(menschPunkte));
		computerPunkteLabel.setText(Integer.toString(computerPunkte));
		
		
		/**
		 * Schummelbutton, erzeugen, und mit Listener verbinden
		 * 
		 */
		schummeln = new JButton("Schummeln");
		schummeln.addActionListener(new SchummelListener());
		
		
		//in zwei Spalten
		ausgabe.setLayout(new GridLayout(0,2));
		ausgabe.add(new JLabel("Mensch: "));
		ausgabe.add(menschPunkteLabel);
		ausgabe.add(new JLabel("Computer: "));
		ausgabe.add(computerPunkteLabel);
		add(ausgabe);
		statusleiste.setLayout(new GridLayout(2,0));
		werIstdranLabel.setText("Du bist der Erste, der spielen darf, decke zwei Karten auf!");
		statusleiste.add(werIstdranLabel);
		statusleiste.add(schummeln);
		add(statusleiste);
	}

Ferner gibt es eine Methode, die feststellt welcher Spieler dran ist, wenn der Computer ziehen darf, wird die computerzug-Methode aufgerufen:

Code:
//die Methode wechselt den Spieler
	private void spielerWechseln() {
		//wenn der Mensch an der Reihe war,
		//kommt jetzt der Computer
		if (spieler == 0) {
			spieler = 1;
			setLabelTextPC("Der Nächste der darf ist der Computer");
			computerZug();
		}
		else
			spieler = 0;
		setLabelTextMensch("Jetzt bist Du wieder an der Reihe und darfst weiter spielen");
	}

in der Methode setLabelTextPC und ...Mensch möchte ich die Aktualisierung des Labels vornehmen:

Code:
	//die Methode setzt den Text im zweiten Label
		public void setLabelTextMensch(String text) {
		
			werIstdranLabel.setText("jetzt mensch");
			statusleiste.add(werIstdranLabel);
			statusleiste.add(schummeln);
			add(statusleiste);
			statusleiste.repaint();
			
//			new Thread("Label aktualisieren"){
//				public void run(){
//					werIstdranLabel.setText("test mensch");
//				}
//			}.start();
			
			
//			remove(feld);
//			remove(statusleiste);
//			remove(ausgabe);
//			
//			werIstdranLabel.setText("test pumuckl");
//			werIstdranLabel.validate();
//			werIstdranLabel.repaint();
//			werIstdranLabel.revalidate();
//			add(feld);
//			add(ausgabe);
//			add(statusleiste);
//			repaint();
//			validate();
//			
//			pack();
			
			
			
			//das Fenster neu packen
			//werIstdranLabel.updateUI();
			//pack();
		}
		
		//die Methode setzt den Text im zweiten Label
				public void setLabelTextPC(String text) {
					
					
					werIstdranLabel.setText("jetzt pc");
					statusleiste.add(werIstdranLabel);
					statusleiste.add(schummeln);
					add(statusleiste);
					repaint();
//					
					
				}

wie Ihr seht hab ich hier schon alles mögliche ausprobiert aber nichts funktioniert. Bis jetzt wird beim ersten Spieler Zug einmal das Label auf den Text "test pumuckl" gesetzt, die Aktualisierung auf "jetzt PC" funktioniert aber nie....

innerhalb der computerzug-Methode wird eine Methode aufgerufen, welche die Karten umdreht... hier läuft dann auch ein Timer der dafür sorgt, dass die Karten nicht gleich wieder umgedreht werden.. kann es hier ein Problem mit der Label-Aktualisierung geben?

Danke
 

HonniCilest

Erfahrenes Mitglied
Was ich nicht verstehe: Wieso benötigst du überaupt die Methoden setLabelText Mensch und setLabelTextPC überhaupt? Würde ein einfachen setText nicht reichen? Warum führst du erneut add-Methoden mit der statusLeiste aus?
 

Codenix

Grünschnabel
Hallo HonniCilest,

das mit den setLabelText-Methoden war nur eine Spielerei von mir, da ich im Programm alles über getter- und setter() abarbeiten wollte. Ich hab es aber jetzt wieder geändert und verwende in der spielerwechsel()-Methode folgende Variante:

werIstdranLabel.setText("Jetzt ist wieder der Computer dran");

Wie gesagt ich hab schon alles mögliche versucht, damit das Label upgedated wird. Der letzte Versuch war das mit den add-Methoden.
Ich dachte mir dass ich alle drei Panels zunächst remove, dann das Label mit dem neuen Text zeichne und dann alle Panels und Komponenten wieder über add in die Gui hänge.
Leider hat dies auch nicht funktioniert...

was könnte ich in der spielerWechsel-Methode sonst noch ausprobieren?
 

Codenix

Grünschnabel
Hallo nochmals,

zur leichteren Fehlersuche, habe ich nun anbei alle benötigten Klasse für das Memory-Spiel im Anhang hochgeladen.
Die betroffene Methode spielerWechseln() befindet sich in der Klasse MemoryFeld_Loesung.

Danke und schönen Sonntag Abend,
 

Anhänge

  • MemorySpiel_Aktualisierungsproblem_JLabel.zip
    337,2 KB · Aufrufe: 11