# JFrame in JApplet einbinden



## MArCus88 (25. Okt 2010)

Hallo zusammen,

da ich gerade frisch gebackener java-forum-Member bin, erstmal ein herzliches Hallo an alle 

Ich bin Student der Informatik im dritten Semester, habe also schon ein wenig Ahnung in einigen Programmiersprachen. Dieses Semester haben wir Java dazubekommen und müssen in diesem Fach regelmäßig Hausaufgaben einreichen. Unsere erste Aufgabe besteht darin eine Anwendung mit simpler GUI zu erstellen, bei der wir einfache Sätze mit Subjekt, Prädikat und Objekt einlesen und dann mit einem Button aus den Eingabesätzen Zufallssätze generieren sollen.

Das ganze hab ich bisher auch zufriedenstellend umgesetzt, bis auf ein paar Ausnahmen, die ich noch abfragen muss, aber soweit reicht mein Wissensschatz noch. Mein Problem ist nun, dass ich den Code innerhalb einer eigenen Klasse aufgesetzt habe, die von JFrame erbt. Dummerweise sollen wir die Aufgabe als JApplet umsetzen um die Applikation so browsertauglich zu bekommen und ich weiß nicht wie ich das anstellen soll. Von der letzten Vorlesung ist noch hängen geblieben, dass JApplets ähnlich funktionieren wie JFrames und ich dieselben GUI-Elemente aus SWING nutzen kann. Daraus nutze ich nämlich den JButton, das JTextField und das JLabel.

Am besten ich poste einmal den bisherigen Code:


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

public class MyFrame extends JFrame {

	// Felder
	private JLabel commandPrompt;
	private JTextField inputTextField;
	private JButton createRandomSentenceButton;
	private JLabel outputLabel;
	private ArrayList<String> subjects;
	private ArrayList<String> descriptors;
	private ArrayList<String> objects;
	private String inputString;
	private String outputString;
	private String[] inputComponents;
	private MyActionListener myActionListener;
		
	// Konstruktor
	public MyFrame(){
		
		// Basisklasse initialisieren
		super("Phrasendrescher");
		
		// Eingabeaufforderungs-Label initialisieren
		commandPrompt = new JLabel("Bitte geben Sie einen einfachen Satz mit Subjekt, Praedikat und Objekt ein:");
		
		// Eingabestring mit Leerstring initialisieren
		inputString = new String("");
		
		// Ausgabestring mit Leerstring initialisieren
		outputString = new String("");
		
		// MyActionListener-Instanz hinzufügen um auf Eingaben ...
		// ... reagieren zu können
		myActionListener = new MyActionListener(this);
		
		// Speicherplatz für die Arrays reservieren
		subjects = new ArrayList<String>();
		descriptors = new ArrayList<String>();
		objects = new ArrayList<String>();
		
		// Speicherplatz für das Satzkomponentenarray reservieren
		inputComponents = new String[4];
		
		// Eingabetextfeld initialisieren ...
		// ...und ActionListener zuweisen
		inputTextField = new JTextField("",20);
		inputTextField.setActionCommand("inputTextField");
		inputTextField.addActionListener(myActionListener);
		
		// Ausgabelabel initialisieren
		outputLabel = new JLabel("<Hier wird ein Zufallssatz stehen>");

		// Button initialisieren, ActionCommand setzen & ActionListener zuteilen
		createRandomSentenceButton = new JButton("Einen Zufallssatz erstellen");
		createRandomSentenceButton.setActionCommand("createRandomSentenceButton");
		createRandomSentenceButton.addActionListener(myActionListener);
		
		// UI-Elemente ins GUI setzen
		add(commandPrompt,BorderLayout.NORTH);
		add(inputTextField,BorderLayout.CENTER);
		add(outputLabel,BorderLayout.SOUTH);
		add(createRandomSentenceButton,BorderLayout.EAST);
	}
	
	// damit erhält das Frame vom ActionListener den eingegebenen Satz
	public void getInputString() {
		this.inputString = inputTextField.getText();
		
		// Eingabesatz in einzelne Woerter zerlegen...
		// ...und in einem Stringarray speichern ...
		// ... dabei das Leerzeichen als Zerlegungskriterium verwenden
		inputComponents = inputString.split(" ");
		
		// Artikel und Subjekt in eine separate Liste speichern...
		// ...und beide Woerter durch ein Leerzeichen trennen
		String tmp = inputComponents[0] + " " + inputComponents[1];
		subjects.add(tmp);
		
		// Praedikat in eine separate Liste speichern
		descriptors.add(inputComponents[2]);
		
		// Objekt in eine separate Liste speichern
		objects.add(inputComponents[3]);
	}
	
	// damit wird durch den ActionListener der Ausgabesatz gesetzt
	public void setOutputString() {
		
		// Zufallssatz erstellen
		this.outputString = this.subjects.get((int)((Math.random()*subjects.size())+0)) + " " 
							+ this.descriptors.get((int)((Math.random()*descriptors.size())+0)) + " "
							+ this.objects.get((int)((Math.random()*objects.size())+0));
		
		// ermittelten Ausdruck auf dem Ausgabelabel setzen
		this.outputLabel.setText(this.outputString);
	}
	
	// Programm
	public static void main(String[] args) {
		JFrame exampleFrame = new MyFrame();
		exampleFrame.pack();
		exampleFrame.setVisible(true);
	}
}
```

Dazu hab ich auch noch eine eigene ActionListenerklasse geschrieben, die aber an dieser Stelle nicht unbedingt erforderlich ist, denke ich. Bisher hab ich gegoogelt, die SuFu hier benutzt und die Java API durchforstet. Fündig bin ich zwar geworden, hab aber nichts gefunden, was konkret mein Problem löst bzw. was mir hinreichend alles erklärt, wie gesagt bin ich Neuling in Java.

Ich wäre euch unendlich dankbar, wenn ihr mir ein paar Hinweise geben könntet, wie ich die Aufgabe bewältige. Wie gesagt möchte ich meine Klasse so umschreiben, dass sie als JApplet im Browser läuft. Danke schonmal im Vorraus!


----------



## Kaffeebohn (25. Okt 2010)

Wenn du dein JFrame als Applet haben willst, dann erbst du zunächst nicht mehr von JFrame sondern von JApplet. Die main-Methode fliegt raus und weicht einer methode

public void init() {

}

das .pack() musst du rausschmeißen, das gibts nicht beim Applet, genauso wie der Aufruf von super() im Konstruktor.

Probiers mal damit, wenn weitere Fragen sind meld dich gerne.

Grüße


----------



## MArCus88 (25. Okt 2010)

@Kaffeebohn:

Super, hab vielen Dank für die superschnelle Antwort  Deine Anmerkungen hab ich im Code umgesetzt und das Ganze funktioniert einwandfrei! Jetzt soll das Applet noch browsertauglich gemacht werden, kannst du mir dabei auch helfen? Ich bin mir sicher dass dafür nur ein klein wenig HTML-Code nötig ist, wenn ich mich richtig an den Inhalt der letzten Vorlesung erinnere. Muss dieser dann in eine separate Textdatei und wie müsste der Code aussehen?

Danke für die Hilfe auch wieder vorab! 

Edit: Ach ja das hab ich vergessen. Der Compiler gibt mir im Log nach den Änderungen eine Warnung aus, die jedoch nicht zum Absturz des Programms führt: 

"Warnung: AppletViewer-Eigenschaftendatei kann nicht gelesen werden: /Users/localhost/.hotjava/properties Standardwerte werden verwendet."

P.S.: Ich arbeite auf einem Mac und nutze dabei Eclipse.


----------



## Kaffeebohn (25. Okt 2010)

Meinst du mit Browser-Tauglich dass du einen Quellcode suchst, mit dem du das Applet in eine HTML-Seite einbindest?



```
<applet code="MyFrame.class" width="400" height="400" alt="Mein Applet"></applet>
```

probiers mal damit. Das geht, wenn du kein JAR-File draus gemacht hast.


----------



## MArCus88 (25. Okt 2010)

Ja genau das meine ich damit  Sorry aber mit HTML hab ich bisher überhaupt nichts gemacht und bin da mehr als unversiert. Daher auch meine nächste Frage: muss ich den Code in die Klasse schreiben oder in eine externe Datei? Tut mir leid für die Anfängerfrage :lol:


----------



## eRaaaa (25. Okt 2010)

:autsch:² Waaahh? Na eine eigene Datei (html Datei eben)! Das ist ja schließlich die, die du mit dem Browser dann aufrufst.


----------



## Kaffeebohn (25. Okt 2010)

Das kopierst du in eine neue Datei, die benennst du in irgendwas.HTML oder irgendwas.HTM, und kopierst sie in den gleichen Ordner, in den auch deine .class-Datei liegt. Die HTML-Datei kannst du dann mit deinem Browser öffnen.


----------



## MArCus88 (25. Okt 2010)

Okay dann hab ichs ja richtig gemacht, nur schluckts mein Browser irgendwie nicht :noe:

Ich hab folgenden Code:


```
<html>
<head>
<title>Phrasendrescher</title>
</head>
<body>

<p>
<applet code="MyFrame.class" width="400" height="400" alt="Mein Applet"></applet>
</p>

</body>
</html>
```

in eine *.html - Datei geschrieben und bekomme im Webbrowser nur den Quelltext angezeigt. Oh jee eine schwere Geburt mit mir heute >.<

P.S.: Die Datei liegt auch im korrekten Ordner.


----------



## eRaaaa (25. Okt 2010)

Und du bist sicher dass die Dateiendung html ist und nicht txt oder so?
index.html.txt ? Ist die Dateiendung evtl. ausgeblendet?....


----------



## Kaffeebohn (25. Okt 2010)

Hast du Java installiert und unterstützt dein Browser Java? ;-)

wenn er dir lesbaren Quellcode anzeigt, könnte das ein Zeichen dafür sein, dass er nicht die class-Datei anzeigt sondern deinen vorherigen Quellcode. Was für Quellcode zeigt er dir denn im Browser an?


----------



## MArCus88 (25. Okt 2010)

Jaja ist schon richtig so, ich habs korrekt (via TextEdit <- Standardtexteditor unter Mac OS X) als .html-Datei gespeichert. Die Dateiendung hab ich natürlich nicht manuell eingetippt^^ Getestet hab ichs im Standardbrowser "Safari" unter Mac OS X und ebenfalls über Firefox :noe:

Edit: Er zeigt mir genau den Quelltext an den ich in die Datei geschrieben habe (siehe ein paar Posts weiter oben von mir)

Edit 2: Ich hab auch nochmal in meinen Browsereinstellungen von Safari geschaut und Java wird zugelassen, drum hab ich keine Idee woran es sonst liegen könnte :noe:


----------



## Kaffeebohn (25. Okt 2010)

Naja wenn er dir den HTML-Code anzeigt aber nicht interpretiert dann kann das jede Menge Ursachen haben aber an Java liegts in dem Fall vermutlich nicht ;-)

Vielleicht lädst du dir mal nen Firefox oder nen anderen Browser runter und versuchst es mal damit. Ansonsten kann ich dir in dem Fall leider auch nicht weiterhelfen.

Liebe Grüße


----------



## eRaaaa (25. Okt 2010)

Du könntest die beiden(drei?) Dateien ja mal hier anhängen!


----------



## MArCus88 (26. Okt 2010)

Ach ihr zwei, ich habs doch echt versaubeutelt  Ich hab die .html-Datei zwar als html gespeichert, aber sie wurde schlicht nicht als .html interpretiert. Drum hab ich sie nochmal als .txt - Datei gespeichert und dann einfach manuell aus txt html gemacht und schwupps funktionierte das ganze 

Die Früchte meiner Arbeit lade ich direkt mal mit hoch, viel Spaß beim testen^^


----------

