Keine Änderungen an JLabel durch Array möglich

Status
Nicht offen für weitere Antworten.

besus

Mitglied
Hallo,

Ich habe da ein Problem mit einem Array. Und zwar, wenn ich eine Eigentschaft an einem JLabel innerhalb des Konstruktors ändere ist alles ok (grün markierte Zeile). Aber wenn ich in der Methode "setSpielfeld" etwas ändere (rot markierte Zeile) hat es keine Auswirkungen... ich komme einfach nicht dahinter wieso nicht.
Die Labels sind sichtbar und auch das Spielfeldmuster wird korrekt dargestellt. Habe den Code gekürzt. setText funktioniert bei der grünen Markierung bei der roten Markierung aber nicht. Es sind keine Auswirkungen sichtbar. Selbst setBackground(...); geht nicht. Egal was ich ändere, man sieht es nicht. Die Labels sind aber alle sichtbar gemacht worden im Konstruktor. Ich hoffe ihr könnt mir helfen.

Habe zu Testzwecken die beiden System.out's in setSpielfeld hinzugefügt um zu überprüfen ob von der Hauptfunktion auch die Werte übergeben werden. Das klappt auch einwandfrei. Es kommt auch keine Fehlermeldung und nichts, eigentlich müsste es doch so funktionieren wie ich es gemacht habe...

Nochmal in kurzform:
Spielfeld sichtbar. Die einzelnen Felder (hier die Labels) lassen sich auch ändern. Zumindest im Konstruktor, in der Methode "setSpielfeld" jedoch nicht.

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Spielfeld extends JPanel
{

	/* Erstellen des Spielfeldes.
	 *  Schachbrettartig mit einer Dimension von 
	 *  10x10 Feldern. */
	
	private JLabel schachbrett[][] = new JLabel[10][10];

	/* Konstruktor um das Spielfeld zu erstellen */
	Spielfeld()
	{
		/* Festlegung des Layouts */ 
		this.setLayout(new GridLayout(10,10));
		int k = 0;
		
		/* Erzeugen des Schachmusters */
		
		
		for(int i=0; i<10; i++)
		{
	             .... erzeugt das Schachbrettmuster (hab den Code gekürzt)
		}
               [COLOR="Lime"]schachbrett[0][0].setText("Test");[/COLOR]			
        }
	
	/* Setzen der Spielfiguren auf dem Spielfeld
	 * @param x gibt die x Koordinate der Figur an
	 * @param y gibt die y Koordinate der Figur an 
	 * @param figur gibt das Symbol der Figur an*/
	
	public void setSpielfeld(int x, int y, String figur){
                          System.out.println("Koordinaten: x: "+x+"y: "+y);
                          System.out.println(figur);
               [COLOR="Red"]schachbrett[y][x].setText(figur);[/COLOR]
	}
	
}
 
Muss leider gleich los. Damit es lauffähig ist bräuchtest du auch noch die Spielelogik. Ich werde es heute Mittag hochladen und einen Link posten.
 
> Muss leider gleich los. Damit es lauffähig ist bräuchtest du auch noch die Spielelogik.

stimmt nicht unbedingt bzw. wäre auch gar nicht wünschenswert,
ein einfacher Button, der setSpielfeld() aufruft, reicht,

wenn das aber dann funktioniert und mit der Spielelogik dagegen nicht,
dann musst du wirklich die Spielelogik posten, denn dann liegt ja dort der Fehler 😉
 
Hallo,

Alo habe mal Testweise mein Hauptfenster aufs nötigste Reduziert. Es geht leider immer noch nicht, selbst ohne Spielelogik. Aber lauffähig ist es jetzt. Ihr könnt es euch selbst ansehen. Alle Änderungen an den Labels im Spielfeld über die Methode setSpielfeld bleiben unsichtbar. Auch repaint(); hat nicht geholfen.

Achja ich weiss die Switch kann ich noch deutlich verkürzen und im Haupfenster sollte ich statt setBounds, setLocation verwenden. Das werde ich noch ändern. Aber spielt ja hier keine Rolle😉

Code:
import java.awt.BorderLayout;
import javax.swing.JFrame;


public class Hauptfenster extends JFrame
{
	private static final long serialVersionUID = -1421353940759582925L;
	private Spielfeld feld;

	Hauptfenster()
	{
		this.getContentPane().setLayout(new BorderLayout());
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.setSize(250,250);
		this.setResizable(false);
		feld = new Spielfeld();
		this.add(new Spielfeld());
		this.setBounds(350, 250, 250, 250);
		this.pack();
		this.setFiguren();
	}
	
	
	public void setFiguren()
	{
		int x=1;
		int y=3;
		String figur = "test";
		this.feld.setSpielfeld(x, y, figur);
	}

	public static void main(String[] args) {
		new Hauptfenster();
	}
}

und hier der Code vom Nebenfenster Spielfeld. Diesesmal ungekürzt.

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;


public class Spielfeld extends JPanel
{
	private static final long serialVersionUID = -8533454454921642584L;
	/* Erstellen des Spielfeldes.
	 *  Schachbrettartig mit einer Dimension von 
	 *  10x10 Feldern. */
	
	private JLabel schachbrett[][];

	/* Konstruktor um das Spielfeld zu erstellen */
	Spielfeld()
	{
		 schachbrett = new JLabel[10][10];
		/* Festlegung des Layouts */ 
		this.setLayout(new GridLayout(10,10));
		int k = 0;
		
		/* Erzeugen des Schachmusters */
		
		
		for(int i=0; i<10; i++)
		{
			for(int j=0; j<10 ;j++)
			{
				/* Hilfsvariable um Muster zu erzeugen */
				k = k%2;
				
				switch(k)
				{
					case 0:
					schachbrett[i][j] = new JLabel();
					schachbrett[i][j].setOpaque(true);
					schachbrett[i][j].setBackground(Color.PINK);
					schachbrett[i][j].setSize(50, 50);
					schachbrett[i][j].setPreferredSize(new 
					this.add(schachbrett[i][j]);
					k++;
					break;
					case 1:
					schachbrett[i][j] = new JLabel();
					schachbrett[i][j].setOpaque(true);
					schachbrett[i][j].setBackground(Color.WHITE);
					schachbrett[i][j].setSize(50, 50);
					schachbrett[i][j].setPreferredSize(new Dimension(50,50));
					this.add(schachbrett[i][j]);
					k++;
					break;
					default:
					break;
				}
			}
		k++;
		}
		schachbrett[0][0].setBackground(Color.BLUE);
		schachbrett[9][0].setBackground(Color.BLUE);
		schachbrett[0][9].setBackground(Color.BLUE);
		schachbrett[9][9].setBackground(Color.BLUE);
                [COLOR="Lime"]schachbrett[6][3].setText("test");[/COLOR]
	}
	
	/* Setzen der Spielfiguren auf dem Spielfeld
	 * @param x gibt die x Koordinate der Figur an
	 * @param y gibt die y Koordinate der Figur an 
	 * @param figur gibt das Symbol der Figur an*/
	
	public void setSpielfeld(int x, int y, String figur)
	{
		System.out.println("x"+ x + "y" +y);
		System.out.println(figur);
		[COLOR="Red"]schachbrett[x][y].setText( figur);[/COLOR]
	}
}

Zum Besseren Verständnis habe ich die beiden kritischen Punkte wieder markiert. Bei der grünen Markierung kann ich die Label Eigenschaft ändern ,bei der roten nicht.
Achja und ich weiss nicht ob ich die Spieleloik rausgeben darf. Muss ich erst nachfragen. Aber ich glaube die brauchen wir auch gar nicht für ads problem, geht ja ohne auch nicht.
 
> feld = new Spielfeld();
> this.add(new Spielfeld());

das Objekt, das angezeigt wird, ist ein anderes, als das in der Variablen feld,
Änderungen in feld sind also derzeit völlig irrelevant für die Anzeige,
ändere es in

feld = new Spielfeld();
this.add(feld);

-------

> this.setVisible(true);

besser erst ganz am Ende des Konstruktors aufrufen
 
Yeah, ihr seid echt die Java Götter. Jetzt gehts! Naja das kommt davon, weil ich halt vorher keine Referenz von meinem Spielfeld gespeichert hatte. Also danke
 
du kannst deine JLabel sache auslagern in eine eigene methode

Java:
private JLabel createJLabel(Color c)
{
JLabel l = new JLabel();
l.setBackground(c);
...usw.

return l;

}

dann hast du den ganzen Code in deinem switch weg...

dann kannst es so adden

Java:
if(k == 0) this.add(createLabel(Color.WHITE))
else this.add(createLabel(Color.PINK))
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben