Tit   Inh   Ind   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   <<   <   >   >> 

2.2 Schritt 1: Die Programmstruktur



In Java kann man entweder Applets oder Applikationen schreiben. Während es sich bei Applikationen um eigenständige Programme handelt, die mit Hilfe des Java-Interpreters gestartet werden können, laufen Applets innerhalb eines Browsers. Sie wurden erfunden, um interaktive Web-Seiten zu entwickeln, die neben Text auch Grafiken, Dialoge und andere Programmfunktionalitäten enthalten können.

Unser Beispielprogramm ist als Applet ausgelegt und sollte daher in jedem Browser ausgeführt werden können, der Java 1.1 beherrscht. Dazu zählen beispielsweise HotJava von Sun, die jüngeren 4er-Versionen des Netscape Navigator und (für unsere Zwecke) der Microsoft Internet Explorer 4.

Jedes Java-Programm - egal ob Applet oder Applikation - besteht aus einer Reihe von Quelldateien mit der Erweiterung .java. Diese werden vom Compiler in Bytecode übersetzt und in .class-Dateien gespeichert, die dann vom Interpreter ausgeführt werden können. Java ist eine vollständig objektorientierte Sprache, und zu jeder Klasse wird eine eigene .class-Datei angelegt. Unser Beispielprogramm besteht lediglich aus einer einzigen Quelldatei Puzzle.java, die insgesamt drei Klassen enthält:

Üblicherweise wird nur eine Klasse pro Quelldatei definiert. In diesem Fall aber wurden die Klassen MyMouseListener und MyMouseMotionListener lokal zur Hauptklasse deklariert und daher in derselben Quelldatei belassen. In jedem Fall darf nur eine Klasse innerhalb der Quelldatei als public deklariert und so anderen Programmen zur Verfügung gestellt werden.

 Tip 

Die Grundstruktur unseres Programmes sieht so aus:

001 /**
002  * @(#)Puzzle.java   1.000 97/07/23
003  *
004  * Copyright (c) 1997 Guido Krueger. All Rights Reserved.
005  *
006  * Dieses Applet ist die Implementierung eines Schiebepuzzles
007  * mit 4 x 4 Feldern. Auf den zunächst unsortierten Spielsteinen
008  * werden die Bestandteile eines Images angezeigt, die dann per
009  * Drag & Drop sortiert werden können. Der einzig erlaubte 
010  * Zug besteht darin, einen Stein in die benachbarte Lücke zu
011  * verschieben. Durch Klicken auf den Rahmen kann die Sortierung
012  * umgekehrt werden.
013  *
014  * Das applet-Tag erwartet folgende Parameter:
015  *
016  * bordersize = Breite des Spielfeldrandes
017  * src        = Name der Bilddatei (gif oder jpeg)
018  *
019  */
020 import java.awt.*;
021 import java.awt.event.*;
022 import java.applet.*;
023 import java.util.*;
024 
025 public class Puzzle
026 extends Applet
027 {
028    //Variablendeklarationen 
029 
030    public void init()
031    {
032       //Initialisierung des Applets
033    }
034 
035    public void update(Graphics g)
036    {
037       //Wird überlagert, um die Grafikdarstellung
038       //flimmerfrei zu machen
039    }
040 
041    public void paint(Graphics g)
042    {
043       //Grafikausgabe, ruft paintBorder und
044       //paintField auf
045    }
046 
047    private void paintBorder(Graphics g)
048    {
049    }
050 
051    private void paintField(Graphics g)
052    {
053       //Zeichnet die Spielsteine auf dem Brett.
054    }
055 
056    private void prepareImage()
057    {
058       //Lädt das Bild.
059    }
060 
061    private void randomizeField(boolean unordered)
062    {
063       //Mischt die Steine auf dem Spielfeld.
064    }
065 
066    class MyMouseListener
067    extends MouseAdapter
068    {
069       public void mousePressed(MouseEvent event)
070       {
071          //Maustaste wurde gedrückt.
072       }
073 
074       public void mouseReleased(MouseEvent event)
075       {
076          //Maustaste wurde losgelassen
077       }
078 
079       private Point getFieldFromCursor(int x, int y)
080       {
081          //Liefert den zur Mausposition passenden horizontalen u.
082          //vertikalen Index des darunterliegenden Steins. Liegt
083          //der Punkt auf dem Rahmen, wird (-1,-1) zurückgegeben.
084          return null;
085       }
086 
087       private boolean areNeighbours(Point p1, Point p2)
088       {
089          //Testet, ob die durch p1 und p2 bezeichneten Spielsteine
090          //Nachbarn sind.
091          return false;
092       }
093 
094       private void swapRandomization()
095       {
096          //Kehrt die Steineordnung um: falls sie sortiert sind,
097          //werden sie gemischt, andernfalls werden sie sortiert.
098       }
099    }
100 
101    class MyMouseMotionListener
102    extends MouseMotionAdapter
103    {
104       public void mouseDragged(MouseEvent event)
105       {
106          //Maus wurde bei gedrückter Taste bewegt.
107       }
108    }
109 }
Listing 2.1: Grundstruktur des Schiebepuzzles

Wir erkennen die drei Klassendefinitionen, die durch das Schlüsselwort class eingeleitet werden, und eine Reihe von Methoden, die innerhalb der Klassen definiert wurden. Anstelle des Methodenrumpfs haben wir hier lediglich einen Kommentar eingefügt, der ihre Aufgabe beschreibt. In den nachfolgenden Abschnitten werden alle Methoden näher beschrieben.

Am Anfang des Programms befindet sich ein umfangreicher Kommentar, der seine Aufgabe beschreibt. Dieser Kommentar wurde als Dokumentationskommentar angelegt, der mit dem Werkzeug javadoc zur Erzeugung von Sourcecode-Dokumentationen verwendet werden kann. Die nachfolgenden import-Anweisungen zeigen dem Java-Compiler, welches die Pakete sind, aus denen das Programm Klassen und Methoden verwenden will. Anders als in C oder C++ gibt es in Java keine separaten Headerfiles, sondern der Compiler liest zum Übersetzungszeitpunkt die .class-Dateien der eingebundenen Pakete.

Der abgebildete Programmrumpf ist bereits übersetzbar und kann als Applet gestartet werden. Die Übersetzung erfolgt mit Hilfe des Compilerprogramms javac, das mit folgendem Kommando aufgerufen wird (wenigstens, wenn das JDK verwendet wird):

javac Puzzle.java

Nach der Übersetzung existieren drei Klassendateien Puzzle.class, Puzzle$MyMouseMotionListener.class und Puzzle$MyMouseListener.class, die im selben Verzeichnis wie die Quelldatei liegen. Mit Hilfe des AppletViewers könnte das übersetzte Programm nun gestartet werden. Zuvor benötigen wir allerdings noch eine passende HTML-Datei, die das Applet einbindet. Diese werden wir im nächsten Abschnitt vorstellen.

Weitere Informationen zur Strukturierung von Programmen und zur Einbindung von Paketen finden sich in Kapitel 8. Kapitel 7 liefert eine ausführliche Erklärung der objektorientierten Programmierung und erklärt die Verwendung von Klassen und Methoden. Die Entwicklung von Applets wird in Kapitel 25 erklärt. Kapitel 26 erläutert die Verwendung von javadoc zur Generierung von HTML-Dokumenten aus Java-Quelltexten und beschreibt den Aufruf des Compilers javac und des Interpreters java.

 Hinweis 


 Tit   Inh   Ind   1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   <<   <   >   >> 
Go To Java 2, Addison Wesley, Version 1.0.2, © 1999 Guido Krüger, http://www.gkrueger.com