drawImage Fehlersuche

Diskutiere drawImage Fehlersuche im AWT, Swing, JavaFX & SWT Bereich.
J

JavaNo0b

Guten Morgen liebe Java Gemeinde,

ich muss morgen leider früh raus und muss meine Suche nun ohne Gewissheit einstellen...
Leider bekomm ich es nicht gebacken, dass meine header.png angezeigt wird, am Pfad liegt es definitiv nicht.

Code:
import java.awt.Color;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.KeyStroke;


public class InitGui extends JPanel {
    
    //Fenster
    JFrame jfr;
    Container contentPane;
    
    //JPanel
    JPanel header;
    JPanel anzeige;
    JPanel spielfeld;
    
    //Komponenten
    BufferedImage player;
    
    //Textfelder zu Namenseingabe
    JTextField nameRed;
    JTextField nameBlue;
    //Button zur Eingabespeicherung
    JButton buttonRed;
    JButton buttonBlue;
    //Lebenspunkte anzeigen lassen
    JTextField lebenspunkteRed;
    JTextField lebenspunkteBlue;
    
    public InitGui() {
        initUI();
        createMenu();
    }
    
    public void initUI() {
        jfr = new JFrame("Who is the real SisterFister?");
        jfr.setSize(1000, 700);
        jfr.setLocationRelativeTo(null);
        jfr.setBackground(Color.WHITE);
        jfr.setDefaultCloseOperation(jfr.EXIT_ON_CLOSE);
        jfr.setResizable(false);
        
        contentPane = jfr.getContentPane();
        jfr.setVisible(true);
    }
    
     //Menü erstellen
    public void createMenu(){
        //Menü -> JmenuBar -> Jmenu -> JMenuItem

        //Menüleiste erstellen
        JMenuBar jMenuBar = new JMenuBar();

        //Menüpunkte erstellen
        JMenu highscoreList = new JMenu("Hall of Fame");
        JMenu logoutMenu = new JMenu("Fenster schließen");

        //Menüpunkte an Menüleiste heften
        jMenuBar.add(highscoreList);
        jMenuBar.add(logoutMenu);

        //Menüpunkt Unterpunkte erstellen
        JMenuItem showList = new JMenuItem("Highscoreliste", new ImageIcon("src/images/trophy.png"));
        JMenuItem exitItem = new JMenuItem("Ausloggen", new ImageIcon("src/images/close.png"));
        
        //Shortcut erstellen -> Mit Alt & E wird Anwendung geschlossen
        exitItem.setMnemonic(KeyEvent.VK_E);
        exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, ActionEvent.ALT_MASK));
        
        //wenn exitItem gedrückt wird, beendet sich die Anwendung
        exitItem.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }           
        });
        
        
        //Menüpunkt Unterpunkte hinzufügen
        highscoreList.add(showList);
        logoutMenu.add(exitItem);

        //Menüleiste an jFrame heften
        jfr.setJMenuBar(jMenuBar);
        repaint();
    }
    
    
        public void paintComponent(Graphics g){
            try {
                player = ImageIO.read(new File("./src/images/header.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            super.paintComponent(g);
            g.drawImage(player, 0, 0, 300, 300, null);
 
        }
    
 
    
    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new InitGui();
            }
        });
    }

}
Ich komm einfach nicht dahinter wo der Fehler steckt ... würd mich wirklich freuen, wenn einer von euch Abhilfe schaffen könnte ..

MfG
 
mihe7

mihe7

am Pfad liegt es definitiv nicht.
Ach, das würde ich nicht ausschließen. Startest Du denn die Anwendung aus dem Verzeichnis, in dem sich auch src befindet?

Unabhängig davon: Ressourcen lädt man nicht über das Dateisystem sondern über den ClassLoader, d. h. mit Hilfe der Methoden Class#getResource bzw. #getResourceAsStream.

Java:
player = ImageIO.read(getClass().getResource("/images/header.png"));
Dabei ist zu beachten, dass sich der Pfad auf den Classpath bezieht (daher taucht hier auch kein src-Verzeichnis auf). Wo genau sich das images-Verzeichnis in Deinem Projekt befinden muss, hängt vom verwendeten Buildsystem ab. Da ich nicht weiß, was Du verwendest, nur mal eine grobe Herangehensweise:

Wenn direkt unter src Java-Dateien und Pakete liegen, könnte es tatsächlich sein, dass sich der Ordner unter src/images befinden muss. In der Regel gibt es aber ein extra Verzeichnis für Ressourcen. Wenn die Java-Dateien und Paketen und src/main/java liegen, wirst Du die Bilder wahrscheinlich unter src/main/resources/images ablegen müssen.

Abgesehen davon ist es gar keine gute Idee, das Bild während des Zeichnens zu laden (und schon gar nicht jedesmal).
 
J

JavaNo0b

Am Datei Pfad liegt es nicht, weil ich eine zweite Datei im gleichen Package habe in dem !exakt! das gleiche in paintComponent() steht wie im anderen. Also beide im gleichen Verzeichnis und beide greifen auf das Bild zu. Funktioniert aber nur bei der andere Datei.
Welche Methode wäre denn klüger, um den Header permanent zu laden?

Und sieht jemand meinen Fehler?
Bin noch ein Java Anfänger :D
 
J

JustNobody

Also wenn das Problem an der Zeile player = ImageIO.read(new File("./src/images/header.png")); liegen soll:
Hast du das einfach einmal aufgedröselt? Wenn Du die File Instanz erzeugt hast: hast Du die einmal geprüft? Besonders das getAbsolutePath() wäre hier z.B. interessant um zu sehen, wo er nach der Datei schaut und um sicher zu stellen, dass die Datei da ist ...
 
Thema: 

drawImage Fehlersuche

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben