Huhu
Ich habe nun endlich entdeckt wie ich Bilder richtig laden kann, so dass ich diese auch in JARs laden kann. Soweit so gut funktioniert das laden der Bilddateien einwandfrei.
Doch es gibt ein Problem:
Wenn das Programm gestartet wird, wird zuerst der Konstruktor aufgerufen der Klasse Main. Dort wird der Konstruktor der Klasse StartUpFrame aufgerufen. Dieser wird ausgeführt und das Fenster erscheint. Jedoch wird das Bild erst gezeichnet, wenn ich manuell die Grösse des Fensters verändere... repaint() hat nichts genützt... habe auch noch updateUI() versucht, ich weiss aber nicht, ob das überhaupt etwas damit zu tun hat.
Hier mal der Quellcode:
[Java]
package frames;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import images.ImageManager;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
Container c;
JPanel test;
ImageManager im;
protected Main(){
c = getContentPane();
//basic images are loaded
im = ImageManager.getInstance();
im.loadImage("backgrounds/start up.gif", "IMG_BG_StartUp");
new StartUpFrame(im.getImage("IMG_BG_StartUp"), 600, 400);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Main();
}
});
}
}
class StartUpFrame extends JFrame {
private static final long serialVersionUID = 1L;
Container c;
Color backGroundColor = Color.BLACK;
Image backGroundImage;
JPanel panel;
protected StartUpFrame(final Image backGroundImage, final int width, final int height){
this.backGroundImage = backGroundImage;
this.setSize(width, height);
c = getContentPane();
panel = new JPanel(){
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(backGroundImage, 0, 0, width, height, null);
}
};
panel.setSize(width, height);
c.add(panel);
setSize(width, height);
setResizable(false);
setLocationRelativeTo(null);
setUndecorated(true);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
[/Java]
Ich habe keinen Fehler entdecken können. Kann mir einer erklären warum das so ist? Ich kann, wenn nötig, auch ein ausführbares file geben, der Sourcecode ist nicht so lange.
*Edit:
Falls jemand noch die ImageManager-Klasse braucht:
[Java]
package images;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import java.util.Hashtable;
public class ImageManager {
private static ImageManager instance;
private Hashtable<String, Image> imageStack = new Hashtable<String, Image>();
private ImageManager(){
}
public static ImageManager getInstance(){
if(instance == null){
instance = new ImageManager();
}
return instance;
}
public void loadImage(String path, String imageCode){
URL source = this.getClass().getResource(path);
Image image = Toolkit.getDefaultToolkit().createImage(source);
imageStack.put(imageCode, image);
}
public void loadImage(URL source, String imageCode){
Image image = Toolkit.getDefaultToolkit().createImage(source);
imageStack.put(imageCode, image);
}
public void loadImage(Image image, String imageCode){
imageStack.put(imageCode, image);
}
public Image getImage(String imageCode){
return imageStack.get(imageCode);
}
public Image getImage(Image image){
return imageStack.get(image);
}
}
[/Java]
Btw... es gibt keine Fehlermeldungen. Weder der Compiler noch die VM haben gemeckert.
Ich habe nun endlich entdeckt wie ich Bilder richtig laden kann, so dass ich diese auch in JARs laden kann. Soweit so gut funktioniert das laden der Bilddateien einwandfrei.
Doch es gibt ein Problem:
Wenn das Programm gestartet wird, wird zuerst der Konstruktor aufgerufen der Klasse Main. Dort wird der Konstruktor der Klasse StartUpFrame aufgerufen. Dieser wird ausgeführt und das Fenster erscheint. Jedoch wird das Bild erst gezeichnet, wenn ich manuell die Grösse des Fensters verändere... repaint() hat nichts genützt... habe auch noch updateUI() versucht, ich weiss aber nicht, ob das überhaupt etwas damit zu tun hat.
Hier mal der Quellcode:
[Java]
package frames;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Image;
import images.ImageManager;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
Container c;
JPanel test;
ImageManager im;
protected Main(){
c = getContentPane();
//basic images are loaded
im = ImageManager.getInstance();
im.loadImage("backgrounds/start up.gif", "IMG_BG_StartUp");
new StartUpFrame(im.getImage("IMG_BG_StartUp"), 600, 400);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run(){
new Main();
}
});
}
}
class StartUpFrame extends JFrame {
private static final long serialVersionUID = 1L;
Container c;
Color backGroundColor = Color.BLACK;
Image backGroundImage;
JPanel panel;
protected StartUpFrame(final Image backGroundImage, final int width, final int height){
this.backGroundImage = backGroundImage;
this.setSize(width, height);
c = getContentPane();
panel = new JPanel(){
private static final long serialVersionUID = 1L;
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.drawImage(backGroundImage, 0, 0, width, height, null);
}
};
panel.setSize(width, height);
c.add(panel);
setSize(width, height);
setResizable(false);
setLocationRelativeTo(null);
setUndecorated(true);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
[/Java]
Ich habe keinen Fehler entdecken können. Kann mir einer erklären warum das so ist? Ich kann, wenn nötig, auch ein ausführbares file geben, der Sourcecode ist nicht so lange.
*Edit:
Falls jemand noch die ImageManager-Klasse braucht:
[Java]
package images;
import java.awt.Image;
import java.awt.Toolkit;
import java.net.URL;
import java.util.Hashtable;
public class ImageManager {
private static ImageManager instance;
private Hashtable<String, Image> imageStack = new Hashtable<String, Image>();
private ImageManager(){
}
public static ImageManager getInstance(){
if(instance == null){
instance = new ImageManager();
}
return instance;
}
public void loadImage(String path, String imageCode){
URL source = this.getClass().getResource(path);
Image image = Toolkit.getDefaultToolkit().createImage(source);
imageStack.put(imageCode, image);
}
public void loadImage(URL source, String imageCode){
Image image = Toolkit.getDefaultToolkit().createImage(source);
imageStack.put(imageCode, image);
}
public void loadImage(Image image, String imageCode){
imageStack.put(imageCode, image);
}
public Image getImage(String imageCode){
return imageStack.get(imageCode);
}
public Image getImage(Image image){
return imageStack.get(image);
}
}
[/Java]
Btw... es gibt keine Fehlermeldungen. Weder der Compiler noch die VM haben gemeckert.