# [JAVA] JFrame in Applet/JApplet



## Schüler94 (7. Mai 2011)

Liebe java-forum.org-Community! :smile:
Ich habe folgendes Problem und zwar habe ich diverse GUI's(=Grafic User Interface) und die müssen nun alle in ein Applet gepackt werden,da wir als Hausübung von der Schule aus diese JFrames in Applets bzw JApplets programmieren müssen. 
Ich habe aber noch nie wirklich gelernt wie man Applets in Java programmiert, aus diesem Grund bin ich auf die Idee gekommen mich an das Forum zuwenden,an hand eines Beispiels.

Klasse Rechnen:
[Java]/**
 * Klasse, welche zwei statische Methoden beinhaltet,welche
 * zu Mathematischen Berechnungen dienen. 
 * 
 * @version 2011-01-14
 * @author Martin 
 */
public class Rechnen {

	/**
	 * Methode zum potenzieren
	 * 
	 * @param exponent
	 * @param basis
	 * @return ergebnis Gibt das Ergebnis des potenzierten
	 * 		   zurück. 
	 */
	public static int aHochbI(int basis,int exponent){
		int ergebnis=1;
		if((basis >=0)&&(exponent >=0)){
			for(int i=exponent ;i>0;i--){
				ergebnis =ergebnis*basis ;
			}
		}
		return ergebnis;
	}

	/**
	 * Methode zum faktoriseren.
	 * 
	 * @param n Positive ganzahlige Zahl. 
	 * @return ergebnis Gibt das Ergebnis des faktorisierten
	 * 		   zurück.
	 */
	public static int faktorielleI(int n){
		int ergebnis=1;
		for(int i =1;i<=n;i++){
			ergebnis=ergebnis*i;
		}
		return ergebnis;
	}

}
[/code]

Klasse RechnenGUI:

```
import javax.swing.JFrame;
import java.awt.*;
/**
 *
 * @author Martin
 */
public class RechnenGUI extends JFrame {
    public static void main(String[] args){
        new RechnenGUI();        
    }
    public RechnenGUI(){
        //Titelzeile setzen
        setTitle("Mini-Rechner");
       //Schließ-Aktivität setzen
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       //RechnenPanel einfügen
       Container C = this.getContentPane();
       C.add(new RechnenPanel());
       //sichtbar machen des Fensters
       setVisible(true);
       setSize(500,250);
    }
}
```

Klasse RechnenPanel
[Java]import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * Grafisches TestPanel für die Klasse Rechnen.
 *
 * @author Martin 
 * @version 2011-01-14
 */
public class RechnenPanel extends JPanel {

	private Button go;
	private JRadioButton ahochb,faktorielle;
	private JLabel basis,exponent,n,ergebnis;
	private JTextField basistxt,exponenttxt,ntxt,ergebnistxt;
	private JPanel p1,p2,p3;

	public RechnenPanel(){

            //Deklarieren der Elemente
            this.go = new Button("Berechnen");
            this.ahochb = new JRadioButton ("a^b");
            this.faktorielle = new JRadioButton ("a!");
            ButtonGroup auswahl = new ButtonGroup();
            auswahl.add(this.ahochb);
            auswahl.add(this.faktorielle);
            this.basistxt = new JTextField ("");
            this.exponenttxt = new JTextField ("");
            this.ntxt = new JTextField ("");
            this.ergebnistxt = new JTextField ("");
            this.basis = new JLabel("Basis :");
            this.exponent = new JLabel("Exponent :");
            this.n = new JLabel("n-te Zahl :");
            this.ergebnis = new JLabel("Ergebnis :");

            //Layout setzen
            setLayout(new GridLayout(3,4));

            ahochb.setActionCommand("A");
            faktorielle.setActionCommand("B");           

            //Panels erzeugen

            //Panel 1
            this.p1 = new JPanel();
            p1.setLayout (new GridLayout(1,2));
            p1.add(this.exponent);
            p1.add(this.exponenttxt);
            //Panel 2
            this.p2 =new JPanel();
           // Dieses Pannel dient nur als Platzhalter !

            //Panel 3
            this.p3 =new JPanel();
            // Dieses Pannel dient nur als Platzhalter !

            //Elemente positionieren

            //1.Zeile
            add(ahochb);
            add(basis);
            add(basistxt);
            add(p1);

            //2. Zeile
            add(this.faktorielle);
            add(n);
            add(ntxt);
            add(p2);

            //3. Zeile
            add(go);
            add(p3);
            add(ergebnis);
            add(ergebnistxt);



            //Elemente zum Actionlistener hinzufügen
            RechnenAction h= new RechnenAction();
            ahochb.addActionListener(h);
            faktorielle.addActionListener(h);
            basistxt.addActionListener(h);
            exponenttxt.addActionListener(h);
            ntxt.addActionListener(h);
            ergebnistxt.addActionListener(h);
            go.addActionListener(h);
        }
   private class RechnenAction  implements ActionListener {
        public void actionPerformed(ActionEvent e)  {
            // Wenn Button ahochb gedrückt wurde,
            if(ahochb.getActionCommand().equals("A")){
                String textbasis = basistxt.getText();
                if(!"".equals(textbasis)){
                    // Zahlenwerte umwandeln
                   int basis2 = Integer.parseInt(textbasis);

                    String textexpo = exponenttxt.getText();
                    if(!"".equals(textexpo)){
                        int exponent2 = Integer.parseInt(textexpo);

                        // Methoden zum berechnen aufrufen
                        if(e.getSource() == go)    {
                            int ergebnis = Rechnen.aHochbI(basis2, exponent2);
                            ergebnistxt.setText("" + ergebnis);
                        }
                    }
                }
            }



            if(faktorielle.getActionCommand().equals("B")){
                String textn = ntxt.getText();
                if(!"".equals(textn)){
                   // Zahlenwerte umwandeln
                   int n2 = Integer.parseInt(textn);

                    // Methoden zum berechnen aufrufen
                    if(e.getSource() == go)    {
                      int ergebnis = Rechnen.faktorielleI(n2);
                      ergebnistxt.setText("" + ergebnis);
                    }
                }
            }

        }       
    }
}
[/Java]

Nun meine direkte Frage,Wie mach ich aus diesen 3 Klassen ein Applet was Webbrowserfaähig ist ? Bitte um Referenzen oder sonstige nützliche Tipps :smile:

Danke in voraus :wink:

MfG Gast94


----------



## L-ectron-X (7. Mai 2011)

Du hast soweit alles richtig gemacht, dass der Aufbau deines Applet-Codes so winzig sein wird, das du überrascht sein wirst, wie einfach es ist.

```
import javax.swing.*;

public class RechnenApplet extends JApplet {
    public void init() {
        add(new RechnenPanel());
    }
}
```

Dein Applet-Tag in deiner HTML-Datei muss dann so in etwa aussehen:

```
<applet code="RechnenApplet.class" width="500" height="150">
</applet>
```

Eine kleine Sache würde ich dennoch ändern:
Bitte vermeide die Mischung von AWT- und Swing-GUI-Komponenten.
Schreibe also in Zeile 13 und 22 noch ein *J* vor das Wort 
	
	
	
	





```
Button
```
.

Und die Textfelder kannst du auch nur mit 
	
	
	
	





```
new JTextField();
```
 initialisieren.


----------



## Schüler94 (7. Mai 2011)

Danke das du dir die Mühe gemacht hast und meinen Code durch geangen bist 
Ok das klingt ja schon recht gut aber wie müsste ich das programmieren wenn ich die Verweisende-Methdoe "add" nicht benutzen dürfte und den ganzen Code ins Applet schreiben müsste ?
Hast du vieleicht dazu eine Referenz oder so, dass wäre ja sonst viel zu viel Arbeit für dich mir hier den fertigen Code hinzuklatschen und dabei würde ich wohl auch nichts lerenen.?

Danke nochmals!


----------



## javaDev2011 (7. Mai 2011)

Hi Schüler94,

genauso einfach: Denn JApplet leitet sich von JPanel ab, also einfach RechnenGUI von JApplet stadt von JPanel ableiten und Konstruktor durch init() ersetzen!

javaDev2011


----------



## L-ectron-X (7. Mai 2011)

Ein Applet/JApplet ist neben Frame, JFrame etc. auch ein Top-Level-Container. Es ist durchaus legitim und vor allem auch viel Objekt orientierter (weil wiederverwendbarer), wenn man die gesamte GUI in einem "Hauptpanel" konzentriert. Also so, wie du das bereits gemacht hast.
Wenn man nun aus einer Applikation ein Applet machen möchte, braucht man nur eine Klasse, die von Applet/JApplet erbt und dieser dann das Hauptpanel hinzu zu fügen.

Natürlich kann man das aber auch einschränken und die GUI-Komponenten direkt ins Applet einbauen. Man verliert dabei ein ganzes Stück an Flexibilität und Objektorientiertheit.
Dazu musst du die 4 Methoden aus dem Applet-Lebenszyklus kennen und wissen, wann der Browser diese aufruft. (
	
	
	
	





```
init()
```
, 
	
	
	
	





```
start()
```
, 
	
	
	
	





```
stop()
```
 und 
	
	
	
	





```
destroy()
```
)
Wenn du nun also deine Komponenten direkt ins Applet einpflanzen möchtest, sieht du die init()-Methode als eine Art Konstruktor an. Sie wird nur einmal beim Laden des Applets vom Browser aufgerufen.
Dort kannst du deine Objekte instanziieren und auf der GUI verankern.

*@javaDev2011:
JApplet erbt nicht von JPanel...* (siehe Anhang)


----------



## Ro0kie (7. Mai 2011)

Ich bins wieder der Schüler94 hab mir nun vorerst einmal angemeldet.

@L-ectron-X:ich habe nun meine Applets nur bei einem ist leider ein Problem aufgetreten:







liegt das nur an meinem PC dieser Grafik-Fehler ????:L,wie kann ich den behen ?
Komischerweise im GUI klappt es ohne Fehler


----------



## L-ectron-X (7. Mai 2011)

Hab so einen Verdacht, aber ohne Code ist das noch zu vage.


----------



## Ro0kie (7. Mai 2011)

Hier der Code im Nachinein 

Klasse BallspielPanel:


```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/**
 *Panel für die Ballspiel-App. .
 *
 * @author Martin S.
 * @version 2011-02-24
 */
public class BallspielPanel extends JPanel {

    private Button east,west,south,north;
    private JLabel ball;
    private ImageIcon icon;
    private JPanel panel;
    private int x,y,width,height;
    
    /**
     * Standard-Konstruktor zum deklarieren,initaliserien und hinzufügen der
     * GUI-Elemente.
     */
    public BallspielPanel(){
        //Ball Int-Variablen init.
        x =5;
        y =30;
        width =75;
        height =75;
        
        //Layout setzen
        setLayout(new BorderLayout());


        //Spielfigur init.
        /**
         * Methoden aus der Java-API
         */
        icon = new ImageIcon (BallspielPanel.class.getResource("fball.png"));
        ball =new JLabel(icon);
        ball.setBounds(x,y,width,height);
        
        



        //Buttons init. und hinzufügen
        east = new Button("O");
        west = new Button("W");
        south = new Button("S");
        north = new Button("N");

        add(east,BorderLayout.EAST);
        add(west,BorderLayout.WEST);
        add(south,BorderLayout.SOUTH);
        add(north,BorderLayout.NORTH);

        //Panel init. und hinzufügen

        //Panel
        panel = new JPanel();
        panel.setLayout(null);
        panel.add(ball);
        add (panel);

        ////ActionListener Objekt erzeugen
        BallspielAction h =new BallspielAction();
        east.addActionListener(h);
        west.addActionListener(h);
        south.addActionListener(h);
        north.addActionListener(h);
        }

   /**
    *Innere Klasse, für die einzelnen Aktionen.
    *
    */
    private class BallspielAction implements ActionListener{

            /**
             * Methode,für die einzelen Buttonklicks,usw... .
             *
             * @param e
             */
             public void actionPerformed (ActionEvent e){

                 //Ballsteuereung erstellen

                 if(e.getSource()==east){

                     //Begrenzung rechts
                     if(x+50<panel.getWidth()-75){
                         ball.setBounds(x=x+75,y,width,height);
                     }
                 }

                 if(e.getSource()==west){

                     //Begrenzung links
                     if(x>75){
                        ball.setBounds(x=x-50,y,width,height);
                     }
                     else{
                        ball.setBounds(0, y, width, height);
                        x=0;
                     }
                 }

                  if(e.getSource()==north){

                    //Begrenzung oben
                    if(y>50){
                         ball.setBounds(x,y=y-50,width,height);
                     }
                     else{
                          ball.setBounds(x,0,width,height);
                          y=0;
                      }
                 }

                 //Begrenzung unten
                  if(e.getSource()==south){
                      if(y+50<panel.getHeight()-75){
                        ball.setBounds(x,y=y+50,width,height);
                      }
                      else{
                        ball.setBounds(x,panel.getHeight()-75, width, height);
                        y=panel.getHeight()-75;
                      }
                 }
             }
    }
}
```

Klasse BallspielGUI :


```
import javax.swing.JFrame;
import java.awt.*;
/**
 *Spiel für die Langeweile.
 * Durch drücken einzelner Buttons wird eine Spielfigur bewegt.
 * Ziel des Spieles gibt es keines.
 *
 * @author Martin
 * @version 2011-02-24
 */
public class BallspielGUI extends JFrame {
        /**
     *Standard-Main Methode
     *
     * @param args
     */
    public static void main(String[] args){
         new BallspielGUI();
    }

    /**
     *Standard-Konstruktor zum setzen der Fenstergröße,Name,Schließ-Aktion
     * und der Sichtbarkeit.
     */
    public BallspielGUI(){
        //Titelzeile setzen
        setTitle("Football");

        //Schließ-Aktion setzen
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //ZiffernanzeigePanel einfügen
    Container Con = this.getContentPane();
    Con.add(new BallspielPanel());

    //Sichtbarkeit des Fensters einstellen
    setVisible(true);

    //Fixe Fenstergröße setzen
    setSize(500,550);
    setResizable ( false );



    }
}
```


----------



## L-ectron-X (7. Mai 2011)

Mein Verdacht hat sich erstmal nicht bestätigt. Ich habe für dein BallspielPanel mal ein Applet geschrieben:

```
import javax.swing.*;

public class BallspielApplet extends JApplet {
    public void init() {
        add(new BallspielPanel());
    }
}
```

Ich hatte unter Windows mit Opera, Firefox und IE keine (Grafik-)Probleme bei der Ausführung.


----------



## Ro0kie (7. Mai 2011)

Also das Applet hab ich ja schon und komischer weise gibt es nur in dem Applet diese Anzeige Fehler :bahnhof:
Ich benutze den integrierten Applet-Viewer von Netbeans.


----------



## L-ectron-X (7. Mai 2011)

Ich brauch den Code von deinem Applet, sofern er sich von meinem unterscheidet.


----------



## Ro0kie (7. Mai 2011)

L-ectron-X hat gesagt.:


> Ich brauch den Code von deinem Applet, sofern er sich von meinem unterscheidet.



Tut er nicht, außer das ich noch ein 
	
	
	
	





```
setSize(500,500);
```
 eingefügt habe.


----------



## L-ectron-X (7. Mai 2011)

setSize() in einem Applet mach nur Sinn, wenn man die Größe der vom Applet benutzten Fläche beschränken will. Die Größe der für das Applet zur Verfügung stehenden Fläche wird im applet-Tag festgelegt.

Welche JRE und welches Windows benutzt du? Ist dein Grafikkarten-Treiber aktuell?


----------



## Ro0kie (7. Mai 2011)

JRE Version 6 Update 24
Windows 7 32bit
und Grafikkartentreiber hab ich upgedatet


----------



## L-ectron-X (8. Mai 2011)

Dann muss ich leider passen.


----------

