Applets und Applikationen

Werbung
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
}
}
}
Herunterladen