Pong Clone: Problem mit .gif-Dateien auf JPanel

sharp

Grünschnabel
Guten Abend.

Ich sitze zur Zeit an einem Pong Clone. Meine GUI habe ich mit einem JFrame gebaut. So weit so gut. Der Teil der mir zu schaffen macht ist folgender: Ich möchte 5 verschiedene .gif/.jpg-Dateien auf mein Hauptfenster zeichnen. 2 Schläger, 1 Ball, den Hintergrund und ein paar Steine. Ich habe schon mehrere Implementierungen versucht. Bis auf das Einfügen des Hintergrundbildes sind alle gescheitert. Hierbei habe ich das Bild mit ImageIO geladen und als contentPane gesetzt. Nun meine Frage; Wie bekomme ich die restlichen Elemente auf meine GUI? Habe mir das so vorgestellt, dass ich am Ende eine Klasse habe in der alle Objecte gezeichnet werden, auf dessen repaint-Funktion ich am Ende mittels eines Threads zugreifen kann. Bei meinen Versuchen bin ich des Öfteren auf das DoubleBuffering gestoßen, um bei späterer Bewegung der Elemente eine Verzerrung oder Verwischung zu vermeiden.

Bei Bedarf reiche ich gern meinen jetzigen Quellcode noch nach. Wäre schön, wenn ihr mir ein paar Ansätze geben könntet.

MfG sharp.

P.s.: Ich hoffe, dass ich das Problem exakt genug erklärt habe *blush*
 
Moin!
Wenn du die Bilder derart zeichnest, da du die paintComponent Methode deiner Komponente ueberschreibst, solltest du eigentlich keine Problem haben
Code:
public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(bild1,x1,y1,this);
        g.drawImage(bild2,x2,y2,this);
 
    }

Falls das nicht klappt, solltest du mal deinen Code posten..

Was Double Buffering angeht, gibt es eigentlich genug Beispiel schon im Netz.. Wenn du damit Problem hast, bzw. es zu sehr flackert, solltest du dein Problem schon ein wenig näher beschreiben..

*grüssle*
MeinerEiner
 
Zuletzt bearbeitet von einem Moderator:
Vielen Dank für deine Antwort schonmal. Folgendes, sobald ich den contentPane mit einem Background setze, werden die Componenten die ich per JPanel danach aufs contentPane zeichnen will, nicht mehr angezeigt.

Quellcode CreateGui.java:
Code:
package gui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;

class CreateGui extends JFrame
{          
  public CreateGui(String title)
  {
    setSize(800, 600);
    setTitle(title);
    Image logo = Toolkit.getDefaultToolkit().getImage("icon.gif");
    setIconImage(logo);
    setResizable(false);
    setContentPane(new Background ("field.jpg"));
    addKeyListener(new Keyboard());
    setVisible(true);
	
    addWindowListener(new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
      {
      quit();
      }
    });
.......
.... im folgenden werden nur noch MenuBar etc. eingefügt.

Quell code background,java:
Code:
package gui;

import java.awt.*;
import java.io.*;
import java.net.*;
import javax.imageio.ImageIO;
import javax.swing.*;
 
class Background extends JPanel
{
    Image image;
 
    public Background(String datei)
    {
        loadImage(datei);
        setBackground(Color.yellow);
    }
 
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        int width = getWidth();
        int height = getHeight();
        int imageWidth = image.getWidth(this);
        int imageHeight = image.getHeight(this);
        int x = (width - imageWidth)/2;
        int y = (height - imageHeight)/2;
        g.drawImage(image, x, y, this);
    }
 
    private void loadImage(String f)
    {
        String fileName = f;
        try
        {
            URL url = getClass().getResource(fileName);
            image = ImageIO.read(url);
        }
        catch(MalformedURLException mue)
        {
            System.out.println(mue.getMessage());
        }
        catch(IOException ioe)
        {
            System.out.println(ioe.getMessage());
        }        
    }
}

Ich möchte nun auf den contentPane der CreateGui noch 3 weitere Graphiken zeichnen lassen, welche am ende auch bewegbar sein müssen, also in einem Thread neu gezeichnet werden. Nun etwas deutlicher?
 
So habe das Ganze nun ersteinmal in einem DummyJFrame probiert, leider erfolglos

Code:
package gui;

import java.awt.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
 
class PaintAllComponents extends JPanel
{
	Image background;
        Image paddle;
	Image ball;
 
    public PaintAllComponents()
    {
        try {
        	background = ImageIO.read(new File("field1.jpg"));
        	paddle = ImageIO.read(new File("paddle.gif"));
     	   	ball = ImageIO.read(new File("ball.gif"));
        	}
        	catch(IOException e) 
        		{
        		e.getMessage();
        	    } 
    }
 
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(background, 0, 0, this);
        g.drawImage(paddle, 0, 220, this);
        g.drawImage(paddle, 775, 220, this);
        g.drawImage(ball, 395, 270, this);
        System.out.println("ZEICHNE!");
     } 
    
    public static void main( String args[] ) {
    	 JFrame f = new JFrame();
    	 f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    	 f.setSize ( 800, 600 );
    	 f.getContentPane().add(new PaintAllComponents());
    	 f.setVisible( true );
    	 }
    }

paint()-Funktion wird zwar aufgerufen, aber nicht angezeigt. HILFE :)
 
Okay das Problem habe ich selbst gelöst. Es lag daran, dass die Dateien im Package lagen und somit der Pfad falsch war. Anfängerfehler :) Jetzt eine neue Frage:"Kann man die obige paint()-Funktion sich in einem Thread beliebig oft erneuern lassen? Wenn ja wie?
 
Zurück