Bild in Jar-File mit ImageIO

Geht das denn nicht ?

Code:
Image image = ImageIO.read(getClass().getResourceAsStream("bild.jpg"));
 
ich hab es versucht aber es funktioniert nicht.
Code:
import java.awt.Graphics;
import java.awt.Graphics2D;

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

public class drawing extends JPanel {

    public drawing(){
       
        try{
            Var.image = ImageIO.read(getClass().getResource("b1.png"));
        }catch(Exception e){
        }
}
    public void paintComponent(Graphics g){
        super.paintComponent(g);
       
        Graphics2D g2d = (Graphics2D)g;
       
       
        g2d.drawImage(Var.image, 0, 0, 800,600,null);   
       
        repaint();
    }
}
 
Also das Laden funktioniert auf jeden Fall so. Was dann mit deinem Image weiter passiert bzw. nicht funktioniert weiss ich nicht. Was kriegst du für einen Fehler ?
 
nun wird bei mir diese Meldung ausgegeben
Code:
Exception in thread "main" java.lang.NullPointerException
    at javax.swing.JComponent.paintComponent(Unknown Source)
    at test.drawing.paintComponent(drawing.java:13)
    at test.drawing.<init>(drawing.java:33)
    at test.Main.main(Main.java:10)
was soll ich machen?
 
Was meinst du mit angezeigt?
Ich meine damit, dass dein Panel möglicherweise auch dann nicht sichtbar ist, wenn das Bild erfolgreich geladen wird. Ersetze doch einmal testweise deine paintComponent-Methode durch eine ganz einfache, wie beispielsweise die folgende:
Java:
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    setBackground(Color.BLUE);
}
Wenn dann kein blaues Panel zu sehen ist, stimmt etwas nicht.

Inzwischen hast du aber ja offenbar eine Fehlermeldung, der man erst einmal nachgehen kann.
 
Code:
package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

public class drawing extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        setBackground(Color.BLUE);
    }
   
    public drawing(){
       
       
        try{
            Var.image = ImageIO.read(getClass().getResourceAsStream("b1.png"));
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Fehler");
        }
        paintComponent(null);
}
   
}
 
Hab rumprobiert was ne Idee was man machen kann?
Der Aufruf paintComponent(null) ist garantiert falsch und verursacht wohl die Fehlermeldung. Hast du noch eine Fehlermeldung, wenn du das wieder entfernst? Falls ja, bitte posten. Falls nicht, könntest du meinen Vorschlag aus Posting #25 ausprobieren, um zu testen, ob deine GUI überhaupt wie erwartet dargestellt wird. Vielleicht liegt das Problem dort und es wird bereits erfolgreich gezeichnet.

Wie kann ich die paint Methode aufrufen?
Wenn nötig über repaint(). Ich glaube aber nicht, dass es hier nötig ist.
 
Ich habe ein weiters Problem ich habe in meiner Gui versucht die Backroundcolour zu ändern ess gibt keinen Fehler trotzdem beliebt der Hintergrund unverändert. Gibt es eine Einstellung die da nicht aktiviert ist?
 
Code:
package test;

import java.awt.Color;
import java.awt.Font;

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

public class gui {
static int weite,höhe;
static JFrame frame;
static JLabel lbl;

    public gui(){
       
        Font g = new Font("Times New Roman", 1, 29);
        lbl = new JLabel();
        lbl.setBounds(0, 260, 2000, 30);
        lbl.setFont(g);
        frame = new JFrame("Game");
        frame.setVisible(true);
        frame.setSize(Var.BREITE, Var.HÖHE);
        frame.setLocation(Var.x, Var.y);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.addKeyListener(new Tasten());
        frame.add(lbl);
        frame.setBackground(Color.GREEN);
       
        }
   
}
 
Code:
package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

public class drawing extends JPanel {

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
       
        g.drawImage(Var.image, 0, 0, this);
       
       
    }
   
    public drawing(){
       
        paintComponent(null);
        try{
            Var.image = ImageIO.read(getClass().getResourceAsStream("b1.png"));
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Fehler");
        }
}
   
}
so sieht das aus und das frame ist vissible.
 
Danke das mit der Hintergrundfarbe funkt.
Eigentlich hatte ich allerdings gemeint, das JPanel einzufärben (also drawing), damit man sieht, ob es erscheint.

Der entscheidende Code-Teil fehlt aber noch. Irgendwo erzeugst du doch dein gui- und dein drawing-Objekt. Dort müsstest du das drawing-Objekt auch deiner Oberfläche hinzufügen, was du möglicherweise noch nicht machst.
 
Code:
package test;

import java.awt.Color;
import java.awt.Font;

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

public class gui {
static int weite,höhe;
static JFrame frame;
static JLabel lbl;

    public gui(){
      
        Font g = new Font("Times New Roman", 1, 29);
        lbl = new JLabel();
        lbl.setBounds(0, 260, 2000, 30);
        lbl.setFont(g);
        frame = new JFrame("Game");
        frame.setVisible(true);
        frame.setSize(Var.BREITE, Var.HÖHE);
        frame.setLocation(Var.x, Var.y);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(null);
        frame.addKeyListener(new Tasten());
        frame.add(lbl);
        frame.getContentPane().setBackground(Color.GREEN);
        frame.add(new drawing());
        }
  
}
Das ist meine gui trotzdem wird immernoch der Fehler ausgegeben

Exception in thread "main" java.lang.NullPointerException
at javax.swing.JComponent.paintComponent(Unknown Source)
at test.drawing.paintComponent(drawing.java:13)
at test.drawing.<init>(drawing.java:33)
at test.Main.main(Main.java:10)

ein Teil dieses Fehlers
paintComponent(null);
ich weis blos nicht was ich machen soll
 
Code:
package test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

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

public class drawing extends JPanel {

   
    public drawing(){
       
       
        try{
            Var.image = ImageIO.read(getClass().getResourceAsStream("b1.png"));
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Fehler");
        }
}
   
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
       
        g.drawImage(Var.image, 0, 0, this);
        setVisible(true);
       
        repaint();
    }
   
}
Ist das so richtig denn es funktioniert immernoch nicht.
 
setVisible(true) erst am Funktionsende aufrufen.
Das bezog sich eigentlich nicht auf drawing, sondern auf dein JFrame, also die Klasse gui. Sobald du es dort aufrufst, wird die Oberfläche gezeichnet. Zu dem Zeitpunkt hast du dein JPanel (drawing) aber noch nicht hinzugefügt, so dass es frühestens beim nächsten Neuzeichnen sichtbar wird. Das Neuzeichnen wird entweder manuell über repaint() ausgelöst, oder durch andere Ereignisse, wie beispielsweise eine Größenänderung des Fensters. Es ist also besser,setVisible(true)erst nach dem Hinzufügen des Panels aufzurufen, idealerweise eben am Ende des Konstruktors von gui.

Ist die Zeileframe.setLayout(null);noch enthalten? Es kann auch daran liegen, dass drawing nicht erscheint. Also solltest du es zumindest testweise mal entfernen.

Der Aufruf von repaint() am Ende von paintComponent() ist meines Erachtens sinnlos, denn an der Stelle ist ja ohnehin gerade neu gezeichnet worden.
 

Neue Themen


Zurück
Oben