Fehler mit dem Hintergrund

Cruyff

Mitglied
Tag ich habe ein JFrame auf dem ein Kreis wandern soll mit einem Hintergrundbild, jedoch wird das Bild nur kurz angezeigt und verschwindet dann wieder.

Hier mal der Code:
Code:
package Test;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Hintergrundbild extends JFrame{
	private static final ImageIcon BackgroundPanel = new ImageIcon("c:/Sonnenuntergang.jpg");
		;
	// Initialisierung der Variablen
	int x_pos = 30;			// x - Position des Balles
	int y_pos = 100;		// y - Position des Balles
	int x_speed = 1;		// Geschwindigkeit des Balles in x - Richtung
	int radius = 20;		// Radius des Balles
	int appletsize_x = 300; // Größe des Applets in x - Richtung
	int appletsize_y = 300;	// Größe des Applets in y - Richtung

	// Variablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;
	 Image puffer;
	static Image backImage;
	Dimension alte_große;
	Insets einfugen;

	static Hintergrundbild wnd = new Hintergrundbild();
	

  	public Hintergrundbild() {
		super("BackgroundImageExample");
  		setDefaultCloseOperation(EXIT_ON_CLOSE);
  
  		add(new BackgroundPanel(new ImageIcon("c:/Sonnenuntergang.jpg")));
  		setResizable(false);
  		 
  		pack();
  		setVisible(true);
  	}
  
  	class BackgroundPanel extends JPanel {
  		ImageIcon icon;
  
  		public BackgroundPanel(ImageIcon icon) {
  			this.icon = icon;
  		}
   		protected void paintComponent(Graphics g) {
  			super.paintComponent(g);
  			if (this.icon != null) {
 				g.drawImage(icon.getImage(), 0, 0, this);
  			}
  		}
   		public Dimension getPreferredSize() {
  			if (icon != null) {
 			    return new Dimension(icon.getIconWidth(), icon.getIconHeight());
  			} else {
 				return super.getPreferredSize();
  			}
  		}
  	}
	public void update (Graphics g)
	{
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}
		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
	public void paint(Graphics g) {
	
		if ((alte_große == null) || (alte_große != getSize())) {
			alte_große = getSize();
			puffer = new BufferedImage(getWidth(), getHeight(),
					BufferedImage.TYPE_INT_RGB);
		}
		if (einfugen == null) {
			einfugen = getInsets();
		}
		// berechnung der farben in den einzelnen teilen
		int x = einfugen.left;
		int y = einfugen.top;
		int width = getWidth() - einfugen.left - einfugen.right;
		int height = getHeight() - einfugen.top - einfugen.bottom;
		  synchronized (puffer) {
		      Graphics bufferG = puffer.getGraphics();
//		      bufferG.setColor(Color.RED);
//		  	bufferG.drawImage (backImage,x, y, width, height,null);	
				  
		      bufferG.setColor(Color.green);			      
		      bufferG.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
		  	add(new BackgroundPanel(new ImageIcon("c:/Sonnenuntergang.jpg")));
			
		    }
		    g.drawImage(puffer, 0, 0, this);	
		  	add(new BackgroundPanel(new ImageIcon("c:/Sonnenuntergang.jpg")));
	}
	public void go() {
		TimerTask task = new TimerTask() {

			public void run ()
			{
				// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
				Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

				// Solange true ist läuft der Thread weiter
				while (true)
				{
					// Wenn der Ball den rechten Rand berührt, dann prallt er ab
					if (x_pos > appletsize_x - radius)
					{
						// Ändern der Richtung des Balles
						x_speed = -1;
					}
					// Ball brührt linken Rand und prallt ab
					else if (x_pos < radius)
					{
						// Ändern der Richtung des Balles
						x_speed = +1;
					}
					// Verändern der x- Koordinate
					x_pos += x_speed;

					// Neuzeichnen des Applets
					repaint();
					try
					{
						// Stoppen des Threads für in Klammern angegebene Millisekunden
						Thread.sleep (20);
					}
					catch (InterruptedException ex)
					{
						// do nothing
					}
					// Zurücksetzen der ThreadPriority auf Maximalwert
					Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
				}
			}};
		Timer timer = new Timer();
		timer.schedule(task, 0);
	}
	public static void main(String args[]) {
		wnd.setSize(300, 300);	
		wnd.setVisible(true);
		wnd.go();
	}
}
 
Zurück