ImageIcon auf JPanel wird nicht angezeigt(keiner Fehlermeldung)

larsz98

Mitglied
Hallo liebe Forumuser,

ich bräuchte eure Hilfe bei folgendem Code:

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

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

public class Spiel extends JPanel{

    Image img;
   
    String pfad="Bilder/Hintergrundbild"; //Hier ist es egal ob "\\" oder "\" oder "/"
   
    public Spiel(){
        setFocusable(true);
        ImageIcon Icon=new ImageIcon(pfad +".jpg");
        img=Icon.getImage();
       
    }
   
    public void paint(Graphics g){
        super.paint(g);
        Graphics2D f2 = (Graphics2D) g;
       
        f2.drawImage(img,0,0,null);
    }
}

Es wird dabei, jedenfalls bei mir, kein Bild angezeigt. Kann mir einer von euch dabei helfen. Diese Klasse wird von einer anderen aufgerufen. Bei Bedarf stelle ich auch diese rein. Hier nur der Ausschnitt, an der die Klasse aufgerufen wird:

Java:
    private void fenster() {
        JFrame MainGame=new JFrame("Main Game");
        MainGame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MainGame.setSize(800,600);
        MainGame.setLayout(null);
        MainGame.setVisible(true);
        MainGame.add(new Spiel());


Im Vorraus schon mal ein großes Danke für jegliche Hilfe!

Mit freundlichen Grüßen,
Lars
 
Dafür gibt es gleich mehrere mögliche Fehlerursachen:
1. Du hast paint überschrieben, nicht paintComponent. Das muss zwar nicht zwangsläufig ein Fehler sein, ist aber trotzdem nicht empfehlenswert.
2. Dein MainGame hat ein null-Layout. Deshalb musst du die Größe und Position von Spiel von Hand setzen.
3. Das Bild wird nicht gefunden. Du kannst ja mal überprüfen, ob
Java:
new File(pfad +".jpg").exists()
true zurückgibt.
 
Danke für die schnelle Antwort.
Punkt 1 habe ich bearbeitet.
Zu Punkt 2 : Es erscheint ein Fenster mit den Größen 800,600
Zur Punkt3 : Es gibt false aus. Habe es gerade nochmal mit allen Variationen ausprobiert, es hat allerdings nichts genützt. Jedes Mal "false".
 
Zu Punkt 2 : Es erscheint ein Fenster mit den Größen 800,600
Das ist ja gut und schön, hat aber mit meinem Hinweis nichts zu tun. Das Fenster ist lediglich der Container, in dem das JPanel liegt. Selbst wenn das Fenster 800,600 groß ist, kann das JPanel immer noch eine Größe von 0,0 haben und wird damit nicht angezeigt.
Zur Punkt3 : Es gibt false aus. Habe es gerade nochmal mit allen Variationen ausprobiert, es hat allerdings nichts genützt. Jedes Mal "false".
Und brauchst du jetzt Hilfe dabei, eine Datei an den angegebenen Ort zu bringen?😵
 
Zuletzt bearbeitet:
Und brauchst du jetzt Hilfe dabei, eine Datei an den angegebenen Ort zu bringen?😵
So traurig das jetzt klingt, ich denke schon.. Ich poste mal als Bild meine Struktur der Ordner..
Vielleicht findest du meinen Fehler.



tYzLGv7.jpg

Zur Erinnerung: Mein angegebener Pfad lautet: /Bilder//Hintergrundbild.jpg
 
Hab zwar nicht viel Ahnung was den Bilderbereich angeht, aber rein logisch gesehen bist du ja im "Default package" Verzeichnis mit deinem Programm.
Dein "Bilder" Verzeichnis liegt nicht IN deinem default Verzeichnis sondern NEBEN diesem...
Daher würde ich einfach mal versuchen bei der Pfadangabe ein Verzeichnis höher zu suchen, sodass dein Pfad dann "../Bilder/Hintergrundbild.jpg" lauten würde...
Sollte das nicht funktionieren hattest du wenigstens einen Zeitvertreib bis jemand mit mehr Ahnung zur Thematik antworten konnte😀
 
Sollte funktionieren, wenn der Ordner Bilder im Projektordner ist, also im gleichen Ordner wie bin, src etc., da du Eclipse benutzt. Habe das ganze mittels File.exists() getestet.

Mit freundlichen Grüßen
Xelsarion
 
Gut, danke! Bei mir spunkt File.exists() nun auch true raus.
Jedoch wird das Bild nicht angezeigt. Habe auch schon ein Bild selbst gemacht mit der Größe 800|600.
Bringt jedoch auch nichts.

panel.setPreferredSize(new Dimension(800,600));
Auch die Methode preferredSize() hilft nicht weiter.
Wie kann ich also die Größe eines Panels anpassen?

Hier meiner "neuer" Code:
Java:
package game_package;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class Spiel extends JPanel{

    private Image img;
    JPanel panel = new JPanel();
    String pfad="Bilder//hintergrundbild"; //Hier ist es egal ob "\\" oder "\" oder "/"
    ImageIcon icon;
    public Spiel(){
        panel.setPreferredSize(new Dimension(800,600));
        setFocusable(true);
        try {
            icon= new ImageIcon(pfad+ ".png");
            img= icon.getImage();
        } catch (Exception e) {
            System.out.println("Funktioniert nicht.");        }
   
       
        //img=Icon.getImage();
        System.out.println(new File(pfad + ".png").exists());
       
    }
   
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D f2 = (Graphics2D) g;
       
        f2.drawImage(img,0,0,panel);
    }
}
 
Zuletzt bearbeitet:
Das Problem liegt unter anderem auch daran das dein JFrame ein "null"-Layout bekommen hat.
Eine wichtige Regel -> verwende niemals das "null"-Layout.

Du hast nun ein Fenster das 800*600 groß ist, ein JPanel mit Bild das 800*600 groß ist. Da du ein "null"-Layout hast müsstest du ihm eigentlich noch angeben wo es gezeichnet werden soll also x/y Position.
Würdest du stattdessen einen LayoutManager verwenden, würde sich dieser um die Positionierung kümmern
 
@Xelsarion
Dankeschön für deinen Link, sehr nützlich. Das Buch kennt man als Java Programmierer.

Auch an alle anderen einen großen Dank.
Hier nochmal die Lösung:
Ich erstelle mir jetzt immer ein neues Package. Achtet darauf, dass ihr nicht im Standard-Package programmiert. Einfach direkt am Anfang ein Package erstellen und nicht im "default-package" programmieren.
Ihr initialisiert das Bild mit
Code:
//allgemeine Formel:
img= new Image("anderesPackage/name_des_bildes.jpg/.png");

//Beispiel:
img= new Image("img/gegner_img.png);

Ihr müsst auch nicht wie ich das gemacht habe mit Graphics2D oder dem ImageIcon arbeiten.
g.drawImage(img,x,y,..) reicht vollkommen!

So ist euer Bild auch noch nach dem Export des Projektes vorhanden.

Viel Spaß und vielen Danke an die kompetente Hilfe alle Helfer in dem Forum!!

Mit freundlichen Grüßen,
Lars
 

Neue Themen


Zurück
Oben