2D-Grafik Background Image Klasse

JSCHLAG

Mitglied
Guten Morgen liebe User,

ich habe ein Problem. Unsere Informatiklehrerin hat uns ins kalte Wasser geschmissen und fordert uns auf ein Programm zu erstellen, in dem eine Klasse eine GUI und eine Klasse für das Hintergrund zuständig ist. Ich habe mir schon reichlich Beiträge dazu angeschaut, verstehe es trotzdem nicht, wie ich die Background Image Klasse programmieren soll und wie ich sie in die GUI Klasse integriere bzw auf die GUI daraufbekomme. Die GUI habe ich selber probiert zu programmieren:

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

public class PGUI extends JFrame {

public PGUI() {
super();
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
int frameWidth = 600;
int frameHeight = 600;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setTitle("PGUI");
setResizable(false);
Container cp = getContentPane();
cp.setLayout(null);

setVisible(true);
}

public static void main(String[] args) {
new PGUI();
}
}

Würde mich auf hilfreiche Antworten freuen, da mir dieses Projekt sehr wichtig ist, da ich zurzeit auf 14pkt stehe.
 
@truesoul ich weiß ja wie man eine frame erstellt, wenn man das so behaupten kann. Ich verstehe nur nicht wie man eine Klasse zum Hintergundbild zeichnen programmiert und in die GUI einbindet.
 
Hallo.

Ja und warum googlest du nicht danach 🙂 ?

Zum Beispiel nach: "java swing set background image" oder "java swing drawimage"

Grüße
 
Ich habe jetzt eine Background Image Klasse und eine GUI erstellt. Jedoch ist meine Frame unerklärlich klein und zeigt kein Bild an.

GUI Class: PGUI.java
Code:
import javax.swing.JFrame;

public class PGUI{
public PGUI() {
PWorld panell = new PWorld();
JFrame frame = new JFrame();
frame.getContentPane().add(panell);
frame.pack();
frame.setVisible(true);
}

public static void main(String[] args) {
new PGUI();
}
}

Background Class: PWorld.java:
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class PWorld extends JPanel {
Image img;

public PWorld(){
img = Toolkit.getDefaultToolkit().createImage("/bilder/pbackground.jpg");
}

public void paint(Graphics g){
g.drawImage(img, 0, 0, null);
}
}
 
Zuletzt bearbeitet:
1. paintComponent(Graphics g) überschreiben - nicht paint(Graphics g)
2. Du gibst deinem JFrame keine Größe mit. Hinweis: setSize(width,height)
3. Entweder machst du das pack() weg oder gibst deinem Hintergrund-Panel eine PreferredSize setPreferredSize(Dimension dim)
 
@Robat Schritt 2 und 3 haben perfekt geholfen. Jedoch verstehe ich nicht was du mit überschreiben meinst. Mir wird desweiteren kein Hintergrundbild angezeigt...

GUI Class: PGUI.java
Code:
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class PGUI{
        public PGUI() {
            PWorld panell = new PWorld();
            JFrame frame = new JFrame();
            frame.setSize(300,300);
            frame.getContentPane().add(panell, BorderLayout.CENTER);
            frame.setLocationRelativeTo(null);
           
            frame.setVisible(true);
        }
       
        public static void main(String[] args) {
            new PGUI();
        }
}

Background Class: PWorld.java:
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class PWorld extends JPanel {
    Image img;
   
    public PWorld(){
        img = Toolkit.getDefaultToolkit().createImage("/bilder/pbackground.jpg");
    }

    public void paintComponent(Graphics g){
        g.drawImage(img, 100, 100, null);
    }
}
 
"Überschreiben" bedeutet in dem Fall dass du eine Methode aus der Mutterklasse nimmst und die konkrete Implementierung für diese Klasse änderst.
Und genau das ist dein Problem.
Du erbst von JPanel. Da JPanel selber von JComponent erbt (eine andere Klasse) hast du die Möglichkeit, Methoden aus dieser Klasse abzuändern.
In der Klasse JComponent gibt es eine Methode mit folgender Signatur: protected void paintComponent(Graphics g). Wenn du jetzt ein Hintergrundbild zeichnen willst musst du genau diese Methode überschreiben.
Bedeutet also du solltest protected statt public schreiben.

Außerdem muss die erste Zeile in der Methode wie folgt lauten:
Java:
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    // hier folgen deine Zeichnungen
}

Danach solltest du eigentlich auch in der Lage sein dein Hintergrundbild zu sehen.

Kleiner Tipp:
In Java gibt es so genannte Annotationen die einem in vielen Fällen das Leben erleichtern.
Wenn du vor eine Methode die überschrieben werden soll die Annotation @Override setzt dann schaut der Compiler für dich ob es in den Oberklassen eine Methode mit dieser Signatur gibt. So wirst du leichter auf Schreibfehler aufmerksam 🙂

Java:
@Override
protected void paintComponent(Graphics g) {
     super.paintComponent(g);
     // ...
}
 
@Robat erstmal vielen Dank für deine ausführliche Hilfe mit Erklärungen, jedoch wird mir noch immer kein Bild angezeigt...

GUI Class: PGUI.java
Code:
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

public class PGUI{
        public PGUI() {
            PWorld panell = new PWorld();
            JFrame frame = new JFrame();
            frame.setSize(300,300);
            frame.getContentPane().add(panell, BorderLayout.CENTER);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
       
        public static void main(String[] args) {
            new PGUI();
        }
}

Background Class: PWorld.java:
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class PWorld extends JPanel {
    Image img;
   
    public PWorld(){
        img = Toolkit.getDefaultToolkit().createImage("D:/WorkJava/Pou/bin/bilder/pbackground.jpg");
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 100, 100, null);
    }
}
 
Wenn du nach dem Start die Größe des Fensters veränderst solltest du das Bild sehen.
Das liegt mMn an der Verwendung von Toolkit.getDefaultToolkit().createImage(..) welche, soweit ich weiß, das Bild in einem separaten Thread lädt.

Wenn du nicht zwingend auf diese Variante angewiesen bist würde ich dir empfehlen das Bild lieber über ImageIO.read(new File("your path")) zu laden.
Das passiert dann im selben Thread.
 
@Robat das
Code:
img = ImageIO.read(new File("D:/WorkJava/Pou/bin/bilder/as.jpg"));
gibt einen Fehler aus: Unhandled Exception type IOException.

Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.io.File;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class PWorld extends JPanel {
    Image img;
   
    public PWorld(){
        img = ImageIO.read(new File("D:/WorkJava/Pou/bin/bilder/as.jpg"));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}
 
@truesoul vielen Dank😀. Das Try Catch bringt alles jetzt so wie ich will zum Laufen. Vielen Dank an alle die mir geholfen haben😛 @Robat @VfL_Freak @truesoul .
GUI Class
Code:
import java.awt.BorderLayout;
import javax.swing.JFrame;

public class PGUI{
        public PGUI() {
            PWorld panell = new PWorld();
            JFrame frame = new JFrame();
            frame.setSize(900,900);
            frame.getContentPane().add(panell, BorderLayout.CENTER);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
       
        public static void main(String[] args) {
            new PGUI();
        }
}
BG Class
Code:
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class PWorld extends JPanel {
    Image img;
   
    public PWorld(){
        try{
            img = ImageIO.read(new File("D:/WorkJava/Pou/bin/bilder/pbackground.jpg"));}
        catch(IOException e){System.out.println(e.getMessage());}
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(img, 0, 0, null);
    }
}
 

Zurück
Oben