# JFrame aus JApplet starten



## theory (29. Jul 2004)

Hallo, 

ich muss für meine Didaktik Semesterarbeit ein Java Programm schreiben. Das hab ich auch erfolgreich getan, und wollte nun, dass meine beiden Applikationen (auf JFrame basierend) aus einem JApplet gestartet werden. Nun werden aber die Bilder, die im JFrame angezeigt werden sollen nicht angezeigt. 

Kann mir da jemand helfen? 
Oder kann mir jemand sagen, wie ich mein JFrame schnell in ein JApplet umwandeln kann (hab ich auch schon erfolglos versucht).

Und wenn ich gerade dabei bin. Was ist ein jar, und wie kann ich das aus einem JFrame erstellen?

vielen Dank für eure Hilfe,
eine verzweifelte Studentin


----------



## Beni (29. Jul 2004)

Anstelle von JFrames würde ich JComponent's als Grundtypen benutzen. Die kannst du dann entweder einem JFrame aufsetzten, oder einem JApplet.
(Du musst natürlich den Code, der speziell für die Frames gedacht ist, auslagern (setVisible, etc...))


```
public class Blupp extends JComponent{
    [...]
}
```

Applet:

```
public class BluppApplet extends JApplet{
  public void init(){
     getContentPane().add( new Blupp() );
  }
}
```

Applikation:

```
public class Irgendwo{
  public static void main( String[] args ){
    new BluppFrame().setVisible( true );
  }
}

public class BluppFrame extends JFrame{
  public BluppFrame(){
    getContentPane().add( new Blupp() );
  }
}
```

Eine JAR-Datei ist ein Archiv, wie z.B. die ZIP-Dateien (hat sogar denselben Aufbau). Im Archiv sind die *.class-Dateien und eine Mainifest-Datei (enthält einen Eintrag auf die Klasse, in der die "public static void main" steht (und sonst noch ein paar unwichtige Dinge)) gespeichert.

Je nachdem, was für eine IDE du benutzt, ist das herstellen einfacher oder schwieriger (mal unter "Export" oder "Tools" oder so gucken :wink: )


----------



## theory (29. Jul 2004)

Ich lade meine Biler erst in die folgende Klasse


```
class BitmapComponent extends Canvas{
    private Image img;

    public BitmapComponent(String name){
	img = getToolkit().getImage(name);
	MediaTracker mt= new MediaTracker(this);
	mt.addImage(img, 0);
	try {
	    mt.waitForAll();
	}catch (InterruptedException e){
	}
    }

    public void paint(Graphics g){
	g.drawImage(img,1,1,this);
    }

}
```

Dann werden diese Bilder in ein JPanel eingefügt, und dieses dann im Layout des JFrames platziert. 

Kann es sein, dass ich anstatt Canvas JComponent nehmen muss? Und warum funktionier es denn bei einem dos aufruf?


----------



## L-ectron-X (29. Jul 2004)

Zunächst mal sollte man Swing-Components nicht mit AWT-Components mischen, da ungewollte Verdeckungseffekte entstehen können.
Deshalb solltest Du Dir eine Klasse schreiben, die von JPanel erbt. Dem JPanel fügst Du der Anzahl der Bilder passend JLabels hinzu. In die JLabels legst Du dann die Bilder z.B. mit:

```
jLabel.setIcon(new ImageIcon(getClass().getResource("pfad/datei.jpg")));
```
oder Du lädst sie eben mit dem MediaTracker, wenn die Bilder auf einem Internet-Server liegen z.B. mit:

```
Image img;
MediaTracker mt;
...
...  
  mt = new MediaTracker(this);
  img = getImage(getDocumentBase(), "images/picture.jpg");
  mt.addImage(img, 0);
    try {
      mt.waitForID(0);
    }
    catch(InterruptedException e) {}
...
...
```
_getDocumentBase()_ liefert ein URL-Objekt des Speicherortes des einbettenden HTML-Files. In diesem Beispiel müssten die Bilder also unterhalb der HTML-Datei in einem Verzeichnis namens _images_ liegen.

Am Ende erzeugst Du dann eine Instanz von diesem JPanel und kannst es dem JApplet oder dem JFrame auf die ContentPane legen.

Ich denke, das könnte funktionieren.


----------



## theory (30. Jul 2004)

Ihr seid hier ja wirklich genial, jetzt funktioniert eigentlich alles. Nur etwas will nicht soo ganz.

Ich habe mir eine Zeichenfläche gebastelt, die von einem JComponent erbt. Darauf zeichne ich einige Rechtecke. Nun möchte ich auch noch ein Bild hineinzeichnen. Wie mache ich das am besten?


```
class MazeGI extends JComponent {

    private Image img;
...
	    g.drawImage(img,(curX*Scale+XStart),(curY*Scale+YStart),this);
...
```

Ich habs auch schon versucht, dass mein Maze von Canvas erbt. Aber da werden auch nur die rechtecke, nicht aber das Bild gezeichnet.


----------



## Beni (30. Jul 2004)

Ist das Bild auch geladen? Hat es auch nicht die Grösse (0/0)? Du kannst mal im Code selbst ein Bild herstellen, (BufferedImage img = new B...), um zu überprüfen, ob ein existierendes Bild gezeichnet wird.


----------

