Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

  • 5 Wochen später...

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();

 

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.