Manchmal grauer Bildschirm; Manchmal nicht

BromBear

Mitglied
Hallo
ich habe seit einer ganzen Weile das Problem das ich bei meinem kleinen Java-Spiel manchmal einen grauen Bildschirm habe und manchmal nicht. Ich habe versucht das Problem herauszufiltern und bin dabei zu der Erkenntnis gekommen, dass wenn ich in meiner Hauptklasse Objekte erstelle
(z.B. "private KeyHandler keyHandler = new KeyHandler(this);"),
dann steigt die Wahrscheinlichkeit einen grauen Bildschirm zu bekommen. Es gibt keine Errors und das Programm läuft super weiter. Man kann alles wie gewohnt ausführen, aber die Graphik blabt aus 🙁
Ich benutze zum Zeichnen in meiner Klasse (extends JPanel) die paintComponent(Graphics g) Methode und habe in meinem Loop unter run() in meinem Loop repaint(); stehen.
Womit kann das zusammenhängen? Wenn ich noch irgentwelchen Code schreiben soll, sagt welchen.

Ich habe einen Dell Inspiron N7110 mit NVidia GeForce GT 525M Graphikkarte. Ich benutze die JavaSE-1.7 Library und habe die neuste Version von Java.
 
hi,
versuch mal, in der paintComponent alles bis auf super.paintComponent(g) auszukommentieren und tu den Code dann zeilenweise dazu und schau, wann der fehler auftritt.
javampir
 
Selbst wenn ich alles rauskommentiere bleibt der Bildschirm nur grau(ist ja eig. auch klar) aber man sieht das es nicht funktioniert, weil der Cursoe manchmal lädt und manchmal nicht. Ich habe eine Methode initCursor():
[Java]private void initCursor(){
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage("res/gui/cursor/Cursor.png");
Cursor c = toolkit.createCustomCursor(image , new Point(this.getX(), this.getY()), "img");
this.setCursor (c);
} [/Java]

wenn die Grafiken nicht laufen läuft der Cursor auch nicht
 
Hi der Fehler ist ganz einfach du benutzt eine "Unpraktische" Methode zum laden der Images.
Java:
Image image = toolkit.getImage("res/gui/cursor/Cursor.png");
Diese Methode starten das laden des Bildes lässt den Thread aber weiter Arbeiten. Da du nun direkt danach das Bild nutzt hat es in diesem Moment nur eine Breite eine Höhe und eine ausgefüllte Grundfläche aber das Bild ist noch nicht gezeichnet.

Wenn du aber alle Bilde mit der ImageIO lädst verschwindet dein Problem von selber da ImageIO den Thread pausiert bis das Bild komplett geladen hat.
Java:
Image img
try {
	img=ImageIO.read("res/gui/cursor/Cursor.png");	
} catch (IOException e) {
        e.printStackTrace();
}

um nicht immer einen try catch Block aufmachen zu müssen kannst du auch eine statische Methode in einer statischen Klasse anlegen.

Java:
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class ImageLoader {
	public static Image loadImage(File file){
		Image img = null;
		try {
			img=ImageIO.read(file);	
		} catch (IOException e) {
		        e.printStackTrace();
		}
		return img;
	}
}

Wenn du die Statische Klasse übernimmst würde dein Code also nun so aussehen.

Java:
private void initCursor(){
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Image image = ImageLoader.loadImage("res/gui/cursor/Cursor.png");
		Cursor c = toolkit.createCustomCursor(image , new Point(this.getX(), this.getY()), "img");
		this.setCursor (c);
	}

Hoffe ich habe alle zufrieden stellend erklärt. 🙂

Gruß Simon
 
Danke für den Tipp, aber es funkioniert immernoch nur manchmal. Ich habe jetzt die paintComponent() Methode geleert. und den Cursor wie oben geladen. Alle anderen erstellten Images habe ich erstmal auskommentiert. Trotzdem lädt der Cursor manchmal, aber nicht immer.
 
Ich habe noch einmal ein bisschen rumprobiert und habe festgestellt, dass selbst bei einem sehr einfachen Programm, dass nur etwas in der Konsole ausgeben soll, wenn die paintComponent Methode mit repaint(); aufgerufen wird, mit einer geringen Wahrscheinlichkeit nicht in die paintComponent Methode gegangen wird und somit nichts ausgegeben wird. Woran könnte das liegen? Ich habe das JRE und JDK bereits neu installiert.
 

Zurück
Oben