Applets und Servlets Applikationen / Applets java.awt.Applet Hallo

Werbung
Prog. 1
Prog. 1
Applets und Servlets
• Java eignet sich sehr gut zur Entwicklung dynamischer Web-Seiten
Applikationen / Applets
• Wichtige Unterschiede zwischen Java-Applikationen und Java-Applets
• Web-Seiten können Java-Programme enthalten
Java-Applikation
– Werden mitsamt der HTML-Seite (über das Internet) geladen
– Werden auf dem Rechner des Benutzers ausgeführt
Hauptklasse kann von
beliebiger Klasse abgeleitet
werden
Wird immer von der Klasse
java.awt.Applet abgeleitet
Starten
Java-Interpreter ruft die
Klassenmethode main auf
Web-Browser instanziert die AppletKlasse und ruft die Methoden init
und start auf
Sicherheit
Keine Beschränkungen beim
Zugriff auf Dateien und dem
Starten externer Programme
Kein Zugriff auf Dateien des lokalen
Rechners. Keine Möglichkeit externe
Programme zu starten. (Ausnahme
signierte Applets)
Ein-/Ausgabe
Ein-/Ausgaben sowohl rein
textorientiert als auch über GUI
Immer grafik- und ereignisorientiert
Hauptprogramm
• Als Applets werden Java Programme bezeichnet, die
– in eine HTML-Seite eingebettet sind (keine eigenständigen Programme)
– innerhalb eines Web-Browsers arbeiten
• Benutzer kommuniziert lokal mit dem Applet
– Verringerter Netzwerkverkehr
• Gegenstück zu Applets sind Servlets (Java-Klassen), die
– auf dem Server(-Rechner) laufen, von dem die Web-Seite geladen wurde
– mit der Web-Seite auf dem Benutzerrechner kommunizieren
• Beispiel:
Servlet holt Inhalte aus Datenbank und liefert sie an eine Web-Seite,
wo sie dann von einem Applet dargestellt werden
Java-Applet
• Applets bieten zusätzliche Möglichkeiten im Bereich Benutzerschnittstellen-Design
– Ausgabe von Sound ist z.B. standardmäßig auf Applets beschränkt
19.01.2009
Prog. 1
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
1
Prog. 1
java.awt.Applet
• Alle Applets sind Subklasse der Klasse java.awt.Applet
• Die Klasse Applet
– enthält Funktionalität, um ein Objekt der Klasse Applet
als Hauptmodul eines eigenständigen Programms
laufen zu lassen
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
2
Hallo Applet (in Eclipse)
• Ein einfaches Applet
import java.awt.*;
import java.applet.*;
Object
– ist konkrete Grafikklasse (keine abstrakte Basisklasse)
– erbt von seinen Vaterklassen Component, Container
und Panel einen großen Teil der Fähigkeiten, die
zur Ausführung benötigt werden
19.01.2009
public class HalloApplet extends Applet {
public void paint(Graphics g) {
g.drawString("Hallo Applet", 50, 50);
}
}
Component
• In Eclipse starten mittels
Container
• Ein Applet ist ein rechteckiges Bildschirmelement, das
– eine Größe und Position hat
Panel
– Ereignisse empfangen kann
– grafische Ausgaben machen kann
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Applet
3
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
4
Prog. 1
Prog. 1
Ausführen (Einbinden) von Applets
• Kompilierte Applets können durch Einbinden in ein HTML-Dokument
ausgeführt werden
Hallo Applet (im Browser)
1. Ein einfaches Applet
HalloApplet.java
– Einleiten durch <applet>
• Text, der angezeigt wird, wenn das Applet nicht aufgerufen werden kann (wird von
applet-fähigem Browser ignoriert)
– Beenden mit </applet>
2. Übersetzen (javac HelloApplet.java)
Beispiel
3. Einbinden in HTML-Datei
<applet code="HelloApplet.class" width=200 height=100>
Hier steht das Applet HelloApplet
</applet>
Appletviewer
appletviewer AppletTest.html
<html>
<body>
<applet code="HalloApplet.class" width=200 height=100>
Hier steht das Applet HalloApplet
</applet>
</body>
</html>
• Das Applet belegt die Größe width x height auf dem Bildschirm
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Web-Browser
AppletTest.html
• Applet-Tag wird wie normaler Text in Browser-Ausgabe eingebunden
Prog. 1
4. Ausführen
import java.awt.*;
import java.applet.*;
@SuppressWarnings("serial")//or add serial
public class HalloApplet extends Applet {
public void paint(Graphics g) {
setBackground(Color.blue);
g.drawString("Hallo Applet", 50, 50);
}
}
• Das Einbinden in HTML-Dokumente erfolgt mit dem Tag <applet>
19.01.2009
Java 1.5 unterstützt
Annotations (Anmerkungen)
5
19.01.2009
Prog. 1
Die Parameter des Applet-Tags
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Parameter von applet (Übersicht)
Parameter
Bedeutung
– Klassenname sollte inklusive der Extension .class angegeben werden
code
Name der Byte-Code-Datei des Applets
– Der Name ist case-sensitive
height
Höhe der Applet-Fläche in Pixel
– Klassendatei muß sich im aktuellen bzw. angegebenen Verzeichnis befinden
(oder in einem der in CLASSPATH angegebenen Verzeichnisse)
width
Breite der Applet-Fläche in Pixel
codebase
Pfad zu dem Verzeichnis, in dem sich das Applet befindet, das mit
code referenziert wurde
alt
Alternativer Text für Browser, die zwar das Applet-Tag verstehen,
aber Java nicht unterstützen
hspace
Abstand zu anderen Elementen links und rechts neben dem Applet
vspace
Abstand zu anderen Elementen über und unter dem Applet
align
Anordnung des Applets in einer Textzeile. Mögliche Werte:
• Der Parameter code gibt den Namen der Applet-Klasse an
• Zusätzlich zu code müssen die Parameter width und height
angegeben werden
– Bestimmen die Breite und Höhe des für das Applet reservierten
Bildschirmbereichs
– Innerhalb des Applets steht ein Rechteck der Größe width x height als
Ausgabefläche zur Verfügung
6
left, right, middle, top, bottom, baseline, ..
• Mit Hilfe zusätzlicher, optionaler Parameter kann
name
– die Darstellung des Applets und des umgebenden Textes beeinflusst
werden
Eindeutiger Appletname. Wird zur Unterscheidung mehrerer miteinander kommunizierender Applets einer Web-Seite verwendet.
object
Name eines serialisierten Applets
– das Applet konfiguriert werden
archive
JAR-Archiv aus dem die Klassendateien und sonstige Ressourcen
des Applets geladen werden sollen
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
7
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
8
Prog. 1
•
Prog. 1
Initialisierung eines Applets
Nach dem Laden wird ein Applet
Starten und stoppen eines Applets
2. Starten eines Applets (public void start())
1. vom Browser (Appletviewer) zunächst instanziert und dann initialisiert
•
Nach der Initialisierung wird die Methode public void start()
aufgerufen, um die Ausführung des Applets zu starten
•
Ein Applet kann mehrfach gestartet werden (im Gegensatz zur
Initialisierung)
2. anschließend wird es gestartet und erhält GUI-Events
3. Irgendwann wird es gestoppt
4. Schließlich wird es vom Browser nicht mehr benötigt und zerstört
•
Lädt ein Browser eine andere Web-Seite wird das Applet nicht komplett
zerstört, sondern nur gestoppt
•
Beim erneuten Aufruf der Seite wird das gestoppte Applet durch
erneuten Aufruf von start wieder gestartet
1. Instanzieren und initialisieren eines Applets
Instanzierung (public Applet())
•
•
Der Browser erzeugt ein Objekt der von Applet abgeleiteten Klasse, indem er
den parameterlosen Default-Konstruktor public Applet() aufruft
(üblicherweise nicht überlagert, sondern von Applet geerbt)
Initialisierung (public void init())
Nach der Instanzierung ruft der Browser public void init() auf
•
•
In init können Initialisierungen vorgenommen werden
•
init wird während der Lebensdauer eines Applets genau einmal aufgerufen
(nachdem die Klassendatei geladen und das Applet instanziert wurde)
•
Wird init nicht überschrieben, hat die Methode keine Wirkung
•
19.01.2009
Prog. 1
3. Stoppen eines Applets (public void stop())
9
4. Zerstören eines Applets (public void destroy())
•
Wird ein Applet ganz sicher nicht mehr benötigt (z.B. beim Beenden des
Browsers), ruft der Browser public void destroy() auf
•
Die Methode destroy kann überlagert werden, um Aufräumarbeiten zu
erledigen
Zerstörung eines Threads, der bei der Applet-Initialisierung angelegt wurde
import java.applet.*;
import java.awt.*;
@SuppressWarnings("serial")//or add serial
public class HelloWorld extends Applet{
StringBuffer buffer;
public void init() {
buffer = new StringBuffer();
addItem("Initializing...");
}
public void start() {
addItem("Starting...");
}
19.01.2009
start und stop können während der Lebensdauer eines Applets beliebig
oft aufgerufen werden
19.01.2009
Prog. 1
Zerstören eines Applets
Abschieds-Melodie, -Gruß, -Film, ...
•
•
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
•
Durch Aufruf der Methode public void stop() zeigt der Browser dem
Applet an, dass gestoppt werden soll
•
Membervariablen initialisieren, Images oder Fonts laden, Parameter auswerten
•
•
Geschieht immer dann, wenn eine andere Web-Seite geladen wird
Es dürfen keine endgültigen Aufräumarbeiten durchgeführt oder bei einem
Neustart wieder benötigte Resscourcen entfernt werden
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
10
Die Methode paint()
• Die Methode public void paint(Graphics g) der Klasse
java.awt.Container dient zur Ausgabe von Grafikelementen in
einem Container
• Die Appletfläche ist standardmäßig der Container für alle AusgabeElemente von paint()
• Die Methode paint()
– wird vom Browser (Appletviewer) immer dann ausgeführt, wenn die
Appletfläche ganz oder teilweise neu gezeichnet wird
public void stop() {
addItem("Stopping...");
}
public void destroy() {
addItem("Preparing for unloading ...");
}
void addItem(String s) {
System.out.println(s);
buffer.append(s);
repaint();
}
public void paint(Graphics g) {
g.drawString(buffer.toString(), 5, 15);
}
– wird aufgerufen, wenn
• das Neuzeichnen der Appletfläche mittels repaint() erzwungen wird
• Die Appletfläche durch andere Fenster überdeckt war und wieder sichtbar wird
– muss im selbst erstellten Applet überschrieben werden
– erhält alle Anweisungen, die beim Neuzeichnen der Appletfläche ausgeführt
werden sollen
– erfordert als Aufrufparameter ein Objekt der abstrakten Klasse Graphics
welche Methoden zur Ausgabe von Grafikelementen auf der Appletfläche
enthält
}
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
11
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
12
Prog. 1
Prog. 1
Zeichenfläche
• Text- und Grafik-Ausgaben erfolgen in Applets mittels
paint() auf einer pixelorientierten grafischen Oberfläche
x
• Nullpunkt des Koordinatensystems ist
die linke obere Ecke der Zeichenfläche
– ganzzahlige Koordinaten
• Auf Appletflächen werden Texte als Grafikelemente dargestellt
• void drawString(String s, int x, int y)
(0,0)
zeichnet den String s an die Postion (x,y) der Zeichenfläche
(20,10)
• Auflösung: ein Pixel
Textausgabe
– Anfangskoordinaten des ersten Zeichens auf der Grundlinie des Textes
40
20
y
Oberkante
• Größe der Zeichenfläche
Grundlinie
Unterkante
– ist mit den Attributen width, height im <applet>-Tag festgelegt
– ist abfragbar (seit JDK 1.2) mit den folgenden Methoden aus
java.awt.Component
• Werden keine weiteren Eigenschaften für die Schrift festgelegt, wird eine
Standardschrift verwendet (abhängig vom Java-System)
• public int getWidth()
• public int getHeight()
• Mit Hilfe der Klasse java.awt.Font können die Schriften für die
Grafikausgabe verändert werden
– In älteren Java-Versionen kann die Größe der Appletfläche mit
getSize()und size() („deprecated“ ab JDK 1.1) abgefragt werden
19.01.2009
Prog. 1
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
13
19.01.2009
Prog. 1
Schriftattribute
– Font-Attribute können dann mit FontMetrics-Methoden abgefragt werden
• Wichtige Methoden von FontMetrics
– int getAscent()
• Abstand von der Grundlinie bis zur Oberkante
– int stringWidth(String s)
Ascent
Textausgabe Beispiel
public void paint(Graphics g) {
String s = "Hallo gelbe Welt";
int xMax = getWidth();
int yMax = getHeight();
int xPos, yPos, sWidth, sHeight, asc, des, dMG;
Font f = new Font("SansSerif", Font.BOLD, 30);
FontMetrics fm = getFontMetrics(f);
sWidth = fm.stringWidth(s);
asc = fm.getAscent();
des = fm.getDescent();
sHeight = asc + des;
dMG = (asc-des > 0) ? (asc-des)/2 : 0;
xPos = (xMax-sWidth > 0) ? (xMax-sWidth)/2 : 0;
yPos = (yMax-sHeight > 0) ? yMax/2+dMG : yMax-des;
g.setFont(f);
g.drawString(s, xPos, yPos);
}
Font f = new Font(“SansSerif“, Font.BOLD+FONT.ITALIC, 30);
FontMetrics fm = getFontMetrics(f);
Descent
14
@SuppressWarnings("serial") //or add serial
public class TextApplet extends Applet {
public void init() {
Color gelb = new Color(255, 255, 0);
setBackground(gelb);
}
• Objekten der Klasse java.awt.FontMetrics können zur Laufzeit
Informationen über die Metrik eines Fonts zugewiesen werden
• Abstand von der Grundlinien bis zur Unterkante
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
import java.applet.*;
import java.awt.*;
• Pixelgenauen Positionierung auf der grafischen Oberfläche erfordert
Informationen über Schrifthöhe, Laufweite, Unterlängen, ...
– int getDescent()
Abcdefg
Abcdefg
• Pixel-Länge des Strings s
}
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
15
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
16
Prog. 1
•
•
Prog. 1
Farben
Mit Hilfe der Klasse
java.awt.Color können Farben
im RGB(A)-Farbmodell dargestellt
werden
Es existieren statische Konstanten
für gängige Farben:
@SuppressWarnings("serial") //or add serial
– void drawLine(int x1, int y1, int x2, int y2)
Color background, fill;
public void init() {
• Zeichnet eine Linie von P1=(x1,y1) nach P2=(x2,y2)
background = new Color(0,255,255);
– void drawRect(int x, int y, int width, int height)
fill = new Color(0.0f,0.0f,1.0f);
Die mit g.setColor(color)
gesetzte Farbe eines GraphicsObjektes gilt bis zum nächsten Aufruf
von setColor() für alle
Grafikausgaben
• Zeichnet ein Rechteck (Linke obere Ecke:(x,y), Breite:width, Höhe:height)
setBackground(background);
• setBackground(color) setzt die
Hintergrundfarbe der Appletfläche
Prog. 1
• Einige Methoden von Graphics
public class ColorApplet extends Applet {
– ...
19.01.2009
• Neben grafikorientierter Textausgabe erlaubt Graphics die pixelorientierte Darstellung einfacher Liniengrafiken (Linie, Kreis, Rechteck)
import java.awt.*;
– Color.lightGray
•
• Die Klasse java.awt.Graphics ist der Grafik-Kontext für ein
universelles Ausgabegerät
import java.applet.*;
– Color.red
Grafikelemente
}
– void drawOval(int x, int y, int x2, int y2)
public void paint(Graphics g) {
• Zeichnet ein Oval
(x,y): Linke obere Ecke
width, height: Breite, Höhe
g.setColor(fill);
g.fillRect(10,10,50,50);
g.setColor(Color.darkGray);
height
width
– void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
g.fillRect(70,70,50,50);
• Zeichnet ein Polygon
xPoints: x-Koordinaten der Eckpunkte
yPoints: y-Koordinaten der Eckpunkte
nPoints: Anzahl der Polygon-Punkte
}
}
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
(x,y)
17
19.01.2009
Prog. 1
Grafikelemente (Beispiel)
import java.applet.*;
import java.awt.*;
p3
p1
p4
p2
p0
p5
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
18
Parameterübergabe an Applets
• Mit Hilfe des optionalen Tags <param> können innerhalb von <applet>
</applet> Parameter an ein Applet übergeben werden
@SuppressWarnings("serial") //or add serial
public class GrafikApplet extends Applet {
int x[];
int y[];
public void init() {
Color black = new Color(0, 0, 0);
setBackground(black);
x = new int[100];
y = new int[100];
for(int i=0; i<100; ++i) {
x[i] = 2*i;
y[i] = (int) (100*(Math.sin(i*2*Math.PI/99)+1));
}
}
• Jedes param-Tag besitzt die Parameter
– name: Gibt den Namen des zu übergebenden Parameters an
– value: Gibt den Wert des zu übergebenden Parameters an
• Innerhalb des Applets können die Parameter mit Hilfe folgender
Methode der Klasse Applet abgefragt werden
– public String getParameter(String name)
Liefert für jeden angegebenen Parameter den zughörigen Wert als String
public void paint(Graphics g) {
g.setColor(Color.white);
g.drawPolyline(x,y,100);
}
• Numerische Werte müssen konvertiert werden
• Existiert kein Parameter mit namen name wird null zurückgegeben
}
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
19
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
20
Prog. 1
Prog. 1
Beispiel Parameterübergabe
import java.awt.*;
import java.applet.*;
@SuppressWarnings("serial") //or add serial
public class Rechteck extends Applet {
private int xmin, ymin, width, height;
Parameterübergabe mit Eclipse
Default-Verhalten
public void init() {
try {
xmin = Integer.parseInt(getParameter("xminR"));
ymin = Integer.parseInt(getParameter("yminR"));
width = Integer.parseInt(getParameter("widthR"));
height = Integer.parseInt(getParameter("heightR"));
} catch (NumberFormatException e) {
xmin = 0;
ymin = 0;
width = 10;
height = 10;
}
}
public void paint(Graphics g) {
String text = "Rechteck ("+xmin +","+ ymin+ "," + width+","+height+")";
g.drawString(text, 1, 10);
g.drawRect(xmin, ymin, width, height);
}
}
19.01.2009
Prog. 1
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
21
22
Ein Applet, das ein “Mosaic“ eines Bildes zeigt (I)
import
import
import
import
• Einbinden des Rechteck-Applets in ein HTML-Dokument
java.awt.*;
java.applet.*;
java.io.*;
java.util.Scanner;
public class MosaicPicture extends Applet {
int row,column,maxGrey,tileSize,gapSize;
boolean shadow;
int[][] picture;
Web-Browser
public void init() {
String filename = getParameter("filename");
readPicture(filename);
try {
tileSize = Integer.parseInt(getParameter("tileSize"));
gapSize = Integer.parseInt(getParameter("gapSize"));
shadow = Boolean.parseBoolean(getParameter("shadow"))
} catch (NumberFormatException e) {
tileSize = 1;
gapSize = 0;
shadow = false;
}
}
• Aufruf mit
appletviewer
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Prog. 1
Parameterübergabe mit HTML
<html>
<head>
<title>Rechteck</title>
</head>
<body>
<h1>Rechteck</h1>
<applet code="Rechteck.class" width=200 height=100>
<param name="xminR" value=10>
<param name="yminR" value=10>
<param name="widthR" value=50>
<param name="heightR" value=50>
Hier steht das Applet Rechteck.class
</applet>
</body>
</html>
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
23
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
24
Prog. 1
Prog. 1
Ein Applet, das ein “Mosaic“ eines Bildes zeigt (II)
Ein Applet, das ein “Mosaic“ eines Bildes zeigt (III)
public void readPicture(String filename) {
try {
File file = new File(filename);
Scanner sc = new Scanner(file);
// Forget header and comment of input file
sc.nextLine(); // header
sc.nextLine(); // comment
// Read number of columns and rows from input file
column = sc.nextInt();
row = sc.nextInt();
// Read max greyvalue
maxGrey = sc.nextInt();
// allocate picture memory
picture = new int[row][column];
// read in picture data
for (int i = 0; i < row; i++)
for (int j = 0; j < column; j++)
picture[i][j] = sc.nextInt();
} catch (FileNotFoundException e) {
System.out.println(filename+" not found.");
System.exit(-1);
}
}
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
public float getGreyValue(int i, int j, int size) {
int gv = 0, ngv = 0;
for (int ii = 0; ii < size; ii++)
for (int jj = 0; jj < size; jj++) {
if (i+ii < row && j+jj < column) {
gv += picture[i+ii][j+jj];
j
size
ngv += 1;
}
}
return (float) gv / (ngv*maxGrey);
}
i
25
Prog. 1
19.01.2009
Prog. 1
Ein Applet, das ein “Mosaic“ eines Bildes zeigt (IV)
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
26
Ergebnisse
public void paint(Graphics g) {
int x, y = 0;
for (int i = 0; i < row; i += tileSize) {
x = 0;
for (int j = 0; j < column; j += tileSize) {
if (shadow) {
g.setColor(Color.black);
g.drawRect(j + x * gapSize, i + y * gapSize, tileSize,!tileSize);
}
float grey = getGreyValue(i, j, tileSize);
Color color = new Color(grey, grey, grey);
tileSize=8
gapSize=2
tileSize=16
gapSize=2
tileSize=32
gapSize=4
tileSize=64
gapSize=4
g.setColor(color);
g.fillRect(j + x * gapSize, i + y * gapSize, tileSize, tileSize);
x++;
}
y++;
tileSize=1
gapSize=0
}
}
}
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
27
19.01.2009
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
28
Herunterladen