Trotz richtiger Daten, falsches Bild wird gezeichnet?!

mavinatic

Bekanntes Mitglied
Hallo Community,

ich bin momentan dabei ein Server-Client Spiel zu schreiben, bis jetzt geht es nur um die Anzeige der Spielerpositionen...

Wenn ich z.B. 3 Spieler hinzufüge, werden alle 3 Spieler auch gezeichnet, das ist kein Problem, jedoch wenn ich dann einen Spieler entferne, wird er immernoch gezeichnet, obwohl die Ausgabe des Arrays bestätigt, dass es dann nur noch 2 Spieler sind!

Was mache ich falsch?


In dieser Datei wird alles gezeichnet:
Java:
package org.game.gui;


import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.net.Socket;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

import org.game.client.DataHandler;
import org.game.client.SharedData;
import org.game.ressource.Player;

public class MainPanel extends JPanel {
	/*
	 * GameInfo
	 */
	private DataHandler handler = null;
	private Player[] currentPlayers = null;
	private SharedData data = null;
	
	/*
	 * Graphical Inits.
	 */
	private Image backBuffer = null;
	Image img = null; // TestImage
	
	public MainPanel(SharedData data, Socket socket) throws Exception
	{
		this.data = data;
		this.handler = new DataHandler(socket, this);
		testPrepare();
		init();
		gameloop();
	}
	
	private void testPrepare() {
		handler.send("POST /createGame?name="+data.getCurrentGameName()+"&maxPlayers=10 URLGS/1.0");
		handler.send("POST /addNewPlayer?playerName="+data.getCurrentPlayerName()+"&playerPositionX=500&playerPositionY=52&game="+data.getCurrentGameName()+" URLGS/1.0");
//		handler.closeConnection(data.getCurrentGameName(), data.getCurrentPlayerName());
	}
	
	/*
	 * Initialisieren
	 * Spielname festlegen
	 * 
	 * Spieler / Position abfragen
	 */
	public void init()
	{
		setDoubleBuffered(false);
		
		try {
			img = ImageIO.read(new File("pic/blue.PNG"));
		} catch(Exception e)
		{
			e.printStackTrace();
		}
		
		handler.recieve();
		handler.send("GET /commonRequest?game=XYZ URLGS/1.0");
		
		//Draw BackBufferImage
		renderScreen();
		//Set BackBuffer to Front
		updateScreen();
	}
	
	private void gameloop()
	{
		Thread loop = new Thread() {
			@Override
			public void run() 
			{
				try
				{
					while(true)
					{
						handler.send("GET /refreshPositionGet?game=XYZ URLGS/1.0");
						renderScreen();
						updateScreen();
						Thread.sleep(1000);
					}
				} catch(Exception e)
				{
					e.printStackTrace();
				}
			}
		};
		loop.start();
	}
	/*
	 * 
	 * 
	 * Graphic Methods
	 * 
	 * 
	 * 
	 */
	public void renderScreen()
	{
		if(backBuffer==null)
		{
			createBackBuffer();
		} else
		{
			Graphics graph = backBuffer.getGraphics();
			
			if(currentPlayers!=null)
			{
				System.out.println(currentPlayers.length);
				for(int i=0;i<currentPlayers.length;i++)
				{
					graph.drawImage(img, currentPlayers[i].getX(), currentPlayers[i].getY(), this);
				}
			}
			
		}		
	}
	
	public void updateScreen()
	{
		Graphics g = getGraphics();
		if(g!=null)
		{
			if(backBuffer!=null)
			{
				g.drawImage(backBuffer, 0, 0, null);
			} else 
			{
				createBackBuffer();
				renderScreen();
			}
		}
	}
	
	private void createBackBuffer() 
	{
		if(backBuffer==null)
		{
			backBuffer = createImage(getWidth(), getHeight());
		} else
		{
			backBuffer = createImage(getWidth(), getHeight());
		}			
	}
	
	
	/*
	 * GETTER & SETTER
	 */
	public void setPlayers(Player[] players)
	{
		this.currentPlayers = players;
	}
	public DataHandler getDataHandler()
	{
		return this.handler;
	}
}

Bei der Console von Eclipse, erkennt man die Zahl 2, welche für aktuelle Spieler steht, jedoch werden immernoch 3 gezeichnet?! Die Zahl 2 kommt vom Server, welche via XML-Daten an den Client schickt.
gsscreenshot01.jpg
 
S

SlaterB

Gast
du malst auf den Bild die neuen Kreise, aber der alte bleibt auch, warum sollte der verschwinden?
fülle das Bild bei jedem Zeichnen intitial mit einem großen weißen Rechteck um zu löschen

auch schön testweise ist nicht zu löschen und nach jeder Sekunde in der Thread-Schleife einen Versatz einzubauen, male jeweils 100 Pixel weiter unten,
dann solltest du zuerst oben die drei Kreise sehen, später in unteren Zeilen nur noch zwei oder ähnliches

--------
ansonsten:

Java:
        if(backBuffer==null)
        {
            backBuffer = createImage(getWidth(), getHeight());
        } else
        {
            backBuffer = createImage(getWidth(), getHeight());
        }
ist ja nicht sehr sinnvolle Unterscheidung..


wichtiger:
streiche updateScreen(), rufe NIE getGraphics() von einer Swing-Komponente auf,
überschreibe die paintComponent-Methode, wie es in jedem Lehrbuch zum Thema steht..
(wie kommt es nur immer wieder zu anderen Varianten?..)
in der paint-Methode male das Bild, wenn nicht vorhanden könntest du auch gar nichts machen, musst nicht unbedingt das Bild anlegen,
im Moment legst du es in updateScreen() evtl. an, malst es dann aber nicht, das bringt ja auch wenig..

um das normale painten zu starten muss in der Schleife repaint() aufgerufen werden,

siehe auch meine beiden Links in
http://www.java-forum.org/awt-swing-swt/124900-thread-zeichnen.html#post809721
immerhin der Thread ist hier ja schon schön gelungen ;)
 

mavinatic

Bekanntes Mitglied
Du hast recht, dass das es keine sinnvolle Unterscheidung war mit der If-Abfrage, aber da habe ich einfach was gelöscht (backbuffer = null);

Warum ist es so schlimm sich mit getGraphics() das Grafik-Objekt zu holen?

Danke für den Tipp :)
 
S

SlaterB

Gast
schlecht ist es z.B. weil das normale painten immer noch besteht und dir vielleicht alles löscht, wann immer paint drankommt,
was im Zweifel unvorhersehbar ist,

das ist so als wenn du einen Aufzugssystem nutzt (Swing), dann aber nicht in den normalen Fahrstuhl (paint) einsteigst,
sondern selber da kreuz und quer rumkletterst wie John McClane ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Trotz richtiger ListSelectionMode kann ich keine Zeile sel? AWT, Swing, JavaFX & SWT 4
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
M editorPane bleibt zu klein trotz setPage AWT, Swing, JavaFX & SWT 6
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
A Swing Buttons werden trotz setVisible nicht dargestellt AWT, Swing, JavaFX & SWT 14
T Flackern trotz DoubleBuffering AWT, Swing, JavaFX & SWT 8
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
G Komponenten vergrößern sich nicht trotz Layoutmanager AWT, Swing, JavaFX & SWT 24
U Swing NullPointerException trotz Referenz auf Textfield & Button AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
A trotz setSize keine breite AWT, Swing, JavaFX & SWT 4
K AWT flackern trotz buffering AWT, Swing, JavaFX & SWT 4
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
0 JTextPane copy/paste trotz editable(false) ? AWT, Swing, JavaFX & SWT 10
C Applet java.security.AccessControlException trotz signierten Jar AWT, Swing, JavaFX & SWT 7
J Swing JWindow flackert trotz Doppelpufferung AWT, Swing, JavaFX & SWT 2
B Swing JButton flackert trotz DoubleBufferings AWT, Swing, JavaFX & SWT 11
K Flackern trotz Double-Buffering AWT, Swing, JavaFX & SWT 10
S Swing JTable RowSorter trotz RowFilter abschalten? AWT, Swing, JavaFX & SWT 2
T Fenster wird trotz repaint() und revalidate() nicht sofort neu gezeichnet AWT, Swing, JavaFX & SWT 6
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
B JProgressbar wird nicht aktualisert, trotz Threads AWT, Swing, JavaFX & SWT 6
F Java heap space error trotz -Xmx512m AWT, Swing, JavaFX & SWT 9
O JFrame permanet im Vordergrund trotz Alt+Tab AWT, Swing, JavaFX & SWT 2
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G Tabellenköpfe trotz Scrollpane ausschalten AWT, Swing, JavaFX & SWT 5
T JFrame#setSize trotz maximiert AWT, Swing, JavaFX & SWT 4
T Animation will nicht trotz Thread. AWT, Swing, JavaFX & SWT 14
S JFrame trotz undecorated vergroessern AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Optik trotz gleicher Look and Feel Code? AWT, Swing, JavaFX & SWT 11
T repaint wird trotz Thread nicht ausgeführt AWT, Swing, JavaFX & SWT 5
G Leider trotz allem kein Icon :( Brauche Hilfe AWT, Swing, JavaFX & SWT 3
S animation Flackern trotz doppelpufferung wieso? AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Objectmarker am Bildschirmrand(Repost in richtiger Section) AWT, Swing, JavaFX & SWT 0
E Drucken von JPanel mit richtiger Skalierung AWT, Swing, JavaFX & SWT 5
A Richtiger Umgang mit jProgressBar AWT, Swing, JavaFX & SWT 2
A Savedialog - getSelectedFile() mit richtiger Endung. AWT, Swing, JavaFX & SWT 8
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
W Nullpointer Exception beim übertragen von Daten von Scene zu Scene AWT, Swing, JavaFX & SWT 6
W Daten von Controller zu Controller übertragen AWT, Swing, JavaFX & SWT 7
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
T Anbinden der Tabelle an die Daten AWT, Swing, JavaFX & SWT 5
F JavaFX Tabelle mit Daten füllen AWT, Swing, JavaFX & SWT 9
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Daten zwischen Controllern austauschen- neue Frage AWT, Swing, JavaFX & SWT 7
ralfb1105 JavaFX Daten zwischen Controller "austauschen" AWT, Swing, JavaFX & SWT 65
B AWT Bot um Daten auf Website einzugeben und die Antwort zu bekommen AWT, Swing, JavaFX & SWT 2
L Daten bearbeiten ohne GUI zu blockieren - daten haltung/zurück geben AWT, Swing, JavaFX & SWT 15
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
ralfb1105 Swing Dynamischer Graph zum anzeigen Perfomance Daten AWT, Swing, JavaFX & SWT 35
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
K TreeTableView (cellFactory) - wie Daten in Spalten einfügen AWT, Swing, JavaFX & SWT 0
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
J TableView Daten werden nicht ausgegeben AWT, Swing, JavaFX & SWT 9
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
C Swing Daten in JTable wiedergeben per TableModel und MVC Pattern AWT, Swing, JavaFX & SWT 16
T JavaFX Model Daten übergeben AWT, Swing, JavaFX & SWT 4
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
J JavaFX Tableview Daten hinzufügen aus anderer Klasse AWT, Swing, JavaFX & SWT 7
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
G Event Handling TableView daten in ein neues Fenster herauslesen? AWT, Swing, JavaFX & SWT 3
S JavaFX (Best Practise) Daten zwischen Controllern austauschen AWT, Swing, JavaFX & SWT 1
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
L JavaFX Verzögerung beim Laden von Daten AWT, Swing, JavaFX & SWT 6
L Daten in neuem Fenster AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX Daten an WebView Komponente AWT, Swing, JavaFX & SWT 1
I JTable: Doppelklick auf Table soll neues Fenster öffnen und Daten aus JTable anzeigen AWT, Swing, JavaFX & SWT 4
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
M Java FX Daten an Controller übergeben AWT, Swing, JavaFX & SWT 3
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JavaFX Von FXML-Controllerdatei Daten zurückgeben AWT, Swing, JavaFX & SWT 6
F JavaFX Daten aus Tabelle in ComboBox AWT, Swing, JavaFX & SWT 9
B Swing JTable mit Daten - Reihen-Größe anpassen AWT, Swing, JavaFX & SWT 0
D Applet GWT speichert Daten nicht in Datenbank AWT, Swing, JavaFX & SWT 2
S SWT In Listen den Einträgen Daten zuordnen AWT, Swing, JavaFX & SWT 2
T SWT Table (mit Spinner Spalte) Daten auslesen AWT, Swing, JavaFX & SWT 4
F Swing JTable: Daten voreinstellen AWT, Swing, JavaFX & SWT 4
B Daten in eine JTable schreiben AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
J valueChanged()-Methode liefert unbrauchbare Daten AWT, Swing, JavaFX & SWT 4
B Datenübergabe zwischen Tabs und Daten speichern AWT, Swing, JavaFX & SWT 2
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
D Daten von JDialog an JTable in JFrame übergeben AWT, Swing, JavaFX & SWT 7
O JTable zeigt die alte Daten wieder AWT, Swing, JavaFX & SWT 23
H JTable zeigt keine Daten an AWT, Swing, JavaFX & SWT 5
M Swing Daten von JPanel zu JFrame senden AWT, Swing, JavaFX & SWT 13
C Swing JTable Daten einfügen AWT, Swing, JavaFX & SWT 6
Ollek IndexOutOfBoundsException bei neuen Daten in JTable AWT, Swing, JavaFX & SWT 13
J Swing JTable-Daten Speichern und bei zeilen-änderung beibehalten. AWT, Swing, JavaFX & SWT 6
A Daten umherschieben zwischen zwei Klassen AWT, Swing, JavaFX & SWT 40
L [SWT] Daten und Bilder drucken AWT, Swing, JavaFX & SWT 2
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
C Daten aus DB -> JTable aktualisieren klappt nicht AWT, Swing, JavaFX & SWT 16
A Swing(Daten zugreifen) AWT, Swing, JavaFX & SWT 25
S JComboBox - veränderliche Daten AWT, Swing, JavaFX & SWT 6
T Daten mittels ComboBox in ein JTable adden AWT, Swing, JavaFX & SWT 7
Ollek Realisierung: JTable zur Laufzeit mit neuen Daten füllen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben