Veröffentlicht 15. Juli 20169 j 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 15. Juli 20169 j von Devilmarkus
15. Juli 20169 j Autor Ok selbst-Beantwortung: Ich hatte im Projektordnernamen ein ! , das mag Java nicht. Von jedem anderen Ordner aus ausgeführt, funktioniert es.
15. August 20169 j 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();
15. August 20169 j Autor Stimmt, ich Dussel. Das hab ich glatt falsch gemacht. Klar muss ich die Methode run() implementieren! Mache ich normalerweise auch. Das war definitiv ein Tippfehler. Danke für den Tipp!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.