# Applet mit HTML-Button starten und im/als JFrame anzeigen



## FinalbrainXP (24. Mai 2005)

Hi erstmal an alle  :wink: 

Habe ein kleines Problem mit Applets.

Grundproblem:

Möchte eine Swing-Fensteranwendung erstellen, welche als Applet läuft.
Das Applet soll durch einen HTML-Button gestartet werden und dann direkt das erste Swingfenster
erscheinen. Die aktuelle HTML-Seite darf nicht gewechselt werden.

Habe erstmal folgendermaaßen angefangen:


*Einfaches JFrame Fenster *


```
import javax.swing.JFrame;

class MainWindow extends JFrame
{
	public MainWindow(String title)
	{
		super(title);
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		this.setVisible(true);	
	}
}
```

*Applet Code*


```
import javax.swing.*;

public class MVIECalculator extends JApplet
{
	MainWindow HauptFenster;

	public void init()
	{
		try
		{
        	javax.swing.SwingUtilities.invokeAndWait(new Runnable()
        	{
            	public void run()
            	{
                	createAndShowGUI();	
            	}
        	});
    	}
    	catch (Exception e)
    	{
        	System.err.println("createGUI didn't successfully complete");
    	}
	}
		
	private void createAndShowGUI()  
  	{
		try
        {
        	UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); 
		}
		catch(Exception e)
		{
			System.err.println("setLookAndFeel didn't successfully complete");	
		}
		
    	HauptFenster = new MainWindow("Hauptfenster");
      	this.setContentPane(HauptFenster);
    }
}
```

*Hier die HTML-Seite*




> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
> "http://www.w3.org/TR/html4/strict.dtd">
> <HTML>
> <Head>
> ...




Das ganze funktioniert auch so ungefähr so, wie ich es mir vorgestellt habe, nur gibt es da 2 Probleme:

1. Problem

Ich arbeite mit dem JCreator 3.5 und dem jdk 1.5.0.3 und wenn ich den Code im Jcreator
mit der Applet-Ansicht zum Test laufen lasse, dann erscheint Problemlos das Jframe, aber in der
Console erhalte ich zusätzlich die Exception: "createGUI didn't successfully complete "

Funktionieren Tut es wunderbar. Liegt der Fehler an der verbuggten Jcreator 3.5 Version oder an meinem Code ?
Welcher Fehler könnte es sein ? Wenn ich kein JFrame aufrufe, sondern nur nen JLabel zum Beispiel
direkt aufs Applet zeichne, dann erscheint der Fehler nicht. Irgendwie will der Thread nicht, wenn ich nen JFrame benutze. Oder sollte man ein JFrame direkt mit Applet-Informationen beerben ?

2. Problem

Wenn ich den HTML-Button betätige, dann erscheint das Hauptfenster-JFrame direkt, genauso wie ich
es möchte,  nur wird dabei die HTML-Seite gewechselt. Weiss jemand da eine andere Lösung ?
Will einfach sowas quasi wie nen Applet-Popup haben, wo direkt  das HauptJframe angezeigt wird.
Das Applet sollte nicht direkt in der HTML-Seite eingebettet sein, sondern mit einem Schalter gestartet werden können.
Wenn das überhaupt möglich ist.


Wäre super wenn Ihr da ein paar Lösungsmöglichkeiten wisst. Vielleicht habe ich auch generell mit meiner Grundstruktur falsch begonnen und sollte anders Veerben/ableiten/implementieren ?
Könnt ihr mir vielleicht nen bisschen Beispielcode geben , wo einfach nen einfaches JFrame-Fenster
als Applet läuft, welches extern über einen HTML-Button gestartet wird. 



Vielen Dank 
Gruss von der Programmerfront

Finalbrain


----------



## Roar (24. Mai 2005)

zu 1: dann lass dir die exception doch mal ausgeben :autsch: !?!?
2: versteh nicht was du meinst. wenn man das applet nicht sehen soll sag halt breite/höhe = 0

schonmal über webstart nachgedacht?


----------



## L-ectron-X (24. Mai 2005)

Guck mal, so funktionierts, ganz ohne JavaScript.
Deine Fenster-Klasse kannst du so übernehmen, aber...

Die Applet-Klasse:

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

public class MVIECalculator extends JApplet {
   private JButton btn;

   public void init()
   {
      setLayout(new FlowLayout());
      btn = new JButton("Calculator starten");
      getContentPane().add(btn);
      btn.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            new MainWindow("MVIECalculator").setVisible(true);
         }
      });
   }
}
```

Die HTML-Seite:

```
<html>
<head>
 <title>MVIECalculator-Applet</title>
 </head>
  <body>
   <applet code="MVIECalculator.class" width="180" height="35">
  </applet>
 </body>
</html>
```


----------



## FinalbrainXP (24. Mai 2005)

Vielen Dank für eure schnellen Antworten. 

@roar
Ja stimmt, ich schaue mal nach der Exception :idea: 

@l-ectron
Deine Lösung funktioniert supi..nur dass Problem ist, dass 
ich das Applet einer Webdesig-Firma zur Verfügung stellen muss, aber nicht weiss
wie Sie es einbinden möchten. Wenn nun der JButton nicht zum Style der Seite passt, besteht mein Problem weiterhin 
Ich dachte es wäre besser, einfach nen Javascriptaufruf zu ergattern, mit dem die Firma dann das Applet
aufrufen und einbinden könnte wie sie es gerne wollten. Ich habe auch keine Größenvorgaben, also will ich sozusagen nen Popupfenster nehmen. In deiner Lösung wird das Fenster ohne seperaten Thread erstellt, aber im Netz
wird immer gesagt, dass es besser ist nen eigenen Thread dafür zu machen. Oder ist das Humbug ?
Mit meiner Invoke-Methode kommt jedenfalls noch die blöde Exception.

Danke und Gruss

Finalbrain


----------



## L-ectron-X (24. Mai 2005)

OK, dann versuchen wir mal was anderes. Vielleicht kann ich dich damit begeistern... :wink: 
Ein funktionierendes Beispiel findest du hier.  :arrow: Quelltext downloaden

Wenn du auf die Grafik klickst wird einfach nur ein Fenster geöffnet. Die Grafik kann dabei dem Layout der Webseite angepasst werden.

Für dein Beispiel würde das so aussehen:
Das HTML-File:

```
<html>
 <head>
  <title>GraphicButton-Applet</title>
 </head>
 <body>
  <!-- Die Breite und Höhe des als Parameter eingebundenen Button-Bildes
       sind dem Applet als Werte für Breite und Höhe zu übergeben.-->
  <applet code="GraphicButton.class" width="150" height="20">
  <param name="Button" value="img2.jpg">
  </applet>
 </body>
</html>
```
Im Prinzip wird hier im param-Tag nur der Dateiname einer beliebigen Grafikdatei übergeben, die in meinem Beispiel im Verzeichnis der Webseite liegt.
Die Breite und Höhe der Grafik ist gleichzeitig die Breite und Höhe des Applets und sollte daher übereinstimmen.
In diesem Beispiel habe ich eine Grafik von 150 x 20 Pixeln verwendet.

Das Applet:

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

public class GraphicButton extends Applet {
   private Image img;

   public void init() {
      img = getImage(getDocumentBase(), getParameter("Button"));

      this.addMouseListener(new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
            new MainWindow("Appletcation").setVisible(true);
         }
      });
   }
   
   public void paint(Graphics g) {
      super.paint(g);
      if(img != null) {
         g.drawImage(img, 0, 0, this);
      }
   }
}
```
Das Applet implementiert einen MouseListener, das heißt, beim Klick auf die Appletfläche wird eine Aktion ausgeführt. Hier also das Öffnen eines Fensters. Denkbar wäre auch ein Applet mit mehreren gezeichneten Bildern, deren Koordinaten du beim Mausklick vergleichst und entsprechend reagierst.

Heutige Applets werden nicht mehr in AWT sondern in Swing geschrieben.
Das würde dann so aussehen:

```
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
 
public class GraphicButton extends JApplet {
   private Image img;
 
   public void init() {
      img = getImage(getDocumentBase(), getParameter("Button"));
 
      this.addMouseListener(new MouseAdapter() {
         public void mouseClicked(MouseEvent e) {
            new MainWindow("Appletcation").setVisible(true);
         }
      });
   }
   
   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      if(img != null) {
         g.drawImage(img, 0, 0, this);
      }
   }
}
```

Eine mögliche Fenster-Klasse in Swing:

```
import javax.swing.*;

class MainWindow extends JFrame {
   public MainWindow(String title) {
      super(title);
      setSize(400, 300);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(DISPOSE_ON_CLOSE);
   }
}
```

Eine mögliche Fenster-Klasse, wenn es unbedingt in AWT sein muss:

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

class MainWindow extends Frame { 
   public MainWindow(String title) { 
      super(title); 
      setSize(400, 300); 
      setLocationRelativeTo(null); 
      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            dispose();
         }
      }); 
   } 
}
```
Mit diesem noch ausbaufähigen Beispiel kannst du also deinen "Button" auf jeden Fall an das Design der Webseiten anpassen. Und das ganz ohne JavaScript.


----------



## FinalbrainXP (24. Mai 2005)

Yehaa  danke für deine Mühe :toll: 
Wenn jeder so selbstlos Helfen würde wie du, dann käme Deutschland auch mal aus den Socken 
Irgendwie höhre ich raus das du irgendwas gegen Java-Script hast....fange es also lieber nicht an zu lernen 
Sobald ich mich genug (wieder)eingearbeitet habe in das  Javazeugs (Bin Alter C'ler -> OOP=böse ), werde ich mich probieren zu revengieren.


Gruss

Finalbrain


----------

