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:
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();
}
}