Spielfigur wird trotz erfolgreich aufgerufener Methode nicht

Status
Nicht offen für weitere Antworten.
J

java.jason

Gast
Hallo,

ich programmiere gerade an einem kleinen Würfelspiel. Eine Spielfigur soll über ein Spielfeld aus JLabels (Bildern) laufen. Wird auf einen JButton gedrückt wird der Wert x in der ActionPerformed Methode in 2 verändert (später durch eine Würfelmethode) und die Methode Spielfigur aufgerufen, die die Spielfigur auf das Spielfeld packen soll. Leider funktioniert das aber nicht. Die SPielfigur wird nicht angezeigt. Rufe ich die Methode Spielfigur() direkt in Spielfeld_center auf geht es. Kann mir das vielleicht jemand erklären?


Hier ein Ausschnitt aus meiner Gui Klasse:

Code:
public class Gui extends JFrame{

...		
		//ContentPane Anlegen
		Container contentPane = this.getContentPane();
		contentPane.setLayout(new BorderLayout());
		
		//Komponenten einfügen
		JButton button = new JButton("button");
        contentPane.add(button, BorderLayout.SOUTH);
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                int x = 2;
                spielfeld_center.setX(x);
                spielfeld_center.Spielfigur();
                
            }
        }); 

...

	}
}



Code:
public class Spielfeld_center extends JPanel {

...		
	public Spielfeld_center() {
	    //JPanel panel1 = new JPanel();
	    panel1.setBackground(new Color(0,0,0));
	    //GridBagLayout gbl = new GridBagLayout();
	    //GridBagConstraints gbc;
	    panel1.setLayout(gbl);
	    
	       
	   //1.for Schleife oben
	    for (int x2=0; x2<7; x2++)
    	{
			gbc = makegbc(x2, 0, 1, 1);
			gbc.fill = GridBagConstraints.BOTH;
			JLabel bild = new JLabel(new ImageIcon (x2 + "oben.png"));
		  	gbl.setConstraints(bild, gbc);
			panel1.add(bild);
   
	    }
	    this.add(panel1);
    }
	
	public void Spielfigur()
    {
	    //Spielfigur einfügen
	    gbc = makegbc (0,x,1,1);
	    JLabel bild2 = new JLabel(new ImageIcon ("figur1.png"));
	    gbl.setConstraints(bild2, gbc);
	    panel1.add(bild2);
	    System.out.println(x);
    }

    public void setX(int x)
    {
        this.x = x;
    }
    
  
        //Methode setze GridBagConstraints für GridBagLayout
		private GridBagConstraints makegbc(
	    	    int z, int y, int width, int height)
	    	  {
	    	    GridBagConstraints gbc = new GridBagConstraints();
	    	    gbc.gridx = z;
	    	    gbc.gridy = y;
	    	    gbc.insets = new Insets(2, 2, 1, 1);
	    	    return gbc;
	    	  }
}
 
S

SlaterB

Gast
scheint eher ein Layout-Problem zu sein,
also eher/ auch
validate();
 
J

java.jason

Gast
Super validate() brachte die Erleuchtung. Leider liegt die Spielfigur nun aber hinten meinen JLabels mit den Grafiken für das Spielfeld. Kann ich zwei JLabels übereinander legen ohne eine LayeredPane zu nutzen? Die lässt ja keine LayoutManager zu :(
 

sliwalker

Top Contributor
Hoi,

eine ziemlich ziemlich dreckige Lösung wäre die Spielfigur als AWT Label zu deklarieren. AWT ist meiner Meinung nach schwerer und liegt dann vorne.
Wechselwirkungen will ich mal nicht ansprechen....
 
J

java.jason

Gast
Mmh k das kann ich mal versuchen...
Sauber wäre also tatsächlich die Lösung mit der LayeredPane?

@SlaterB thx a lot
 
J

java.jason

Gast
Hey sliwalker,

das funktioniert tatsächlich... gerade mal mit einem AWT Label getestet. Könntest du die Wechselwirkungen vielleicht doch mal ansprechen? ;)
 

Saxony

Top Contributor
Hiho,

wie wärs mit Container#setComponentZOrder(comp, index) ?
Gibts seit JDK 1.5.

bye Saxony
 

Marco13

Top Contributor
java.jason hat gesagt.:
Hey sliwalker,
das funktioniert tatsächlich... gerade mal mit einem AWT Label getestet. Könntest du die Wechselwirkungen vielleicht doch mal ansprechen? ;)

Die Wechselwirkungen sind erstmal einfach nur die, dass AWT-Komponenten die Swing-Komponenten überlagern. Aber das sollte man definitiv NICHT ausnutzen. Man sollte grundsätzlich nicht Swing und AWT mischen, und WENN man es macht, nicht einen "unangenehmen Seiteneffekt" dessen für die Implementierung eines Features verwenden!!!
 
J

java.jason

Gast
K also wollen wir es sauber machen...

Saxony hat gesagt.:
Hiho,

wie wärs mit Container#setComponentZOrder(comp, index) ?
Gibts seit JDK 1.5.

bye Saxony

Leider kann ich damit nicht so viel anfangen. Ich setze also zwei Container und kann angeben in welche Reihenfolge die angezeigt werden? Kannst du mir da vielleicht mal zwei Zeilen Code zu reichen?
By the way: Löst ihr solche Probleme einfach dadurch, dass ihr alles absolut positioniert? Das ist doch wahnsinnig aufwendig oder nicht? Man weiß doch nie wo welcher Pixel liegt oder gibt es da Hilfsprogramme zu?
:roll:

Danke euch.
Der java.jason :###
 

Saxony

Top Contributor
Hiho,

Code:
JPanel pan = new JPanel();
JLabel lab = new JLabel();
pan.add(lab);
pan.setComponentZOrder(lab, 0)
Damit wird so zusagen das JLabel lab in den Vordergrund des Containers pan gebracht.

bye Saxony
 
J

java.jason

Gast
Saxony du bist mein Held. Ist das denn stylistisch okay? Warum findet man das nirgendwo in den ganzen schlauen Nachschlagewerken?
 

Saxony

Top Contributor
Tja keine Ahnung woher ich das weiß, hab das mal für nen grafischen UML Diagramm Editor gebraucht. Hab da glaube aber auch ewig gesucht. :)

Stilistisch sehe ich da nix was dagegen sprechen sollte.

bye Saxony
 
J

java.jason

Gast
So zwei Stunden weiterprogrammiert und ich stehe wieder vor einem Problem. Spielfigur wird an richtiger Stelle angezeigt, Methode Wuerfeln() arbeitet wunderbar. Problem ist nur, dass die Spielfigur am alten Standpunkt nicht gelöscht wird. Nach 2 Mal Würfeln steht die Figur also auf zwei Feldern. Das ist natürlich nicht gewollt. Gibt es eine Methode mit der ich nach jedem Aufruf von Spielfigur() das komplette panel oder die komplette contentPane laden kann? Oder muss ich die Figur einfach vom alten Ort irgendwie entfernen?
 
J

java.jason

Gast
Hm kann ich das alte Bild nicht irgendwie manuell löschen? Also bevor ich das neue Bilde setze, erst das alte mit irgendeiner Methode entferne?
 

Saxony

Top Contributor
Hmm dein Bild ist doch ein JLabel wie ich verstanden habe!

Nachdem es bewegt wurde, musst du einfach mal ein Repaint des Containers machen wo es drinne liegt.

bye Saxony
 
G

Guest

Gast
Ja der Container wäre doch in diesem Fall das Panel1...

Code:
	public void Spielfigur_einfuegen(Spielfeld_center spielfeld_center)
	{
		
		a = setzen(wuerfeln(), position);
	    koordinaten_x = Integer.valueOf(a[0]).intValue();
	    koordinaten_y = Integer.valueOf(a[1]).intValue();
	      
	    spielfeld_center.gbc = spielfeld_center.makegbc (koordinaten_y,koordinaten_x,1,1);
	    JLabel bild2 = new JLabel(new ImageIcon ("figur1.png"));
		spielfeld_center.gbl.setConstraints(bild2, spielfeld_center.gbc);
		spielfeld_center.panel1.add(bild2);
		spielfeld_center.panel1.setComponentZOrder(bild2, 0);
		spielfeld_center.panel1.repaint();
		spielfeld_center.panel1.validate();
		
	}

Aber auch nach repaint löscht er die alte Spielfigur nicht bevor er die neue platziert.
 

Saxony

Top Contributor
Hehe,

mit Code wirds klarer wieso. Und zwar schiebst du nicht ein einziges Label über deinen Container sondern machst ja mit new immer wieder ein neues.

bye Saxony
 
J

java.jason

Gast
thx! Ich merke immer wieder, dass es bei mir an Wissen über die Grundprinzipien der OOP mangelt. Ist natürlich logisch! Nochmals danke
 
J

java.jason

Gast
Auf die Gefahr hin das ich langsam nerve...
Habe mich heute wieder drangesetzt und musste feststellen, dass meine Spielfigur immer noch nicht richtig arbeitet.
Der erste Zug klappt wunderbar. Auch meine Methode würfeln arbeitet und gibt die richtigen Koordinaten für das platzieren meiner Spielfigur weiter. Diese habe ich mir in der Konsole ausgeben lassen.
Doch beim zweiten Zug landet meine Spielfigur grundsätzlich auf Feld 0,0 des GridBagLayouts. Obwohl sie eigentlich einem anderen Feld stehen müsste. Funktionieren validate und repaint etwa doch nicht richtig und ich muss die SPielfigur erst komplett zerstören und wieder neu erschaffen?
Hier nochmal ein Auszug aus meiner Klasse

Code:
public void Spielfigur_einfuegen(Spielfeld_center spielfeld_center)
	{
		
		a = setzen(wuerfeln(), position);
	    koordinaten_x = Integer.valueOf(a[0]).intValue();
	    koordinaten_y = Integer.valueOf(a[1]).intValue();
	    System.out.println("Koordinaten x-Achse: " + koordinaten_x);
	    System.out.println("Koordinaten y-Achse: " + koordinaten_y);
	      
	    spielfeld_center.gbc = spielfeld_center.makegbc (koordinaten_y,koordinaten_x,1,1);
	    spielfeld_center.gbl.setConstraints(bild2, spielfeld_center.gbc);
		spielfeld_center.panel1.add(bild2);
		spielfeld_center.panel1.setComponentZOrder(bild2, 0);
		spielfeld_center.panel1.validate();
		spielfeld_center.panel1.repaint();
	}
	
	public int wuerfeln()
	{
		wuerfelzahl =(int)(Math.random()*3+1);
		System.out.println("Würfelzahl" + wuerfelzahl);
		return wuerfelzahl;
	}
	
	public int[] setzen (int x, int y)
	{
		int z;
		z = x + y;
		System.out.println("Spielfigur auf Feld:" + z);
					
		int[][] a = new int[10][10];
		a[0][0] = 0;
		a[0][1] = 1;
		a[0][2] = 2;
		a[0][3] = 3;
		a[0][4] = 4;
		a[0][5] = 5;
		a[0][6] = 6;
		a[1][6] = 7;
		a[2][6] = 8;
		a[3][6] = 9;
		a[4][6] = 10;
		a[5][6] = 11;
		a[5][5] = 12;
		
		

		for (int i=0; i<a.length; i++)
		{
			for (int j=0; j<a.length; j++)
			{
				q = Integer.valueOf(a[i][j]).intValue();
				if (z==q)
				{
					o =i;
					g = j;
				}	
			}		
		}		
		return new int[] {o, g};
	}
Danke allen Helfern![/code]
 
J

java.jason

Gast
So weitere zwei Stunden gegrübelt... Ziel leider immer noch nicht erreicht ???:L

Code:
public class Spielfigur {
	private int position;
	private int wuerfelzahl;
	private int[] b;
	private int koordinaten_x;
	private int koordinaten_y;
	public JLabel bild2 = new JLabel(new ImageIcon("figur1.png"));
	public void Spielfigur_einfuegen(Spielfeld_center spielfeld_center)
	{
		
	    b = setzen(wuerfeln(), position);
	    koordinaten_x = Integer.valueOf(b[0]).intValue();
	    koordinaten_y = Integer.valueOf(b[1]).intValue();
	    
	      
	    spielfeld_center.gbc = spielfeld_center.makegbc (koordinaten_y,koordinaten_x,1,1);
	    System.out.println("Koordinaten x-Achse: " + koordinaten_x);
	    System.out.println("Koordinaten y-Achse: " + koordinaten_y);
	    spielfeld_center.gbl.setConstraints(bild2, spielfeld_center.gbc);
	    spielfeld_center.panel1.add(bild2);
	    spielfeld_center.panel1.setComponentZOrder(bild2, 0);
	    spielfeld_center.panel1.validate();
	    spielfeld_center.panel1.repaint();
		
	}

Führe ich den Code so aus, wird meine Spielfigur beim ersten Ausführen auf das richtige Feld gesetzt. Führe ich ihn dann nochmal aus, so wandert sie grundsätzlich auf das Feld 0,0, obwohl die koordinaten anders gesetzt sind.

Erzeuge ich jedes Mal ein neues Objekt von Jlabel und führe den Code aus, so steht die Spielfigur immer auf dem richtigen Feld, wird aber mehrmals angezeigt. Das ist ja logisch. Lösung: Kann ich nicht einfach jedes Mal ein neus Objekt des JLabels erzeugen und bei Bedarf wieder zerstören? Dazu muss es doch eine Methode geben oder nicht?

Noch besser wäre es natürlich, wenn ich das Objekt JLabel einfach wie ursprünglich überlegt versetzen könnte.

Hat wirklich keiner eine Idee?[/code]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Wie schreibe ich eine if-Verzweigung um, so dass ein Bedingungsoperator benutzt wird? Java Basics - Anfänger-Themen 9
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
el_pato DialogFenster wird nicht in Schleife geöffnet? Java Basics - Anfänger-Themen 30
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
F Session wird mehrfach erzeugt Java Basics - Anfänger-Themen 11
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
fuerteb Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt Java Basics - Anfänger-Themen 4
L JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 10
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
krgewb Long wird gerundet Java Basics - Anfänger-Themen 2
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
H GridPane wird nicht angezeigt Java Basics - Anfänger-Themen 0
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
X compareTo Methode wird ignoriert Java Basics - Anfänger-Themen 7
kodela Hauptklasse wird nicht gefunden Java Basics - Anfänger-Themen 3
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
P Bedingung in Schleife wird nicht ausgeführt Java Basics - Anfänger-Themen 5
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
N package wird doppelt im exporer angezeigt Java Basics - Anfänger-Themen 2
N Bedinugng If-Abfrage wird nie erfüllt Java Basics - Anfänger-Themen 4
M Else wird nicht ausgeführt. Java Basics - Anfänger-Themen 5
H Wie wird ein String intern gespeichert? Java Basics - Anfänger-Themen 10
A char array wird überschrieben Java Basics - Anfänger-Themen 6
E Methoden Action Event wird nicht vollständig ausgeführt Java Basics - Anfänger-Themen 3
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
S setContentView(R.Layout.XXX) wird Rot angezeigt Java Basics - Anfänger-Themen 0
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
S Integer Wert wird nicht übernommen Java Basics - Anfänger-Themen 2
J Int wird als Null ausgegeben Java Basics - Anfänger-Themen 8
F Switch case wird als char nicht erkannt.... Java Basics - Anfänger-Themen 6
S for-Schleife wird ignoriert Java Basics - Anfänger-Themen 15
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
M BorderLayout, 2Panels, EAST wird nicht angezeigt ?? Java Basics - Anfänger-Themen 2
K File wird in der .Jar nicht gefunden Java Basics - Anfänger-Themen 3
J String wird in GUI falsch ausgegeben Java Basics - Anfänger-Themen 10
J JDatePicker: Datum wird nicht in Textfeld übernommen Java Basics - Anfänger-Themen 5
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
J bundel - Datei wird nicht gefunden. Trotz STRG-SHIFT-J Java Basics - Anfänger-Themen 2
T PNG Datei wird nur manchmal geöffnet Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben