paint() verzögern

Solor

Aktives Mitglied
Hallo liebes Java-Forum,
stehe heute vor einem neuen Problem:
Ich habe eine Klasse , die aus einem int[][]-array ein Bild erstellt. Dieses Bild wird in der Klassenvariable picture vom Typ BufferedImage gescpeichert. Ich habe noch meine MainPanel in dem ich das alles zeichnen lasse. Dafür habe ich eine doInitialazations()-Methode geschrieben, in der ein Objekt von meiner ArrayZuBild-Klasse erstellt wird und das Bild erstellt wird. Diese Methode rufe ich im Konstruktor der MainPanel-KLasse auf. In der PaintMethode zeichne ich dann das Bild über
Java:
g.drawImage(Objektname.picture, 0, 0, this)
Um zu meinem Problem zu kommen: Die Paint-Methode wird aufgerufen, bevor ich ein Objekt von der ArrayZuBild-Klasse angelegt habe und wirft dementsprechend eine Null-Pointer-Exception. Wie kann ich das umgehen bzw. den Aufruf der paint-Methode verzögern?
 
Zuletzt bearbeitet:
Ich erstelle ein Int[][]-array mit zufälligen Zahlen. Das wandle ich dann in ein Bild um
Java:
BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = buf.getGraphics();
for (int x = 0; x < width; x++)
{
	for (int y = 0; y < height; y++)
	{
		if (array[x][y] < 1)
		{
			g.setColor(Color.black);
		}
		else
		{
			g.setColor(Color.white);
		}
		g.drawLine(x, y, x, y);
	}
}
picture = buf;
 
Zuletzt bearbeitet:
Ahso, wenn es das vorher gar nicht gibt ist das was anderes. Da braucht man aber kein boolean, ein

if (xxx.image != null) g.drawImage(xxx.image...);

sollte es ja schon tun...
 
das hatte ich auch schon probiert...aber da kam eine nullPointerException von diesem abgleich. Deshalb habe ich das jetzt so gelöst, dass am Ende der doInitialazation()-Methode eine Variable auf true gesetzt wird und ich eben die überprüfe.
Wenn du irgendwie noch Verbesserungsvorschläge hast, wie ich meinen Code besser gestalten kann dann sag das bitte, von sowas habe ich (leider) bisher noch nicht so die echte Ahnung.
 
Wenn da eine NPE fliegt, dann muss "Objektname" auch noch null gewesen sein, und der Test müßte eben
if (Objektname != null) ...
sein, aber ... mit so kleinen Pseudocodestücken kann man da nicht viel mehr dazu sagen...
 
Okee wenn du meinst...dann hast du hier meinen ganzen Code.
Java:
package data;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GamePanel extends JFrame implements Runnable, KeyListener{
	Map map;
	int width = getToolkit().getScreenSize().width;
	int height = getToolkit().getScreenSize().height;
	boolean paint = false;
	public GamePanel()
	{
		super("Game Frame");
		setPreferredSize(new Dimension(width, height));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		pack();
		setVisible(true);
		doInitialazations();
	}
	public void paint(Graphics g)
	{
		if (paint)
		{
			g.drawImage(map.mapPicture, 0, 0, this);			
		}
		else
		{
			g.drawString("LOADING...", 15, 50);
		}
	}
	public static void main(String[] args)
	{
		GamePanel gp = new GamePanel();
	}
	public void doInitialazations()
	{
		map = new Map(width, height);
		map.genMap();
		Thread th = new Thread(this);
		th.start();
		paint = true;
	}
	public void run()
	{
		while (true)
		{
			repaint();
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
und hier:
Java:
package data;

import java.util.*;
import java.awt.*;
import java.awt.image.BufferedImage;

public class Map {
	int[][] map;
	int height;
	int width;
	BufferedImage mapPicture;
	public Map (int width, int height)
	{
		map = new int[width][height];
		this.width = width;
		this.height = height;
	}
	private void setMaterial(int x, int y, int material)
	{
//		System.out.println("X: " + x + " / " + width+ " Y: "+y + " / " + height);
		map[x][y] = material;
	}
	public void genMap()
	{
		Random r = new Random();
		for (int iy = 0; iy < height; iy++)
		{
			for (int ix = 0; ix < width; ix++)
			{
				setMaterial(r.nextInt(6));
			}
		}
		MaptoImage();
	}
	public void MaptoImage()
	{
		BufferedImage buf = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		Graphics g = buf.getGraphics();
		for (int ix = 0; ix < width; ix++)
		{
			for (int iy = 0; iy < height; iy++)
			{
				if (map[ix][iy] < 5)
				{
					g.setColor(Color.black);
				}
				else
				{
					g.setColor(Color.white);
				}
				g.drawLine(ix, iy, ix, iy);
			}
		}
		mapPicture = buf;
	}
   }
 
erst ab setVisible(true) wird gezeichnet,
wenn du das rechtschreiblich schlimme doInitialazations() davor setzt, dann gibts in der Hinsicht kein Problem,
freilich wird solange gar nichts von der GUI zu sehen sein
 

Zurück
Oben