JAVA

 

Alfred Nussbaumer

 

Java  erfordert eine strenge objektorientierte Programmierung. In diesem Beitrag sollen daher Beispiele vorgestellt werden, die die Verwendung von Objekten bereits bei winzigen Anwendungen sinnvoll erscheinen lassen. Nachdem in den ersten beiden Beiträgen (vgl. PC-News 72 und PC-News 73) ausschließlich Java-Applikationen realisiert wurden, sollen hier Java-Applets verwendet werden, die innerhalb der jeweiligen Browser-Umgebung ablaufen.

 

1. Applets

 

Applets werden als Teil einer Web-Seite vom jeweiligen Browser ausgeführt - falls das Ausführen von

Java-Byte-Code nicht aus "Sicherheitsgründen" gesperrt wurde. Alle Applets sind Unterklassen der Klasse "Applet", die im Package "java.applet" enthalten ist. Wird also eine Unterklasse von "Applet" erzeugt, so werden automatisch alle Methoden vererbt, die notwendig sind, damit ein Java-Programm als Applet im Rahmen einer Web-Seite ausgeführt werden kann.

 

Applets werden also zunächst mit einem Editor erstellt, dann mit dem Javacompiler übersetzt und schließlich von der Java-Laufzeit-Umgebung eines Webbrowsers ausgeführt. Auch hier gilt: Der Name des Applets muss mit dem Namen der Quelldatei übereinstimmen.

 

Zum Entwickeln und Testen von Java-Applets ist es allerdings günstiger, den sogenannten "Appletviewer" zum Ausführen des erstellten Applets zu verwenden...

 

Das fertige Applet wird mit dem Applet-Tag in ein HTML-Dokument eingebunden:

      ...

      <applet code = "grafapp.class"

              height = "300"

              width = "300">

      </applet>

      ...

 

Damit kann ungefähr folgende Vorgangsweise beim Erstellen von Applets (je nach Betriebssystem und Entwicklungsumgebung) gewählt werden:

 

1.edit grafapp.java

2.javac grafapp.java

3.appletviewer  grafapp..html (enthält den Aufruf der erzeugten Klasse  grafapp.class).

 

Aus Sicherheitsgründen gelten für  (unsignierte) Applets Einschränkungen im Vergleich zu Applikationen - immerhin sollte jeglicher Java-Code, der auf einem PC vorliegt als sicher gelten, während jeder Java-Code, der über Netzwerke geladen wird, grundsätzlich als unsicher einzustufen ist. Nach dem so genannten »Java in a Sandbox«-Prinzip sind daher für Applets u.a. folgende Aktionen unzulässig:

1.Applets dürfen keine Dateien auf der Festplatte schreiben oder lesen (gilt auch für Verzeichnisse und Druckerausgabe).

2.Applets dürfen keine Netzwerksverbindungen (sockets) aufbauen.

3.Applets dürfen keine lokalen Prozesse starten (LinuX: rm *, forking, DOS: DLLs, format.com etc.)

 

Applets werden als Erweiterungen der Klasse »Applet« codiert - der übrige Programmcode deckt sich  weitgehend mit dem Code für Applikationen. Applets brauchen (als Erweiterung von java.applet.Applet) kein eigenenes Hauptprogramm mehr - bestimmte Methoden werden beim Laden des Applets in den Browser automatisch aufgerufen.

 

Beispiel: Fadengrafik

import java.awt.*;

 

public class grafapp

             extends java.applet.Applet {

 

  public void paint (Graphics g) {

    int i;

    int j;

    g.setColor(Color.red);

    for (i=1;i<10;i++) {

      for (j=1;j<10;j++) {

        g.drawLine(50+i*45,20,500-j*45,200);

      }

    }

  }

}

 

<Bild: Fadengrafik als Applet, fadenapp.jpg>

 

Vergleiche den Code dieses Applets mit dem Code des Beispiels von PC-News 72!

 

Beim Ablauf eines Applets im WebBrowser werden der Reihe nach folgende Methoden abgearbeitet:

Oinit() -        beim Laden des Applets wird vom Browser           diese Methode aufgerufen. Falls in einem     Applet Initialisierungen notwendig sind,            können sie hier codiert werden.

Ostart() -      wird jedesmal aufgerufen, wenn das Applet           wieder sichtbar wird (z.Bsp. neuer   Bildschirmaufbau).

Opaint() -     wird automatisch aufgerufen, um das Applet         zu »zeichnen«. Beim Überschreiben dieser    Methode wird im Wesentlichen das Applet     »entwickelt«. Falls während des      Programmlaufes etwas Neues gezeichnet      werden soll, ist die Methode repaint() zu                 verwenden.

Oupdate() wird vom Browser aufgerufen, wenn           Änderungen auszugeben sind.

Ostop() - Beendet die Ausführung des Applets (etwa               wenn die Ausgabefläche in den Hintergrund               verschoben wird)

Odestroy() - wird beim Beenden des Applets               ausgeführt; dabei wird im Allgemeinen ein    sauberes »Aufräumen« des Hauptspeichers             sicher gestellt.

Die meisten  von der Klasse »Applet« zur Verfügung gestellten Methoden werden fertig in das eigene Applet übernommen. Nur die Methoden init() und paint() eigenen sich in besoderer Weise beim Erstellen eigener Applets.

2. Objektorientierte Programmierung

 

Bei der Durchsicht des letzten Beispiels fällt der objektorientierte Ansatz von Java sofort ins Auge:

 

public class grafapp

             extends java.applet.Applet {

 

Jede eigene Benutzeranwendung ist eine Klasse, die gegebenenfalls eine schon bestehende Klasse erweitert (in diesem Beispiel ist die Klasse Applet die  Super-klasse der Klasse grafapp), die Klasse grafapp

eine abgeleitete Klasse, die alle Methoden der

Superklasse zur Verfügung hat.

 

  public void paint (Graphics g) {

    ...

    g.setColor(Color.red);

 

Das Applet verwendet hier die wichtige Methode paint(),  mit der die Bildschirmausgabe geregelt wird. Die Methode paint() arbeitet mit dem Objekt g der Klasse Graphics, die alle wichtigen Grafikbefehle enthält - hier etwa das Setzen der Zeichenfarbe. Beachte die korrekte Referenzierung! Für die Grafik wird schließlich noch die Klasse Color verwendet, die die übliche RGB-Farbdarstellung zur Verfügung stellt (in diesem Beispiel die Farbkonstante Color.red).

 

3. Beispiel - Wurfbahn „interaktiv“

 

<Bild: Wurfbahn als Applet im Browser, wurfbahnapp.jpg>

 

iimport java.awt.*;

import java.awt.event.*;

import java.applet.*;

 

public class wurfbahnapp extends Applet

          implements ActionListener {

 

  TextField vein;

  TextField vwindein;

  Button ok;

  Button close;

  double v;

  double vwind;

 

  public void init() {

    setLayout(new BorderLayout());

    Panel panel = new Panel();

    panel.setLayout(new GridLayout(12,1,10,5));

    Label header = new Label("Schiefer Wurf");

    panel.add(header);

    Label text = new Label("Eingaben - ");

    panel.add(text);

    Label label1 = new

      Label("Abwurfgeschwindigkeit:");

    panel.add(label1);

    vein = new TextField("70",8);

    panel.add(vein);

    Label label2 = new

       Label("Windgeschwindigkeit:");

    panel.add(label2);

    vwindein = new TextField("20",8);

    panel.add(vwindein);

    ok = new Button("ok");

    panel.add(ok);

    ok.addActionListener(this);

    close = new Button("exit");

    panel.add(close);

    close.addActionListener(this);

    add("East",panel);

  }

 

  public void actionPerformed(ActionEvent e) {

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

      werteuebernehmen();

      repaint();

    }

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

      System.exit(0);

    }

  }

 

  public void werteuebernehmen() {

    v = Double.valueOf(vein.getText()).doubleValue();

    vwind = Double.valueOf(vwindein.getText()).doubleValue();

  }

 

  public void paint (Graphics g) {

    double xalt,yalt,x,y,vx,vy,ax,ay,dt;

    g.setColor(Color.white);

    g.fillRect(0,0,620,600);

    g.setColor(Color.black);

    g.drawLine(0,200,620,200);

    g.setColor(Color.red);

    for (int i=0;i<7;i++) {

      dt=0.1;

      xalt=0;

      yalt=200;

      vx = v*Math.cos(-15*i*3.14/180);

      vy = v*Math.sin(-15*i*3.14/180);

      x=0;

      y=200;

      ax=0;

      ay=9.81;

      do {

        vx=vx+(ax-vwind*vwind*0.01)*dt;

        vy=vy+ay*dt;

        x=x+vx*dt;

        y=y+vy*dt;

  g.drawLine((int)xalt,(int)yalt,(int)x,(int)y);

        xalt=x;

        yalt=y;

      } while ((x<600) && (y<600) && (x>=0));

    }

  }

}

 

Bei einem Applet liegt kein Konstruktor wie bei Applikationen vor. Da die Methode init() beim Laden des Applets auf jeden Fall ausgeführt wird, eignet sie sich zum Festlegen des Layouts. Beachte, dass der so genannte „ActionListener“ mit den beiden Schaltflächen   („Buttons“) verbunden werden muss.

 

Die beiden Schaltflächen „ok“ und „exit“ lösen einen so genannten „Event“ aus, der mit Hilfe der Methode actionPerformed() abgearbeitet wird. Innerhalb   dieser Methode wird mit Hilfe entsprechender if-            Abfragen der entsprechende Programmteil aufgerufen.

 

Die Klasse wurfbahnapp verwendet das sogenannte „Interface“ ActionListener, das die Methoden festlegt, die für die Interaktion von Schaltflächen verwendet

werden. Interfaces sind Klassen, deren Methoden nur „abstrakt“ definiert sind - die Implementierung muss der Anwender innerhalb der eigenen Klasse selbst vornehmen - vergleiche den Programmcode zur Methode actionPerformed(). Dieser Sachverhalt wird im Kopf der Klasse durch die Ergänzung „implements ActionListener“ deutlich.