Zum Inhalt springen
  • 0

Java: Wieso werden Resourcen nicht gelesen?


Devilmarkus

Frage

Hallo zusammen,

ich bin dabei, ein Spielchen zu programmieren.
Dafür möchte ich ein Font definieren und 2 verschiedene Mauspfeile anzeigen.
Das klappt im Compiler (Netbeans) auch perfekt!
Nur, wenn ich die Datei zur .jar kompiliere, kann die ausgeführte .jar Datei die Resourcen nicht finden?!?!?

Folgendes habe ich schon überprüft:
- Ja, die Resourcen sind in der .jar Datei am richtigen Platz
- Ja, ich habe auf Case-Sensitive geachtet.
- In anderen Programmen von mir funktioniert das auch!

Code Snippets:
 

	public class Scene extends JLabel {
	    public Scene() {
        InputStream in = this.getClass().getResourceAsStream("/classes/Roman.ttf");
        try {
            font = Font.createFont(Font.TRUETYPE_FONT, in).deriveFont(Font.BOLD, 46);
            in.close();
        } catch (Exception e) {
        }
        URL curUrl1 = getClass().getResource("/classes/mouse1.png");
        mouse = getToolkit().getImage(curUrl1);
        URL curUrl2 = getClass().getResource("/classes/mouse2.png");
        mouseclicked = getToolkit().getImage(curUrl2);
    }
---- snip ----
    public static void main(String[] args) {
        final JFrame frame = new JFrame("Test");
        frame.setUndecorated(true);
        BufferedImage cursorImg = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
        Cursor blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(cursorImg, new Point(0, 0), "blank cursor");
        final Scene scene = new Scene();
        scene.setCursor(blankCursor);
        scene.setPreferredSize(new Dimension(1920, 1080));
        frame.setLayout(new BorderLayout());
        frame.add(scene, BorderLayout.CENTER);
        frame.pack();
        frame.setAlwaysOnTop(true);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        scene.addKeyListener(scene.keys);
        scene.addMouseListener(scene.m);
        scene.addMouseMotionListener(scene.mm);
        scene.setFocusable(true);
        scene.setScene(0);
        Thread runMe= new Thread() {
            public void start() {
                while (true) {
                    Graphics g = scene.getGraphics();
	                    Graphics2D g2 = (Graphics2D) g;
                    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                    g = g2;
                    scene.drawThisScene();
                    java.awt.Image img = scene.thisscene.getScaledInstance(-1, scene.getHeight(), java.awt.Image.SCALE_FAST);
                    if (scene.tr == 0) {
                        g.setColor(Color.BLACK);
                        g.fillRect(0, 0, scene.getWidth(), scene.getHeight());
                        g.drawImage(img, (scene.getWidth() - img.getWidth(null)) >> 1, 0, null);
                    }
                    frame.setTitle(scene.name);
                    scene.requestFocus();
                    try {
                        Thread.sleep(50);
                    } catch (Exception e) {
                    }
                }
            }
        };
        runMe.start();
    }
---- snip ----
}


Wie gesagt, das Spiel (soweit man schon von Spiel reden kann) funktioniert 100% direkt aus Netbeans kompiliert, aber starte ich es von der Kommandozeile, wenn es zur .JAR kompiliert ist, können die Resourcen nicht aus der .JAR geladen werden.
Wer kann mir sagen, warum nicht?

Bearbeitet von Devilmarkus
Link zu diesem Kommentar
Auf anderen Seiten teilen

3 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

Mir ist bei deinem Code noch etwas aufgefallen:

Thread runMe= new Thread() {
            public void start() {
                while (true) {
                    Graphics g = scene.getGraphics();
	                    Graphics2D g2 = (Graphics2D) g;
                    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                            RenderingHints.VALUE_INTERPOLATION_BILINEAR);
                    g = g2;
                    scene.drawThisScene();
                    java.awt.Image img = scene.thisscene.getScaledInstance(-1, scene.getHeight(), java.awt.Image.SCALE_FAST);
                    if (scene.tr == 0) {
                        g.setColor(Color.BLACK);
                        g.fillRect(0, 0, scene.getWidth(), scene.getHeight());
                        g.drawImage(img, (scene.getWidth() - img.getWidth(null)) >> 1, 0, null);
                    }
                    frame.setTitle(scene.name);
                    scene.requestFocus();
                    try {
                        Thread.sleep(50);
                    } catch (Exception e) {
                    }
                }
            }
        };
        runMe.start();

 

Du versuchst hier einen neuen Thread zu erstellen, aber statt die wirkliche Methode run() dafür zu implementieren, nutzt du die Methode start() --> es wird kein neuer Thread erstellt, sondern vermutlich eher der alte geblockt, da du start() direkt aufrufst. Die Methode start() solltest du wohl eher nicht überschreiben, es sei denn, du weißt, was du tust.

So müsste das eig. aussehen:

//Java 7 style
Thread thread1 = new Thread(new Runnable () {
  public void run () {
    //add your code here

    //this code will be executed in new thread
  }
});

//start new thread
thread1.start();

//OR: Java 8 style with lambda
Thread thread1 = new Thread(() -> {
  public void run () {
    //add your code here

    //this code will be executed in new thread
  }
});

//start new thread
thread1.start();

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...