Java/Applet

Aus ZUM-Unterrichten
< Java
Version vom 16. August 2019, 10:37 Uhr von Matthias Scharwies (Diskussion | Beiträge) (N - importiert; aktualisiert)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Ein Java-Applet ist ein Computerprogramm, das mittels Java-Technologie erstellt und normalerweise in einem Webbrowser ausgeführt wird. Applets wurden eingeführt, um Programme in Webseiten ablaufen lassen zu können, die im Webbrowser (auf der Client-Seite) arbeiten und direkt mit dem Benutzer interagieren können, ohne Daten zum Server senden zu müssen. Java-Applets waren Ende der 1990er Jahre mit ein Grund für den Erfolg und die schnelle Verbreitung von Java.

Sicherheit

Achtung

Applets werden auf dem Rechner des Anwenders ausgeführt und stellen daher - wie jedes lokal ausführbare Programm - ein Sicherheitsrisiko dar. Da die Applets in einer abgeschotteten Laufzeitumgebung (SandboxWikipedia-logo.png) laufen, ist dieses Risiko jedoch gut kontrollierbar. Ein Sicherheitsrisiko durch "böswillige" Applets besteht nur, wenn die Sandbox fehlerhaft ist.

Google Chrome hat seit Version 45 (September 2015); Firefox seit Version 52 (März 2017) Java-Applets deaktiviert. Die Applet-Technologie wird künftig aus Java entfernt.

Oracle empfiehlt stattdessen Web Start Applications zu programieren.



Kennzeichen von Applets

Sie verfügen unter anderen über die folgenden Methoden:

init() - wird genau einmal aufgerufen, wenn das Applet erstmals in den Browser geladen wird. 
start() - wird jedesmal aufgerufen, wenn das Applet sichtbar wird. 
paint(...) - Zeichenmethode für die Anzeigefunktionen des Applet 
stop() - wird jedesmal aufgerufen, wenn das Applet verdeckt wird, z.B. weil das Browser-Fenster von einem anderen Fenster überdeckt wird. 
destroy() - wird aufgerufen, wenn das Applet aus dem Hauptspeicher entladen wird. 

Beispiel 1

Ein einfaches Beispiel HalloWelt.java (hier wird nur paint() überschrieben um gezielt ab der Stelle 100,100 den Text ausgeben zu können):

import java.awt.*;
import java.applet.Applet; 
public class HalloWelt extends Applet 
{            
   public void paint( Graphics g ) 
   {
       g.drawString( "Mein erstes Java-Applet!",100,100 );    // Grafik-Text
   }                                             
}

Übung
Testen Sie das Applet. Ändern Sie Text und Position der Ausgabe. Fügen Sie eine zweite Ausgabe hinzu.


Shapes

Die Schnittstelle um graphische Objekte wie Shapes, oder aber auch Bilder zu zeichnen, ist in Java das Graphics-Objekt.

Ausgabe eines Strings:

  • g.drawString( "Mein erstes Java-Applet!",100,100 );

Ausgabe eines Strings mit anderem Zeichensatz und Farbe

  • g.setFont(new Font("Dialog", Font.PLAIN, 18));
  • g.setColor(Color.BLUE);
  • g.drawString("Hallo Welt", 10,40);

Ausgabe eines ausgefüllten abgerundeten Rechtecks

  • g.fillRoundRect(startX,startY,breite,hoeher,radiusAbrundungX,radiusAbrundungY);

Zum Beispiel:

  • g.fillRoundRect(50,70,20,30,10,20);

aus: http://de.wikibooks.org/wiki/Java_Standard:_Das_Graphics_Object

In der offiziellen Java-Dokumentation finden Sie alle Methoden der Klasse Graphics hier:

Ein Haus

import java.awt.*;
import java.applet.Applet; 
public class HalloWelt extends Applet 
{            
   public void paint( Graphics g ) 
   {
       g.setColor(Color.BLUE);
       g.drawRect(100,150,200,100);
       g.setColor(Color.RED);
       g.drawLine(100,150,200,50);
       g.drawLine(300,150,200,50);
    }                                             
}

Übung
  1. Setzen Sie dem Haus eine Schornstein und ergänzen Sie ein Fenster und eine Sonne.
  2. Zeichnen Sie als Übung zur Grafik ein beliebiges Bild.


Zufallsfigur

import java.awt.*;
import java.applet.Applet;
import java.util.Random;
public class Zufallsfigur extends Applet 
{
    private static final Random rand = new Random();
    public void paint( Graphics g ) 
    {
        g.setColor(Color.BLUE);
        for (int i = 1; i <= 1000; i++)
        {
            g.setColor(Color.RED);
            g.drawString(""+rand.nextInt(500), i*10,i*10);
            g.setColor(Color.BLUE);
            g.drawLine(rand.nextInt(500),
                       rand.nextInt(500),
                       rand.nextInt(500),
                       rand.nextInt(500));
        }
    }                                             
}

Übung
  1. Mathematische Aufgabe: Warum liegen in der Mitte des Bildes mehr blaue Halme als außen?
  2. Entwerfen Sie ein Zufallsbild mit Kreisen.


Applets und Threads

„Nebenläufigkeit (concurrency) ist die Fähigkeit eines Systems zwei oder auch mehrere Aufgaben (scheinbar) gleichzeitig auszuführen. In Java kann die Ausführungsparallelität innerhalb eines Programmes mittels Threads (lightweight processes) erzwungen werden.“

Das folgende Applet zeichnet alle halbe Sekunde 5 Linien auf den Bildschirm.

import java.awt.*;
import java.applet.Applet;
import java.util.Random;
public class ZufallsfigurMitThread extends Applet implements Runnable
{  
    Thread thread;
    private static final Random rand = new Random();
     
    public void init()
    {
        thread= new Thread(this); // thread ist ein neuer Thread dieses Applets
        thread.start(); // starte den Thread
    }  

    public void destroy()
    {
        thread = null; // Beim Verlassen des Applets setze den Thread auf null
    } 
    
    public void run()
     {
          while (true) // solange true, also immer
          {    
               repaint(); // rufe paint auf 
               try // und versuche, 500 Millisekunden zu warten
               {
                   Thread.sleep(500);
               }
               catch (InterruptedException e) // wenn das mit dem Warten nicht geklappt hat, 
               {
                    System.out.println(e); // dann gib einen Fehler aus.
               }
          }

     } 
    
    public void paint( Graphics g ) 
    {
       g.setColor(Color.BLUE);
       for (int i = 1; i <= 5; i++)
       {
           g.setColor(Color.BLUE);
           g.drawLine(rand.nextInt(500),
                      rand.nextInt(500),
                      rand.nextInt(500),
                      rand.nextInt(500));
       }
    }                                             
}

Übung
  1. Ändern Sie die Geschwindigkeit, die Farbe und die Anzahl der Linien.
  2. Entwerfen Sie eine eigene Zufallsgrafikenanimation.


GUI und Applet

Kaum ein modernes Programm kommt heutzutage ohne eine ansprechende GUI aus. Daher hier nun ein Beispiel, wie man mit Beschriftungen und Buttons in Java umgeht.

Grobe Erklärung der Funktionsweise: Ein neuer Button wird angelegt. Dieser bekommt einen ActionListener zugewiesen. Der sorgt dafür, dass actionPerformed aufgerufen wird, wenn der Button gedrückt ist. Da man manchmal mehrere Elemente hat, prüft man mit if (evt.getSource() == button), ob das ActionEvent „evt“ auch wirklich vom Button button stammt.

Vertiefend:

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet; 
public class GUI_1 extends Applet implements ActionListener
{  
    Label label;
    Button button;
    int anzahl;
    
    public void init()
    {
        button = new Button("Schaltfläche");
        button.addActionListener(this);
        add (button);
        
        label = new Label("Du hast kein mal gedrückt");  
        add(label);
    }  

    
    public void actionPerformed(ActionEvent evt) 
    {
         if (evt.getSource() == button) {
              anzahl++;
              label.setText("Du hast "+anzahl+" mal gedrückt");
              repaint();
         }
    } 
                                           
}

Übung
  1. Legen Sie ein zweites Label an, was anzeigt, wie oft man noch drücken muss, bis 100 erreicht ist.
  2. Legen Sie einen zweiten Button an, der herunterzählen lässt.


Textfeld

Die folgende Klasse verwendet neben Buttons und Labels auch Textfelder. In diesen können Benutzer Eingaben tätigen, die mit getText() abgefragt werden können. setText(...) ändert den Text.

Vertiefend:

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet; 
public class GUI_2 extends Applet implements ActionListener
{  
    Label label;
    Button button;
    TextField textfield;
    int anzahl;
    
    public void init()
    {   
        textfield = new TextField("niemand");
        add (textfield);
        button = new Button("Begrüße");
        button.addActionListener(this);
        add (button);
        
        label = new Label("Ich kenne dich nicht!");  
        add(label);
    }  

    
    public void actionPerformed(ActionEvent evt) 
    {
         if (evt.getSource() == button) {
              label.setText("Hallo "+textfield.getText());
              repaint();
         }
    } 
                                           
}

Textarea

Mehrzeilige Texteingabefelder können Sie mit der Klasse TextArea erstellen. Zusätzlich zu dem Anfangstext gibt man beim Anlegen noch die Zeilenanzahl und die Breite in Buchstaben an. Hinweis: \n wechselt im TextArea die Zeile, führt aber z.B. in einzeiligen Labels zu Problemen!

textarea = new TextArea("Hallo Welt!\nWo bist du?", 5,30));

Weitere GUI-Elemente

Wie Menus, Radiobuttons, Listen etc. sowie Tipps zum Layout finden Sie hier: