Java-Applikationen


Eine ganz einfache Applikation

Wir wollen jetzt anfangen, mit Dateien zu arbeiten. Aus Sicherheitsgründen gibt es dabei Einschränkungen, solange man Applets programmiert. Diese Einschränkungen entfallen bei Applikationen. Das sind Java-Programme, die zu ihrer Ausführung keinen Browser bzw. den Appletviewer, sondern die im JDK enthaltene virtuelle Maschine java.exe benötigen. In unserer Programmieroberfläche RealJ wird eine Applikation durch den gelben Pfeil gp.gif (874 Byte) gestartet. Eine Applikation muss als Startpunkt eine Methode mit dem Namen main besitzen. Der Quellcode der einfachsten Applikation sieht dann so aus:

public class prog1{

   public static void main(String[] argumente){
     System.out.println("Hallo Gyko");
   }
}

Wenn diese Applikation kompiliert und gestartet wird, sieht das Ergebnis ziemlich jämmerlich aus:

gr2.gif (2038 Byte)

Beim Start  der Applikation könnte man Argumente eingeben, was aber meistens nicht gemacht wird.

Eine Applikation, die wie ein Applet aussieht

Mit etwas Aufwand kann man natürlich auch Applikationen in Fenstern ablaufen lassen. Die notwendige Arbeit nimmt uns sogar RealJ ab. Wenn wir ein neues Applikation Projekt mit dem Name applic1 öffnen, erzeugt RealJ schon etwas Programm-Code. Den ändern wir etwas ab, bis er so aussieht:

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

public class applic1 extends Frame{

  public applic1(){
    this.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        dispose();
        System.exit(0);
      }
    });
  }

  public static void main(String args[]){
    System.out.println("Unsere Applikation");//1. Änderung
    applic1 f = new applic1();
    f.setSize(300,200);//2. Änderung
    f.show();
  }

}

Das sieht dem Code eines Applets recht ähnlich. Zusätzlich zur main-Methode steht hier der Code für den Konstruktor der Klasse applic1. Diese Klasse ist von der Oberklasse Frame abgeleitet, die eng mit der Klasse Applet verwandt ist (beide Klassen haben einen gemeinsamen Großvater "container" mit der Methode paint). Die Methode main schreibt zwar noch Text auf den Bildschirm, ihre Hauptaufgabe ist es aber, den Konstruktor applic1 aufzurufen, die Größe des dadurch erzeugten Fensterobjekts festzulegen und das Fenster schließlich sichtbar zu machen. Um die Einzelheiten des Fenster-Konstruktors kümmern wir uns zunächst nicht. Wichtig ist nur: Beim Schließen des Fensters wird das Programm beendet. Wenn das Fenster weitere Eigenschaften erhalten soll, muss der Konstruktor entsprechend ergänzt werden. Der Fensterkonstruktor kann damit die Funktion übernehmen, die die init()-Methode bei Applets hat.

Wenn wir das Programm kompilieren und starten erscheint ein leeres Fenster. Das können wir schnell ändern. Von der gemeinsamen Ahnen-Klasse "container" hat Frame und damit auch applic1 die Methode paint() geerbt. Das bedeutet, dass paint() genauso verwendet werden kann wie bei Applets. Wir fügen zum obigen Quellcode also noch eine paint() Methode dazu:

  public void paint(Graphics g){
    g.setColor(Color.red);
    g.drawString("Hallo Gyko",140,50);
    g.drawRect(130,35,100,20);
  }

Nach dem Kompilieren und Starten des Programms bekommt das Fenster wieder einen Inhalt.

Applet2Applikation

Es gibt ein einfaches Verfahren, die bisher entwickelten Applets in Applikationen zu verwandeln:

Der Fenster-Konstruktor übernimmt die Rolle der init()-Methode
Der Konstruktor wird in der main-Methode aufgerufen.
Der Rest des Applets kann unverändert übernommen werden.

Die Übertragung des Geheimschrift-Applets führt dann zu der folgenden Applikation:

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

public class codeapp extends Frame{
  Button bt;
  TextField tfe,tfa;
  String eing,ausg; 

  public codeapp(){
    this.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        dispose();
        System.exit(0);
      }
    });
    setLayout(new GridLayout(3,1));//Hier kommen die alten Befehle
    add(tfe=new TextField(30));
    add(bt=new Button("Codieren"));
    add(tfa=new TextField(30));
  }

  public static void main(String args[]){
    System.out.println("Code-Application");
    codeapp f = new codeapp();
    f.setSize(200,200);
    f.show();
  }

  public boolean action(Event e, Object was){
    eing=tfe.getText();
    byte[] ascii=eing.getBytes();
    for(int i=0;i<eing.length();i++){
      ascii[i]=(byte)(ascii[i]+1);
    }
    ausg=new String(ascii);
    tfa.setText(ausg);
    return true;
  }
}