Images laden nicht

HackerBanane

Mitglied
Hallo und danke schonmal für jede Antwort!
Ich lerne jetzt seit vielleicht einem halben Jahr Java und möchte für meine Brüder, die sehr viel Fifa spielen eine kleines 2D
Füßballspiel programmieren, bei dem bei dem Titelbildschirm immer zuffällig eines von drei Bildern kommt.
Ich programmiere mit Java 14 und nutze Eclipse.
Für den Titelbildschirm nutze ich zwei Klassen: eine für alle Variablen (Var.java) und eine für die GUI (Gui.java).
Ich habe mit dem Titelbirlschirm angefangen und schon taucht der erste Fehler auf. Die Bilder werden nicht geladen und ich
schaue in ein leeres JFrame.
In der Ausgabe kommen auch keine Fehlermeldungen.
LG
Laurens

(Ich habe leider vergessen wie ich den Quelltext anhänge)

Hier ist der Quelltext mit den beiden Klassen:

Java:
import java.awt.Image;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Var {
 
    public static Random randomTitleFrame = new Random();
    public static int r = randomTitleFrame.nextInt(3);
    
    public static JFrame jf1;
 
    public static JPanel jpl1;
 
    public static JLabel lbl1;
 
    public static Image title1;
    public static Image title2;
    public static Image title3;

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

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Gui {
 
    public void Gui() {
     
        Var.jf1 = new JFrame("Fußball Akkon");
        Var.jf1.setSize(1650, 1100);
        Var.jf1.setResizable(false);
        Var.jf1.setLayout(null);
        Var.jf1.setLocationRelativeTo(null);
        Var.jf1.setDefaultCloseOperation(Var.jf1.EXIT_ON_CLOSE);
        Var.jf1.setVisible(true);
     
    }
 
    public void paint(Graphics g) {
     
        Graphics2D f2 = (Graphics2D)g;
     
        if(Var.r == 0) {
         
            Var.lbl1 = new JLabel();
            Var.lbl1.setSize(1650, 1100);
            Var.lbl1.setIcon(new ImageIcon((getClass().getResource("Title.png"))));
            Var.jpl1.add(Var.lbl1);
            Var.jf1.add(Var.jpl1);
            VarTest.jf1.validate();
         
        } else if(Var.r == 1) {
         
            Var.lbl1 = new JLabel();
            Var.lbl1.setSize(1650, 1100);
            Var.lbl1.setIcon(new ImageIcon((getClass().getResource("Title2.png"))));
            Var.jpl1.add(Var.lbl1);
            Var.jf1.add(Var.jpl1);
            Var.jf1.validate();
         
        } else if(Var.r == 2) {
         
            Var.lbl1 = new JLabel();
            Var.lbl1.setSize(1650, 1100);
            Var.lbl1.setIcon(new ImageIcon((getClass().getResource("Title3.png"))));
            Var.jpl1.add(Var.lbl1);
            Var.jf1.add(Var.jpl1);
            Var.jf1.validate();
         
        }
     
    }
 
 
}
 
Zuletzt bearbeitet von einem Moderator:
Also mehrere Dinge:

Die Methode paint wird nirgends aufgerufen. Daher kann das da auch nie statt finden.

Es gibt paint / paintComponent bei Swing Komponenten / Frames, aber da sollte das Fenster / die Komponente nur neu gemalt werden. Da werden keine neuen Komponenten hinzu gefügt. Der Code würde mit in den Konstruktor von Gui gehören.

Damit dieses Überladen wo es nichts zu überladen gibt auch auffällt, sollte man bei solchen Methoden immer ein @Override davor setzen. Hättest Du vor der paint Methode diese Annotation gesetzt, dann hätte der Compiler Dich auch auf den Fehler hingewiesen.
 
Also mehrere Dinge:

Die Methode paint wird nirgends aufgerufen. Daher kann das da auch nie statt finden.

Es gibt paint / paintComponent bei Swing Komponenten / Frames, aber da sollte das Fenster / die Komponente nur neu gemalt werden. Da werden keine neuen Komponenten hinzu gefügt. Der Code würde mit in den Konstruktor von Gui gehören.

Damit dieses Überladen wo es nichts zu überladen gibt auch auffällt, sollte man bei solchen Methoden immer ein @Override davor setzen. Hättest Du vor der paint Methode diese Annotation gesetzt, dann hätte der Compiler Dich auch auf den Fehler hingewiesen.
Vielen Dank, aber wie sähe das dann im Code aus?
 
Der Code aus der Paint Methode kommt noch in den Konstruktor. Natürlich ohne die lokale Variable f2.

Generell ist das alles aber keine Gute Idee. static sollte bis auf Konstanten und die main Methode nicht verwendet werden.

Dann könnte man noch sinnvolle Namen vergeben - und dann kommt so etwas heraus (ungetestet):
Java:
import javax.swing.*;
import java.util.Random;

public class Gui {

    private Random random = new Random(); // Kein verirrender Name! Das ist ja kein Frame!
    private JFrame frame; // Instanzvariable - Name aussagekräftig - nicht jf1!

    public Gui() {
        frame = new JFrame("Fußball Akkon");
        frame.setSize(1650, 1100);
        frame.setResizable(false);
        frame.setLayout(null);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // EXIT_ON_CLOSE ist eine statische Variable und wird nicht auf einer Instanz benutzt!

        String resource = "";
        switch (random.nextInt(3)) {
            case 0:
                resource = "Title.png";
                break;

            case 1:
                resource = "Title1.png";
                break;

            case 2:
                resource = "Title2.png";
                break;
        }

        JLabel label = new JLabel(); // Vernünftiger Name - kein jl1 oder so!
        label.setSize(1650, 1100);
        label.setIcon(new ImageIcon((getClass().getResource(resource))));
        JPanel panel = new JPanel(); // Panel wurde nie erzeugt! Und natürlich Name, der lesbar ist ...
        panel.add(label);
        frame.add(panel);
        frame.setVisible(true); // Kommt am Ende - dann ist auch kein validate notwendig.
    }

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

Dabei auch bitte die Kommentare beachten.
 
Ja, ich hatte einfach nur den Code von Dir genommen und ohne Tests ein kleines Refactoring gemacht, damit Du siehst, wie es mit den Variablen aussehen könnte...

Das Problem ist, dass Du ein Panel zu dem JFrame hinzu fügst ohne dem JPanel eine Größe zu geben... Damit hat das Panel die Größe 0 und dementsprechend siehst Du von dem Inhalt nichts.

Also entweder das Panel weglassen und das Label direkt zum JFrame hinzu fügen oder dem Panel eine Größe zuweisen.
 
Den kenne ich nicht.
Den? Pong ist ein "Videospiel" aus den 70ern 🙂 Auf Youtube gibt es dafür ein "Tutorial" aus einer Reihe, in der vor allem eines gezeigt: wie man es nicht machen sollte. Deine Klassennamen und der Aufbau weisen stark auf eines dieser Videos hin.

Wenn Du objekt-orientiert programmieren willst, gibt es eine goldene Regel für das Schlüsselwort static: das taucht im Quelltext nur bei der main-Methode oder im Zusammenhang mit der Definition von Konstanten auf.
 
Aber zu dem Pong Tutorial muss man sagen, dass die Anfänger davon total begeistert sind ... so habe ich zumindest die Kommentare in Erinnerung 🙂

Aber ich will nichts sagen - ich habe einen Einblick bekommen in den Umfang von so Videos ...
 
Eine Frage hätte ich da noch:
Jetzt habe ich einen JButton mit einem Hintergrund und veränderter Schrift erstellt, was auch prima klappt:

JButton button = new JButton("Einstellungen");
button.setBounds(425, 450, 800, 80);
Font font = new Font("Stencil", Font.PLAIN, 80);
button.setFont(font);
button.setForeground(Color.BLACK);
button.setBorderPainted(false);
button.setVisible(true);
button.setOpaque(false);
button.setContentAreaFilled(false);
JLabel label = new JLabel();
label.setSize(500, 80);
label.setIcon(new ImageIcon((getClass().getResource("ButtonBackground.png"))));
Var.options.add(label);
Var.frame.add(Var.button);

Wie kriege ich jetzt die Schrift auf dem JButton wieder in den Vordergrund?
 

Neue Themen


Zurück
Oben