Bild wird von JFrame nicht geladen

maltz

Mitglied
Hallo ich habe ein kleines Programm geschrieben. Zuerst soll ein Hintergrund angezeigt werden! Dieser lädt aber aus irgendeinem Grund nicht!
Hier sind die Klassen:

-main:
Java:
package pack1;

public class main {

    public static void main(String[] args) {
        new gui();
        new var();
        new keyhandler();
        new label();
    }

}
-gui Klasse:
Java:
package pack1;

import java.awt.Label;
import java.awt.event.KeyListener;

import javax.swing.JFrame;

public class gui {
  
    public gui(){
      
        var.jf1 = new JFrame();
        var.jf1.setSize(var.screenwidth, var.screenheight);
        var.jf1.setLocationRelativeTo(null);
        var.jf1.setVisible(true);
        var.jf1.setTitle("FutureShit");
        var.jf1.setResizable(false);
        var.jf1.setLayout(null);
        var.jf1.addKeyListener((KeyListener) new keyhandler());
        var.jf1.requestFocus();
      
      
        var.labl1 = new Label();  
        var.labl1.setBounds(0, 0, var.screenwidth, var.screenheight);
        var.labl1.setVisible(true);
        var.jf1.add(var.labl1);
      
        var.jf1.setVisible(true);
        System.out.println("los2!");
        }
  
}

-Label Klasse:
Java:
package pack1;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;

import javax.swing.JLabel;

public class label extends JLabel{

    private static final long serialVersionUID = 1L;
  
    protected void paintComponent(Graphics g){
        System.out.println("Aha!");
      
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g.drawImage(var.ibg1, 0, var.backgroundY1, 800, 600, null);
        g.drawImage(var.ibg2, 0, var.backgroundY2, 800, 600, null);
        System.out.println("Fertig!");
        System.out.println("los3!");
        repaint();
    }

}

-variablen Klasse:
Java:
package pack1;

import java.awt.Label;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class var {
    static JFrame jf1;
    static int screenwidth = 800, screenheight = 600;
    static int backgroundY1 = 0, backgroundY2 = -600;
    static boolean moveup = false, movedown = false, moveleft = false, moveright = false;
    static Label labl1;
  
    static BufferedImage ibg1, ibg2;
    public var(){      
        try{
            //Background
            ibg1 = ImageIO.read(new File("scr/bg1.png"));
            ibg2 = ImageIO.read(new File("scr/bg1.png"));
            System.out.println("los4.1!");
        }catch (IOException e){
            e.printStackTrace();
            System.out.println("Bilder konnten nicht geladen werden!");
            System.out.println("los4.2!");
        }      
    }
}

-Keyhandler Klasse:
Java:
package pack1;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class keyhandler implements KeyListener{

    @Override
    public void keyPressed(KeyEvent e) {
      
        if(e.getKeyCode() == KeyEvent.VK_W){
            var.moveup = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_A){
            var.moveleft = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_S){
            var.movedown = true;
        }
        if(e.getKeyCode() == KeyEvent.VK_D){
            var.moveright = true;
        }    
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == KeyEvent.VK_W){
            var.moveup = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_A){
            var.moveleft = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_S){
            var.movedown = false;
        }
        if(e.getKeyCode() == KeyEvent.VK_D){
            var.moveright = false;
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {  
    }
}

Danke schonmal im vorraus!
 
Zuletzt bearbeitet von einem Moderator:
Deine Namensgebung und der Gebrauch von static ist sehr gewöhnungsbedürftig. Aber ich glaube ein Punkt ist schon mal dass du hiermit:
Code:
var.labl1 = new Label();
kein Objekt deiner Klasse label anlegst. Die beginnt nämlich mit einem kleinen "l"
 
In deiner GUI Klasse importierst du die AWT Klasse Label und erstellst davon ein Objekt nicht von deiner eigenen Klasse label

Klassen sollten in UpperCamelCase geschrieben werden und nie so heißen wie eine Framework Klasse.

Ebenso solltest du dir die Grundlagen der objektorientierten Programmierung anschauen und lernen (vor allem für die UI Programmierung).
In deiner main-Methode rufst du den Konstruktor deiner KeyListener Klasse und deiner Label Klasse auf. Warum ist nicht klar, beide Aufrufe haben dort nichts zu suchen
 
Wenn du in main das machst:
Code:
    public static void main(String[] args) {
        new var();
        new gui();
    }
in var das:
Code:
    static label labl1;
und in gui das:
Code:
        var.labl1 = new label();
geht es trotzdem. Auch wenn das Konzept etc. nicht schön ist. (s.o.)
 
Noch eine Kleinigkeit: du solltest in der paintComponent(...) nicht repaint() aufrufen. Das ist eine böse Schleife. Wirst du auch an deinen Ausgaben sehen.
 
weil ich mich ja auch grad mit GUI-Programmierung befasse, hätte ich zum obigen code mal ne Frage: Warum sollte man eine eigene label-Klasse und vor allem eine eigene variablen-Klasse erstellen und nicht beides als Attribute der GUI-Klasse deklarieren?
 

Neue Themen


Zurück
Oben