Fragen zu Standalone-Applikation und Speicherfunktion

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Fragen zu Standalone-Applikation und Speicherfunktion

    Hallo,
    ich hätte einmal zwei hoffentlich leicht zu beantwortende Fragen. Ich hoffe mir kann jemand weiter helfen. Ich habe kürzlich ein kleines Computerspiel in Java entworfen.

    Jetzt wollte ich allerdings noch zwei kleine Verbesserungen implementieren: 1. Eine Speicherfunktion und 2. wollte ich aus diesem Spiel gerne eine Standalone-Applikation machen, also ein Programm, das man unabhängig von einem Browser öffnen kann. Beim Speichern stoße ich direkt auf das erste Problem: Ich habe bereits ein kleines Testprogramm entworfen, dass über eine Speicherfunktion verfügt und auch einwandfrei funktioniert. Der Quell-Code sieht vollgendermaßen aus:

    Quellcode

    1. import java.io.*;
    2. public class SchreibeDatei
    3. {
    4. public static void main(String[] argv)
    5. {
    6. save("Hallo");
    7. }
    8. static void save(String s)
    9. {
    10. BufferedWriter bw;
    11. try
    12. {
    13. bw = new BufferedWriter(new FileWriter(new File("save.text")));
    14. bw.write(s);
    15. bw.close();
    16. }
    17. catch (ArrayIndexOutOfBoundsException aioobe){}
    18. catch (IOException ioe){}
    19. }
    20. }
    Alles anzeigen


    Die Methode static void save(String s) wird hier über die Methode public static void main(String[] argv) aufgerufen. Eine solche Methode kommt aber in meinem Programm nicht vor. (Java-Applet) Wenn ich die Funktion save(...) über mein Programm versuche auszuführen passiert leider gar nichts.

    Zu meinem zweiten Problem: Hat irgendjemand eine Idee, wie man ohne größeren Aufwand mein Programm in eine *.exe Datei verpacken kann, die sich dann jeder Zeit explorer-unabhängig öffnen läßt?

    Schon mal vielen Dank für jede Hilfe!
    Gruß Björn

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Björn ()

  • Im Prinzip war das meine Frage. Ich weiß, es müßte eigentlich ohne Probleme funktionieren, aber so ist es bei mir eben leider nicht und ich habe keine Erklärung dafür. Die Methode wie sie oben steht funktioniert. Auch wenn ich die Methode über eine publich static main methode einer anderen Klasse aufrufen lasse, gibt es kein Problem. Aber wenn ich sie über mein Programm aufrufen lasse, passiert einfach nichts. Es kommt auch keine Fehlermeldung. Einfach keine Wirkung. Meine Hauptklasse heißt: public class JavaSpiel extends java.applet.Applet implements Runnable, falls das irgendeine Bedeutung hat. Ich bin für jeden Rat dankbar!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Björn ()

  • Ich habe eben von einem Bekannten dem Tipp bekommen "public static" vor der Methode zu entfernen, weil sonst versucht wird eine "Klassen-Methode" von einer Objekt-Methode aus aufzurufen. Das hat allerdings keine Veränderung bewirkt. Anschließend habe ich den Aufruf der Methode void save() direkt in meiner public void init() Methode durchgeführt und bekam dann vollgende Fehlermeldung:

    Ausnahme: java.security.AcessControlException: access denied (java.io.FilePermission save.text write)

    Hat jemand eine Idee was ich ändern muss?

    Gruß Björn
  • Ok, das ist ja schonmal gut zu wissen. Damit komme ich dann direkt zu meinem zweiten Problem: Wie schaffe ich es, dass mein Programm über eine ausführbare Datei gestartet wird und nicht länger als Applet von einem Explorer abhängig ist? Hier ist einmal die Grundstruktur von meinem Programm. Würde mich sehr freuen, wenn jemand eine Idee hat! Schonmal vielen Dank im Voraus!

    Quellcode

    1. import java.awt.*;
    2. public class JavaSpiel extends java.applet.Applet implements Runnable
    3. {
    4. int frame, delay;
    5. Thread animator;
    6. Dimension offDimension;
    7. Image offImage;
    8. Graphics offGraphics;
    9. public void init()
    10. {
    11. String str = getParameter("fps");
    12. int fps = (str != null) ? Integer.parseInt(str) : 10;
    13. delay = (fps > 0) ? (220 / fps) : 100;
    14. }
    15. public void start()
    16. {
    17. animator = new Thread(this);
    18. animator.start();
    19. }
    20. public void run()
    21. {
    22. long tm = System.currentTimeMillis();
    23. while (Thread.currentThread() == animator)
    24. {
    25. repaint();
    26. try
    27. {
    28. tm += delay;
    29. Thread.sleep(Math.max(0, tm - System.currentTimeMillis()));
    30. }
    31. catch (InterruptedException e)
    32. {
    33. break;
    34. }
    35. frame++;
    36. }
    37. }
    38. public void stop()
    39. {
    40. animator = null;
    41. offImage = null;
    42. offGraphics = null;
    43. }
    44. public void update(Graphics g)
    45. {
    46. Dimension d = new Dimension (981,460);
    47. if ((offGraphics == null)||(d.width != offDimension.width)||(d.height != offDimension.height))
    48. {
    49. offDimension = d;
    50. offDimension.width = 981;
    51. offDimension.height = 460;
    52. offImage = createImage(981, 460);
    53. offGraphics = offImage.getGraphics();
    54. }
    55. offGraphics.setColor(getBackground());
    56. offGraphics.fillRect(0, 0, 981, 460);
    57. paintFrame(offGraphics);
    58. g.drawImage(offImage, 0, 0, null);
    59. }
    60. public void paint(Graphics g)
    61. {
    62. if (offImage != null){g.drawImage(offImage, 0, 0, null);}
    63. }
    64. public void paintFrame(Graphics g)
    65. {
    66. //Hier steht der eigentliche Prgramm-Text.
    67. }
    68. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Björn ()

  • Damit wäre das Problem mit den Zugriffsrechten gelöst, aber dann habe ich immer noch keine Exe.Datei. :( ... Ich habe früher mit Delphi programmiert. Da war es recht einfach: Ein klick auf "kompilieren" und sofort hatte man eine exe.datei. In Java ist das irgendwie anders. Wer mein Spiel testen möchte, ist darauf angewiesen eine html-Datei zu öffnen, in die das Applet eingebunden ist. Das ist irgendwie etwas unpraktisch. Viel lieber wäre es mir, wenn es eine Exe-Datei gäbe. Aber wie stellt man das an? (Vielen Dank für alle Tipps bis hierher!)
  • Es gibt verschiedene Varianten: z.B. gjc (Gnu Java Compiler) oder Excelsior Jet (kostenpflichtig).
    Ich habe noch keine Freewarevariante gefunden, die guten Code erzeugt. Mit einem einfachen AWT Beispiel war die EXE-Datei sogar um 50% langsamer als mit native Java.
    Aber du kannst in deiner MANIFEST Datei eine "Runnable" Klasse angeben, die z.B. bei Doppelklick automatisch ausgeführt wird.
    Ist halt doch nur Java :)
  • Also wenn du Java Dateien compilierst entstehen ".class" Dateien (evtl. im Explorer die "Dateierweiterungen anzeigen" einschalten).
    Mehrere dieser ".class"-Dateien können zu einer ".jar"-Datei (Java Archive) zusammengefasst werden. Eine JAR Datei ist nix anderes als eine ZIP-Datei mit anderer Erweiterung (kann mit WinRAR etc. geöffnet werden).
    Nur gibt es keine standardisierte Möglichkeit um aus ".jar" oder ".class" Dateien EXE-Dateien zu erzeugen. Dies geht nur über Fremdwerkzeuge, was aber teilweise sehr abenteuerlich ist (s.o.).
    Klarer?
  • bin gerne spielverderber :D

    aber bei wiki gibts infos: http://de.wikipedia.org/wiki/GNU_Compiler_for_Java
    * Homepage: http://gcc.gnu.org/java/
    * Manual: http://gcc.gnu.org/onlinedocs/gcj/
    * GCJ Wiki: http://gcc.gnu.org/wiki/GCJ

    und auch google gibt was her: [google]gcj exe compile[/google]
    versuchs doch erstmal, bevor sich phax wieder die mühe macht ;)

    //EDIT: LOL, phax war schon schneller