# Applet als ausführbare Jar-Datei



## .::sonne:. (8. Jun 2007)

ich moechte gerne das mein applet eine stand-alone anwendung wird in gestallt einer ausführbaren jar datei

ich weiss das applets eigentlich nur in browsern leben, aber mein proffessor will das nich wissen^^

das muss irgendwie gehen das man ein applet in eine ausführbare jar datei umwandeln kann, notfalls muss man da eine main class reinsetzen (das geht irgendwie auch)

hat einer eine idee wie das gehen soll ?

ps: und doch das geht, aber ich weiss nicht wie^^


----------



## Beni (8. Jun 2007)

Eine Möglichkeit:
1. Verlagere alles was dein Applet macht auf ein (J)Panel.
2. Schreibe eine (J)Frame, welches das neue (J)Panel anzeigt.
3. Schreibe eine Main-Klasse, welche das (J)Frame öffnet.

Ohne Main-Klasse kommst du garantiert nicht weiter.


----------



## .::sonne:. (8. Jun 2007)

danke erst mal fuer deine schnelle antwort.



			
				Beni hat gesagt.:
			
		

> Eine Möglichkeit:
> 1. Verlagere alles was dein Applet macht auf ein (J)Panel.
> ...



... aber wie macht man das ?


----------



## L-ectron-X (8. Jun 2007)

Am Einfachsten dürfte es sein, wenn du im JApplet ein JPanel hast, auf dem deine Komponenten liegen, so brauchst du nur das JPanel einem JFrame hinzufügen.


----------



## .::sonne:. (9. Jun 2007)

leider hab ich kein swing applet sondern verwende awt, was die sache erheblich erschwehrt


----------



## L-ectron-X (9. Jun 2007)

Ganz im Gegenteil, Applet erbt von Panel, da kannst du das Applet so wie es ist in einen Frame setzen.
Du brauchst nur die Applet-Methoden aufrufen. Ich hab hier mal vor einiger Zeit sowas vorgstellt:
http://www.java-forum.org/de/viewtopic.php?t=18372


----------



## .::sonne:. (10. Jun 2007)

die idee ist gut, leider bekomme ich bei mir nur einen weißen bildschirm mit dem menu  :###

ich stell mich wieder zu blöd an, das kann doch nicht so schwehr sein so nen applet in einen frame rein zu bekommen


----------



## L-ectron-X (11. Jun 2007)

Zeig mal deinen Code vom Frame.


----------



## .::sonne:. (11. Jun 2007)

```
package java_pong2;

import java.awt.Frame;
import java.awt.Dimension;

public class Fenster extends Frame 
{
    private static final long serialVersionUID = 1L;
    private JavaDrei javadrei;

    public static void main(String[] args) 
   {
	new Fenster().setVisible(true);
    }

    public Fenster() 
    {
	super();
	initialize();
	
	javadrei = new JavaDrei();
	javadrei.init();
	javadrei.start();
	javadrei.run();
	methoden();
	add(javadrei); 
    }
    
    private void methoden()
    {
	javadrei.repaint();
    }

    private void initialize() 
    {
	this.setSize(500, 400);
	this.setTitle("Frame");
	this.setVisible(true);
    }
}
```


----------



## L-ectron-X (11. Jun 2007)

run() und repaint() brauchst du nicht aufrufen, das sollte das Applet intern schon regeln.
Ansonsten siehts soweit, bis auf den zweimaligen setVisible(true)-Aufruf ganz OK aus.
Wenn du den Aufruf aus der initialize()-Methode entfernst, sollte es funktionieren. Komponenten die zur Laufzeit auf dem Frame hinzugefügt werden, werden erst durch den Aufruf von validate() sichtbar.
Kannste dir aber sparen, wenn du den Aufruf in initialize() entfernst.


----------



## .::sonne:. (11. Jun 2007)

wenn ich "this.setVisible(true);" aus der initialize() methode entferne kommt eine NullPointerException  :bahnhof:


Exception in thread "main" java.lang.NullPointerException
	at java.applet.Applet.getCodeBase(Unknown Source)
	at java_pong2.JavaDrei.init(JavaDrei.java:87)
	at java_pong2.Fenster.<init>(Fenster.java:36)
	at java_pong2.Fenster.main(Fenster.java:24)

edit: was mir aufgefallen ist, bei deinem link weiter oben hast du in dem applet keinen thread gestartet, im gegensaz zu meinem, außerdem habe ich noch Runnable implementiert bei meinem applet


----------



## L-ectron-X (11. Jun 2007)

Die NullPointerException kommt sicher von einem Problem beim Einlesen von Bildern etc. Das müsstest du noch umbauen.



			
				.:sonne:. hat gesagt.:
			
		

> edit: was mir aufgefallen ist, bei deinem link weiter oben hast du in dem applet keinen thread gestartet, im gegensaz zu meinem, außerdem habe ich noch Runnable implementiert bei meinem applet


OK, dann eben mal ein Beispiel einer Appletcation mit Thread und Runnable.

```
import java.applet.*;
import java.awt.*;
import java.text.*;
import java.util.*;

public class Chrono extends Applet implements Runnable {
   private DateFormat formatter;
   private String time;
   private Thread t;
   private Font font;

   public void init() {
      formatter = new SimpleDateFormat("HH:mm:ss");
      font = new Font("Arial", Font.BOLD, 90);
   }
   
   public void start() {
      if(t == null) {
         t = new Thread(this);
      }
      t.start();
   }
   
   public void stop() {
      t.interrupt();
   }
   
   public void run() {
      while(!Thread.currentThread().isInterrupted()) {
         time = formatter.format(new Date());
         repaint();
         try {
            Thread.sleep(1000);
         }
         catch(InterruptedException e) {
            Thread.currentThread().interrupt();
         }
      }
   }
   
   public void paint(Graphics g) {
      g.setFont(font);
      if(time != null) {
         g.drawString(time, 1, 70);
      }
   }
}
```


```
import java.awt.*;
import java.awt.event.*;

public class AppletFrame extends Frame {
   private Chrono chrono;
   
   public AppletFrame(String title) {
      super(title);
      setSize(375, 110);
      setResizable(false);
      setLocationRelativeTo(null);
      
      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            chrono.stop(); //optional
            System.exit(0);
         }
      });
      
      chrono = new Chrono();
      chrono.init();
      chrono.start();
      add(chrono);
   }

   public static void main(String[] args) {
      new AppletFrame("Chrono-Appletcation").setVisible(true);
   }
}
```

Fertig kompiliert und in eine Jar gepackt:
Applikation herunterladen
Applet starten

Beide sind ein und die selbe Jar-Datei. Nur das Applet wird mit der Webseite geladen und die Applikation kann nach dem Download per Doppelklick gestartet werden.


----------



## .::sonne:. (11. Jun 2007)

danke erst mal noch für deine antwort, ich scheine wirklich ein problem mit den einlesen von bildern zu haben

ich lade die folgendermaßen:


```
public class ....  extends Applet implements Runnable
{...

Image hintergrund;

.....

public void init()
{...

hintergrund = getImage (getCodeBase(), "background.jpg");

}

....

}
```

gibts da noch eine andere möglichkeit die bilder einzulesen ?


----------



## L-ectron-X (11. Jun 2007)

Sicher, aber alle führen für Applets zum selben Ergebnis. Es gibt zwar verschiedene Variationen, in Abhängigkeit des Speicherorts des Bildes, aber es ist immer die gleiche Methode, die die Arbeit erledigt. Applets laden Bilder immer mit der getImage()-Methode aus Applet.

Dies ist ein Sonderfall.  Daher musst du einen kleinen Kniff anwenden. Du implementierst eine Methode mit einem beliebigen Namen, ich wähle jetzt mal _initialize()_ und setzt dort den Code hinein, für den Fall, dass das Applet in einen Frame eingebaut wird. Ein Frame ist eine Applikation, er kann Panels eingefügt bekommen. Ein Applet erbt auch von Panel und ist demnach auch ein Panel.

Statt init() lässt du nun vom Frame initialize() im Applet aufrufen, und kannst so eine andere Variante des Bilderladens ausführen. Hier mal ein Beispiel für eine initialize()-Methode, die die Bilder für eine Applikation laden kann.

```
public void initialize() {
   image = Toolkit.getDefaultToolkit().getImage("bild.jpg");
}
```


----------

