Applets und Applikationen • Applikationen Methode main: public static void main (String [] args) { ... wird bei Aufruf der Klasse ausgeführt wird Argument ist standardmäßig ein Feld von Strings. • Applets notwendige Import-Anweisungen: import java.applet.*; bzw. import javax.swing.JApplet muss eine Unterklasse von Applet sein: public class geoobjtest extends Applet { .... P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 1 Applet-Aufruf Aufruf des Applet mittels • • Applet-Viewer in der Entwicklungsumgebung Browser: zeigt eine HTML-Datei an. <html> <head> geoobjtest1 Applet-test </head> <body> <applet code="geoobjtest.class" width=200 height=200> AUSGABE </applet> </body> </html> Es gibt noch andere Möglichkeiten P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 2 Applet-Methoden public void init() public void start() public void paint(Graphics g) public void stop() public void destroy() Sollten in der Unter-Klasse von Applet überschrieben werden. P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 3 Applet-Methoden Aufruf Je nach Aktion und Zeitpunkt werden aufgerufen: init() start() paint(Graphics g) P raktische Inf ormatik 2, SS Einmal beim Laden des Applets. Typischerweise wird in dieser Methode intitialisert, falls notwendig. Wird vom Browser direkt nach der Methode init aufgerufen, aber auch, wenn das Applet-Fenster im Browser nach Besuch einer anderen Web-Seite wieder aktiviert wird. Wird vom Browser aufgerufen, wenn das Fenster neu gezeichnet werden muss, z.B. nach Verdecken und Wiederaufdecken des Fensters, oder beim Vergrößern des Fensters. 2005, F olien Java;3, (4. M ai2005) Seite 4 Applet-Methoden Aufruf stop() destroy() P raktische Inf ormatik 2, SS Wird aufgerufen, wenn der Benutzer zu einer anderen Web-Seite wechselt. Kann internes Anhalten sein. Wird vom Browser aufgerufen, wenn das AppletFenster geschlossen wird. 2005, F olien Java;3, (4. M ai2005) Seite 5 Beispiel: ebene geometrische Objekte public class Punkt { int x,y; Punkt (int x, int y) { this.x = x; this.y = y; } } // zweiter File: geoobjtest.java import java.applet.*; import java.awt.*; public class geoobjtest extends Applet { P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 6 GeoObjekt [] geos; Punkt p1,p2,p3,p4,m1; GeoObjekt lin; public void init () { p1 = new Punkt (10,10); p2 = new Punkt (50,50); p3 = new Punkt (100,10); p4 = new Punkt (80,120); lin = new Linie (p1,p4); m1 = new Punkt (50,70); geos = new GeoObjekt[3]; geos[0] = new Kreis (30, m1); geos[1] = lin; geos[2] = new Dreieck (p1,p2,p3); } public void paint (Graphics g) { for (int i = 0;i < geos.length;i++) geos[i].zeichne(g); } } abstract class GeoObjekt { public abstract void zeichne (Graphics g); public abstract boolean innen (Punkt p); } class Rechteck extends GeoObjekt { public Punkt lu; public int b,h; // x,y Koord , b,h, Breite,Hoehe Rechteck (Punkt p,int b, int h) { this.lu = p; this.b = b; this.h = h; } public void zeichne (Graphics g) { // Methode zum Zeichnen g.drawRect (lu.x, lu.y, b, h); // Aufruf Bibfu drawRect } public boolean innen (Punkt p) { return this.lu.x <= p.x && p.x <= this.lu.x+b && this.lu.y <= p.y && p.y <= this.lu.y+h; } } class Kreis extends GeoObjekt { public int r; // Radius public Punkt m; // Mittelpunkts Kreis (int r, Punkt m) { this.m = m; this.r = r; } public void zeichne (Graphics g) { g.drawArc (m.x-r, m.y-r, 2*r, 2*r, 0, 360); // Aufruf der Bib fu drawArc } public boolean innen (Punkt p) { return (m.x-p.x)*(m.x-p.x) + (m.y-p.y)*(m.y-p.y) <= r*r; } } class Linie extends GeoObjekt { public Punkt a,b; Linie (Punkt a, Punkt b) { this.a = a; this.b = b; } public void zeichne (Graphics g) { g.drawLine (a.x, a.y, b.x, b.y); } public boolean innen (Punkt p) { Dreieck dr; dr = new Dreieck (p,this.a, this.b); return (p == this.a || p == this.b || dr.entartet() && (b.x-p.x)*(p.x-a.x) > 0 && (b.y-p.y)*(p.y-a.y) > 0); } } class Dreieck extends GeoObjekt { public Punkt p1,p2,p3; // Koordinaten der Ecken Dreieck (Punkt p1, Punkt p2, Punkt p3) { this.p1 = p1; this.p2 = p2; this.p3 = p3; } public void zeichne (Graphics g) { g.drawLine (p1.x, p1.y, p2.x, p2.y); g.drawLine (p2.x, p2.y, p3.x, p3.y); g.drawLine (p3.x, p3.y, p1.x, p1.y); } public boolean entartet () { return (p3.x-p1.x)*(p2.y-p1.y) == (p2.x-p1.x)*(p3.y-p1.y); } public boolean innen (Punkt r) { return true; } } Schnittstellen (Interfaces) • Interface-Definition enthält nur die Namen der gemeinsamen Methoden, deren Stelligkeit und Argumenttypen Keine Implementierung public interface MeinInterface methode1 (typ1, typ2); methode2 (...); ... } • { Interface-Benutzung extends .... implements interface1, interface2, ... P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 12 Schnittstellen: Bemerkungen • • Sinnvoll, wenn Klassen gemeinsame Funktionalität haben, aber nicht durch die Klassenhierarchie verbunden sind, konkrete Klassen mit ... implements... müssen alle Schnittstellenmethoden implementieren Programmiervorteile • die Strukturierung, • Nutzung der Vererbung der Methoden • Unterstützunge der Verwendung desselben Methodennamens (Overloading). • Ersatz für die fehlende multiple Vererbung auf der Methodenebene • Bessere Verwendung der Bibliotheken und JVM P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 13 Schnittstellen: Beispiel Schnittstelle: Runnable Methode: Run() Verwendung: Starten des Objektes als Thread P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 14 Schnittstellen: Comparable definiert eine totale Ordnungsbeziehung und Vergleichsmethoden: ... implements Comparable { public int compareTo(Object other) { Fahrzeug anderesfz = (Fahrzeug)other; if (this.hoechstgeschindigkeit < anderesfz.hoechstgeschindigkeit) return -1; if (this.hoechstgeschindigkeit > anderesfz.hoechstgeschindigkeit) return 1; return 0 } analog zu Haskells Typklasse Ord: Vergleichsmethoden: <, ≤, >, ≥ P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 15 Klassenbibliotheken in Java Klassen werden strukturiert in Pakete (packages). Beispiele für vorhandene Bibliotheken bzw. packages java.lang java.util java.applet java.awt java.swing java.io java.net P raktische Inf ormatik 2, SS Basispaket, das z.B. Zahlen implementiert. Einige extra Basisfunktionalitäten: Hashtabellen, Datum, Random, Vector, enumeration (Liste) bzw. java.Japplet Oberklasse für Applets Abstract window toolkit bzw. javax.swing Erweiterung von java.awt Lesen, Schreiben, ... von Files, Puffern, Pipes, Druckern, Netzzugriffen, Verbindungen, Lesen, Laden von Ressourcen (URLs). ... 2005, F olien Java;3, (4. M ai2005) Seite 16 System: Bibliothek Einige wichtige Methoden dieser Bibliothek sind: in out err currentTimeMillis() gc() Inputstream: Input-Methoden Outputstream: Output-Methoden Errorstream: Aktuelle Zeit garbage collector Aufruf Einige wichtige Methoden zum OutputstreamSystem.out (auch zum Errorstream System.err) sind: print(Object) println(Object) P raktische Inf ormatik 2, SS Drucken ohne Zeilenumbruch Drucken mit Zeilenumbruch 2005, F olien Java;3, (4. M ai2005) Seite 17 Mathematische Bibliothek public final class Math • Die Klasse Math kann keine Unterklassen haben, keine Methode kann überschrieben werden. • Alle Methoden und Variablen sind static. P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 18 Mathematische Bibliothek Es gibt folgende Konstanten / Funktionen / Methoden: E,PI ceil(x), floor(x), rint(x), round(x) cos(x), sin(x), tan(x) acos(x), asin(x), atan(x) exp(x), log(x), sqrt(x), pow(x,y) max(x,y), min(x,y), abs(x) random() P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 19 Mathematische Konstanten ganzzahliger Anteil, bzw. Rundungen trigonometrische Funktionen Umkehrfunktionen Einige mathematische Funktionen mathematische Funktionen Ergibt eine Zufallszahl zwischen 0.0 und 1.0 Collections, Vektoren, Listen Listen Mengen Multi-Mengen Assoziationslisten (map) entspricht einer Liste: Es gibt eine Reihenfolge der Objekte und es ist erlaubt, dass Elemente mehrfach vorkommen. Es gibt keine Reihenfolge, Duplikate sind verboten. Es gibt keine Reihenfolge, aber Duplikate sind erlaubt. Liste von Paaren aus Schlüsseln und Daten, wobei die Schlüssel eindeutig sein müssen. In Java 1.4: Collection ist abstrakte Klasse Elementtyp ist stets Object: keine Typinformation Fallunterscheidung und cast über Typen machen. Java 5.0 hat generische Collections P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 20 Collections, Vektoren, Listen Es gibt Methoden zum Einfügen, Löschen, Vergleichen, indiziertem Zugriff, Iterieren. Einige Funktionen sind: boolean add(Object o) void clear() boolean contains(Object o) boolean equals(Object o) boolean isEmpty() Iterator iterator() P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Hinzufügen Löschen Enthaltenseins-Test Vergleich von collections Seite 21 Klasse Vector Die Klasse Vector ist analog zu einer Liste von Objekten. Zum Einfügen von elementaren Datentypen in Vector benötigt man Wrapper-Klassen P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 22 Wrapper-Klassen Wrapperklassen. (mit Großbuchstaben) Short,Byte, Integer, Long, Float, Double, Character, Boolean zugehörige elementare Datentypen short,byte, integer, long, float, double, character, boolean Einpacken: Auspacken P raktische Inf ormatik 2, SS Double x = new Double(3.14);, x.DoubleValue();. 2005, F olien Java;3, (4. M ai2005) Seite 23 Schnittstelle: Iterator Zum Iterieren über Mengen von Objekten, in einem Array, Liste, Vector, Collection Abarbeitung von vorne nach hinten (in der definierten Reihenfolge) Das Interface Iterator hat die Methoden: boolean Object hasNext() next() void remove() P raktische Inf ormatik 2, SS 2005, F olien Java;3, Liefert das nächste Objekt. Als Seiteneffekt wird um eins weitergeschaltet (4. M ai2005) Seite 24 Iterator: Typische Verwendung ... Iterator it = col.iterator(); while (it.hasNext()) ...println(it.next()); In Java 5 gibt es extra for-Syntax für Iteratoren. P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 25 Nebenläufige Berechnung: Threads Threads (Berechnungsfäden): (pseudo-) parallele Unterprozesse. Zwei Möglicheiten zum Erzeugen von Threads: • als Unterklasse von Thread, oder • Klasse implements Runnable Die einzige Methode dieser Schnittstelle ist run(), die implementiert werden muss. P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 26 Methoden zu Threads Werden von außen aufgerufen: start() startet einen Thread. Danach gibt es zwei pseudo-parallele Berechnungen: das startende Programm und den gestarteten Thread. sleep(int ms) join() Pause für die angegebene Zeit (in ms). Wartet auf die Beendigung eines (anderen) Threads. P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 27 Quell-Kode zum Thread-Beispiel class Zaehlthread extends Thread { int thnr,pause; Zaehlthread(int thnr, int pause) { this.thnr = thnr; this.pause = pause; } public void run () { int n = 0; while (n < 100) { System.out.println("Thread: " + thnr + " : " + (n++)); try { sleep(pause); } catch(InterruptedException e) { System.out.println("Thread: " + thnr + " InterruptedException P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 28 } } } } // Extra File: public class ThreadDemo1 { public static void main(String[] args) { Thread t1 = new Zaehlthread(1,100); Thread t2 = new Zaehlthread(2,70); t1.start(); t2.start(); } } Mögliche Ausgabe zweier Threads Start der Klasse ThreadDemo1, die zwei Threads parallel laufen lässt. Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: 2 1 2 1 2 1 2 2 1 2 2 1 2 P raktische Inf ormatik : : : : : : : : : : : : : 2, SS 0 0 1 1 2 2 3 4 3 5 6 4 7 2005, F olien Java;3, (4. M ai2005) Seite 30 Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: Thread: ....... 1 2 1 1 2 1 2 1 2 1 2 2 1 2 2 1 : : : : : : : : : : : : : : : : 5 8 6 7 9 8 10 9 11 10 12 13 11 14 15 12 Beispiel eines Applets: Türme von Hanoi Der Quell-Code einer Animation der Türme von Hanoi • • • • Ein Applet, das einen Thread startet, damit es als Animation verwendbar ist. init erzeugt hier einen neuen Thread, in dem die eigentliche Animation ablaufen kann. start startet diesen Animatinions-Thread. Die Methode Tow ist rekursiv und steuert den Ablauf. P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 32 Beispiel Türme von Hanoi Bemerkungen zur Verwendung von paint: paint-Aufruf falls das Fenster neu gezeichnet werden muss. Verwendung von paint bzw. repaint() zur Animation ergibt Flackern. Besser: Direktes Zeichnen mittels Zugriff auf Zeichenbrett g durch getGraphics() Scheibenbewegung: Scheibe löschen durch Überschreiben Neuzeichnen nur an neuer Position. System sorgt für korrekte Anzeige auf dem Bildschirm. Manchmal leicht asynchron P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 33 Quellcode hanoi import java.applet.*; import java.awt.*; import javax.swing.*; class int int int OneTower { N; tos; t[]; public OneTower (int N) { this.N = N; tos = 0; t = new int [N]; } P raktische Inf ormatik 2, SS 2005, F olien Java;3, (4. M ai2005) Seite 34 public void push (int i) { t[tos++] = i; } public int pop () { return t[--tos]; } // zeichnet einen Turm public void draw (Graphics g,int Y, int X, int width, int height) { drawItem (g, Y+1, X-1, N*2+1, Color.blue, width, height); for (int i = 0; i < tos; i++) { int j = 2*t[i]-1; if (j > 0) drawItem (g, Y-i, X+N-((j+1)/2), j, Color.green, width, height); } } public void drawItem (Graphics g, int y, int x, int itemSize, Color c, int width, int height) { int deltax = width / (6*N+10); int deltay = height / (N+2); g.setColor (c); g.fillRoundRect (x*deltax, y*deltay,itemSize*deltax, deltay, 10,10); } } public class TowerOfHanoi extends JApplet Thread animator; int N; OneTower [] towers; public void init () { N = 64; // N = 64; towers = new OneTower [3]; this.setBackground(Color.white); //this.setDoubleBuffered(true); for (int i = 0;i < 3; i++) { towers [i] = new OneTower (N); for (int i = 0; i < N; i++) { towers[0].push (N-i); } animator = new Thread() { public void run() { Tow(0, 1, 2, N - 1, N - 1); } }; } public void start() { // System.out.println("Applet gestartet."); animator.start(); } void Tow (int from, int help, int to, int n, int nTowers) { if (n == 0) try { animator.sleep(20); // animator.sleep(1); Graphics g = getGraphics(); int j1 = 2*towers[from].t[towers[from].tos-1]-1; towers[from].drawItem (g,N-towers[from].tos+1, 3+(N*2+3)*from+N-((j1+1)/2), j1/*2*towers[from].t[towers[from].tos]-1*/, Color.white, this.getSize().width, this.getSize().height) towers[to].push (towers[from].pop()); int j2 = 2*towers[to].t[towers[to].tos-1]-1; towers[to].drawItem (g, N-towers[to].tos+1, 3+(N*2+3)*to+N-((j2+1)/2), j2/*2*towers[from].t[towers[to].tos]-1*/, Color.green, this.getSize().width, this.getSize().height) } catch (InterruptedException e) { return; } else { Tow (from, to, help, n-1, nTowers); Tow (from, 0, to, 0, 0); Tow (help, from, to, n-1, nTowers); } } public void run () { Tow (0,1,2,N-1,N-1); } public synchronized void paint (Graphics g) { g.setColor(Color.white); g.clearRect(0,0,this.getSize().width, this.getSize().height); for (int i = 0; i < 3; i++) { towers[i]. draw(g,N,3+(N*2+3)*i, this.getSize().width, this.getS } } }