public void

Werbung
Universität Stuttgart
Institut für Automatisierungs- und Softwaretechnik
Prof. Dr.-Ing. Dr. h. c. P. Göhner
Einführung in Java, Teil 5
Angepasst auf JApplet von Daniel Huson
Vorlesung Informatik I, 1.12.2005
© 2000, IAS
1
Überblick
Teil 5:
‹ JApplet-Grundlagen
© 2000, IAS
2
JApplet vs Applet und Swing vs AWT
• In alte Versionen von Java wurde die AWT (Abstract Window
Toolkit) benutzt, um GUIs zu implementieren.
• Applets wurden durch Erweiterung der alten
java.applet.Applet Klasse geschrieben.
• Heute benutzt man nach Möglichkeit nur noch die Swing
Bibiliothek, um GUIs zu implementieren. Das Package
javax.swing ist eine Erweiterung von java.awt.
• Für die meisten Klassen in AWT gibt es eine Ersatzklasse in
Swing, und die Klassennamen unterscheiden sich in der Regel
durch ein J: z.B. Label (in AWT) und JLabel (Swing)
• Applets werden heute durch Erweiterung der Klasse
javax.swing.JApplet geschrieben und bauen auf der Swing
Bibliothek auf
© 2000, IAS
3
Applet-Grundlagen
Applet contra Applikation
‹ Applikation
• eigenständiges Programm
• keine Beschränkungen
‹ Applet
• Einbettung in HTML-Seite, Ausführung im Browser
• kein Zugriff auf Client-Dateisystem
• keine Kommunikation mit anderen
Netzwerk-Servern
• keine Ausführung anderer Programme
auf dem Client-System
“Sandbox”
‹ Applikation und Applet sind nicht unvereinbar - ein JavaProgramm kann gleichzeitig Applikation und Applet sein
© 2000, IAS
4
Applets im Browser starten
Applets laufen in Webbrowser
• Nehmen wir an, Sie haben in der Datei FirstApplet.java
ein JApplet programmiert und die kompilierte Datei heisst
FirstApplet.class
• Dieses Applet wird gestartet, wenn Sie in einem
Webbrowser eine HTML Seite laden, die sich im selben
Verzeichnis befindet und folgende Zeilen enthält:
<applet code=FirstApplet width=400 height=300>
</applet>
• Das Applet wird gestartet und mit der angegeben Größe
(400x300) angezeigt.
© 2000, IAS
5
Applet-Grundlagen
Applet-Erstellung
‹ Applets sind immer eine Subklasse von javax.swing.JApplet
‹ die JApplet Superklasse ist Teil der Swing-Hierarchie, d.h.
Applets können auf graphische Oberflächenelemente und
Ereignisbehandlung zurückgreifen
public class MeinApplet extends javax.swing.JApplet
{
...
}
‹ Applets benötigen keine main()-Methode
‹ die Applet-Klasse muss public deklariert werden, alle anderen
Sub- und Hilfsklassen können beliebige Zugriffsrechte
vereinbaren
© 2000, IAS
6
Applet-Grundlagen
Applet-Methoden (1)
‹ der Lebenszyklus eines Applets besteht aus verschiedenen
Aktivitäten, die jeweils durch eine eigene Methode
repräsentiert sind: Initialisieren, Starten, Stoppen,
Zerstören und Anzeigen
Initialisieren
‹ Vorgang, bei dem das Applet geladen wird
‹ definiert grundlegendes Aussehen/Verhalten (z.B. Lesen
von Parametern, Erstellen von Hilfsobjekten, Laden von
Bildern)
‹ init()-Methode:
public void init() {
...
// Initialisierungaktivitaeten
}
© 2000, IAS
7
Applet-Grundlagen
Applet-Methoden (2)
Starten
‹ erfolgt nach der Initialisierung
‹ jedes Applet wird nur einmal initialisiert, kann jedoch
mehrfach gestartet werden
‹ start()-Methode:
public void start() {
...
}
Stoppen
‹ Vorgang, wenn Benutzer Seite verlässt oder Applet manuell
gestoppt wird
‹ stop()-Methode:
public void stop() {
...
}
© 2000, IAS
8
Applet-Grundlagen
Applet-Methoden (3)
Zerstören
‹ Aufräumen (z.B. Resourcen freigeben), wenn Applet oder
Browser beendet wird
‹ destroy()-Methode
public void destroy() {
...
}
Zeichnen
‹ bestimmt, was und wie auf den Bildschirm gezeichnet wird
‹ wird im Applet-Lebenszyklus sehr häufig aufgerufen
‹ paint()-Methode
public void paint(Graphics g) {
...
}
‹ benötigt Argument: Objekt der Klasse java.awt.Graphics
© 2000, IAS
9
Applet-Grundlagen
Graphiken (1)
‹ Graphikoperationen sind in Java meistens Methoden der
java.awt.Graphics-Klasse
‹ jedes Applet verfügt über ein Koodinatensystem
‹ die Koordinaten werden in Pixel (Integerwerte) angegeben
Ursprung
(0,0)
X
(10,10)
(30,20)
Y
© 2000, IAS
10
Applet-Grundlagen
Graphiken (2)
‹ Linien werden mit drawLine() gezeichnet:
g.drawLine( x1, y1, x2, y2 );
Anfangspunkt
Endpunkt
‹ Rechtecke werden mit drawRect() oder fillRect()
gezeichnet:
g.drawRect( x1, y1, dx, dy );
Ausdehnung
‹ Polygone werden mit drawPolygon() oder fillPolygon()
gezeichnet:
int x[] = { x1, x2, x3, x4 };
int y[] = { y1, y2, y3, y4 };
int punkte = x.length;
g.drawPolygon( x, y, punkte );
© 2000, IAS
11
Applet-Grundlagen
Graphiken (3)
‹ Polygone werden automatisch geschlossen. Für offene
Polygone steht die Methode drawPolyline() zur Verfügung:
int x[] = { x1, x2, x3, x4 };
int y[] = { y1, y2, y3, y4 };
int punkte = x.length;
g.drawPolyline( x, y, punkte );
‹ Ovale werden mit drawOval() oder fillOval() gezeichnet:
g.drawOval( x1, y1, dx, dy );
‹ Bögen werden mit drawArc() oder fillArc() gezeichnet:
g.drawArc( x1, y1, dx, dy, start, grad );
umgebendes Rechteck
Startwinkel
© 2000, IAS
überstrichener Winkel
+
12
Applet-Grundlagen
Graphiken (4)
‹ mit copyArea() wird ein rechteckiger Bereich in eine
andere Position (transx, transy) kopiert
g.copyArea( x1, y1, dx, dy, transx, transy );
‹ mit clearRect() wird ein Bereich auf die aktuelle
Hintergrundfarbe gesetzt
g.clearRect( x1, y1, dx, dy );
‹ mit Hilfe der size()-Methode wird das gesamte Applet
gelöscht
g.clearRect( 0, 0, size().width, size().height );
© 2000, IAS
13
Applet-Grundlagen
Graphiken (5)
Beispiel:
// Graphik-Beispiel
import java.awt.*;
public class Grafik extends javax.swing.JApplet {
public void paint( Graphics g ) {
g.drawLine(80, 20, 80, 140);
g.drawLine(20, 80, 140, 80);
g.drawRect(40, 70, 20, 20);
g.drawRect(100, 70, 20, 20);
g.fillOval(70, 70, 20, 20);
g.drawOval(50, 50, 60, 60);
g.drawArc(20, 20, 120, 120, 90, 90);
g.drawArc(20, 20, 120, 120, 0, -90);
}
}
© 2000, IAS
14
Applet-Grundlagen
Graphiken (6)
Beispiel (Forts.):
© 2000, IAS
15
Applet-Grundlagen
Text & Schrift (1)
‹ im Zusammenhang mit Text und Schriften sind zwei
Klassen wichtig:
• java.awt.Font bestimmt Schriftart, Stil, Punktgröße
• java.awt.FontMetrics zusätzliche Informationen über die
aktuelle Schriftart
‹ neue Schriften werden vor der Benutzung instanziiert:
Font f = new Font(“TimesRoman”, Font.BOLD, 24);
Schriftart
Fontstil
Schriftgröße
“Courier”
Font.PLAIN (in Punkten)
“Helvetica” Font.ITALIC
‹ prinzipiell können alle auf einem System installierten
Schriften verwendet werden, Standardschriften sind jedoch
vorzuziehen
© 2000, IAS
16
Applet-Grundlagen
Text & Schrift (2)
‹ mit drawString() bzw. drawChar() werden einzelne
Strings und Zeichen ausgegeben
Beispiel:
public void paint( Graphics g ) {
Font f = new Font(“TimesRoman”, Font.BOLD, 32);
g.setFont(f);
g.drawString(“Java ist schön”, 40, 40);
}
‹ die Klasse FontMetrics liefert spezifische Informationen
über die aktuelle Schriftart
•
•
•
•
stringWidth(String): volle Breite des Strings in Pixel
charWidth(): Breite eines bestimmten Zeichens
getLeading(): “Freiraum” zwischen zwei Zeilen
getHeight(): Gesamthöhe der Schriftart
© 2000, IAS
17
Applet-Grundlagen
Text & Schrift (3)
Beispiel
// Zentrieren eines Strings im Applet
import java.awt.*;
public class Zentriert extends javax.swing.JApplet {
public void paint( Graphics g ) {
Font f = new Font(“TimesRoman”, Font.PLAIN, 32);
FontMetrics fm = getFontMetrics(f);
g.setFont(f);
String s = “Java im Zentrum!”;
int xstart = (getSize().width - fm.stringWidth(s))/2;
int ystart = getSize().height / 2;
g.drawString( s, xstart, ystart );
}
}
© 2000, IAS
18
Applet-Grundlagen
Farben (1)
Java Farbmodell
‹ die Klasse java.awt.Color bietet Unterstützung bei der
Arbeit mit Farben
‹ das Farbmodell in Java verwendet 24-Bit-Farben, wobei jede
Farbe eine Kombination aus Rot-, Grün- und Blauwerten ist, z.B.
• Weiß:
• Blau:
(255, 255, 255)
(0, 0, 255)
‹ das Farbmodell wird auf die Systemmöglichkeiten abgebildet
‹ zur Arbeitserleichterung ist ein Set von Standardfarben
vordefiniert:
• Color.white
• Color.black
• ...
‹ eigene Farben können jederzeit definiert werden:
Color meineFarbe = new Color( 7, 242, 128 );
© 2000, IAS
19
Applet-Grundlagen
Farben (2)
Farben verwenden
‹ eine neue Farbe wird vor der Benutzung für
Text/Zeichnungen eingerichtet
g.setColor( Color.green );
‹ die Hinter- und Vordergrundfarbe für ein Applet kann
eingestellt werden
setBackground( Color.green );
setForeground( Color.white );
‹ mit entsprechenden get-Methoden kann die aktuelle Farbe
sowie die Hinter- und Vordergrundfarbe abgefragt werden
getBackground();
getForeground();
© 2000, IAS
20
Applet-Grundlagen
Bilder (1)
‹ mit den Methoden der Klasse java.awt.Image können
Bilder geladen und in einem Applet angezeigt werden
Bilder laden
‹ mit getImage() wird ein Bild als Image-Objekt geladen
Image img = getImage( new
URL(“http://www.serv.de/files/imi01.gif”));
‹ um absolute Pfadangaben zu vermeiden kann
getDocumentBase() oder getCodeBase() verwendet
werden
Image img = getImage( getDocumentBase(),
“files/imi01.gif”);
‹ Java unterstützt z. Zt. nur Bilder im GIF oder JPEG Format
© 2000, IAS
21
Applet-Grundlagen
Bilder (2)
Bilder zeichnen
‹ die Ausgabe des Bildes im Applet erfolgt mit der
drawImage()-Methode
g.drawImage( img, 20, 20, this );
Bildpunkt links oben
‹ durch zusätzliche Angabe einer gewünschten Breite und
Höhe nach der Angabe des linken oberen Bildpunktes kann
eine Skalierung/Verzerrung erreicht werden
‹ die Orginaldimension des Bildes wird mit getWidth() und
getHeight() ermittelt
int bildBreite = img.getWidth(this);
int bildHoehe = img.getHeight(this);
© 2000, IAS
22
Applet-Grundlagen
Bilder (3)
Beispiel:
// Text und Bilder
import java.awt.*;
public class IASJava extends javax.swing.JApplet {
Image logo;
public void init() {
logo = getImage( getCodeBase(), "ias.gif");
setBackground( Color.white );
}
}
public void paint( Graphics g ) {
g.setColor( Color.red );
Font f = new Font( "TimesRoman", Font.BOLD, 36 );
g.setFont(f);
g.drawString( "Java am IAS", 20, 40 );
int iwidth = logo.getWidth( this );
int iheight = logo.getHeight( this );
g.drawImage( logo, 40, 60, iwidth, iheight, this );
}
© 2000, IAS
23
Applet-Grundlagen
Bilder (4)
Beispiel (Forts.)
© 2000, IAS
24
Applet-Grundlagen
Ereignisse & Interaktivität (1)
‹ Ereignisse sind eine wichtige Kommunikationsform in der
Computerwelt
‹ für Java-Programme sind Ereignisse interessant, die vom
Benutzer oder System verursacht werden:
•
•
•
•
•
Mausklicks
Mausbewegungen
Tastaturanschläge
Ereignisse der Benutzeroberfläche
Fensterereignisse
‹ Java unterstützt z.Zt. in der AWT zwei verschiedene
Ereignismodelle:
• JDK 1.02
• seit JDK 1.1 “Event-Listener-Konzept”
© 2000, IAS
25
Applet-Grundlagen
Ereignisse & Interaktivität (2)
ab JDK 1.1
Applet
init()
Fensterereignis
... initialize applet
... register mouse
listener
... initialize button
... register buttonaction listener
Mausereignis
Registriert
mouse listener
Tastenereignis
Registriert
Schaltflächenereignis
actions listener
© 2000, IAS
26
Applet-Grundlagen
JDK 1.1 - Ereignismodell (1)
Das Verwenden von Ereignissen in einem Applet erfolgt
nach festgelegten Spielregeln:
‹ Schritt 1: entscheiden, welche Ereignisse für das Applet
wichtig
sind und zugehörige Listener-Typen herausfinden
‹ Schritt 2: Code für diese Listener und die
Ereignisverarbeitung erstellen
‹ Schritt 3: Listener mit Applet registrieren
© 2000, IAS
27
Applet-Grundlagen
JDK 1.1 - Ereignismodell (2)
Schritt 1: Ereignisse und Listener-Schnittstellen
‹ die API-Dokumentation gibt Auskunft über Ereignisse und
ihre zugehörigen Listener-Schnittstellen
Listener-Interface
Ereignis
Definition (alle public void)
MouseListener
mouseDown
mouseUp
mouseEnter
mouseExit
mouseClicks
mousePressed (MouseEvent e)
mouseReleased (MouseEvent e)
mouseEntered (MouseEvent e)
mouseExited (MouseEvent e)
mouseClicked (MouseEvent e)
MouseMotionListener
mouseMove
mouseDrag
mouseMoved (MouseEvent e)
mouseDragged (MouseEvent e)
KeyListener
keyUp
keyDown
keyTyped
keyReleased (KeyEvent e)
keyPressed (KeyEvent e)
keyTyped (KeyEvent e)
© 2000, IAS
28
Applet-Grundlagen
JDK 1.1 - Ereignismodell (3)
Schritt 2: Listener-Schnittstellen implementieren
‹ der Ereignis-Listener ist eine Klasse, die die ListenerSchnittstelle implementiert
‹ Schnittstellen-Implementierung kann auf zwei Arten erfolgen:
(A) separate Listener-Klasse: elegante Lösung für größere
Programme
(B) Listener wird direkt in der Applet-Klasse implementiert:
schnelle Lösung für kleinere Applets
zu (A):
‹ separate Listener-Klasse muss Schnittstelle vollständig
implementieren
‹ für viele Listener stehen in java.awt.event sog. Adapterklassen
mit Default-Implementierungen zur Verfügung, z.B.:
MouseAdapter
MouseMotionAdapter
KeyAdapter
für
für
für
© 2000, IAS
MouseListener
MouseMotionListener
KeyListener
29
Applet-Grundlagen
JDK 1.1 - Ereignismodell (4)
Schritt 2 (Forts.): Listener-Schnittstellen implementieren
zu (A):
‹ von den Listener-Adapterklassen werden eigene ListenerKlassen abgeleitet, welche die relevanten
Ereignisbehandlungs-Methoden (z.B. mousePressed())
überschreiben
import java.awt.event.*;
class MeinMausListener extends MouseAdapter {
public void mousePressed( MouseEvent e ) {
...
}
}
© 2000, IAS
30
Applet-Grundlagen
JDK 1.1 - Ereignismodell (5)
Schritt 2 (Forts.): Listener-Schnittstellen implementieren
zu (B):
‹ das Applet ist sein eigener Event-Listener:
import java.awt.event.*;
public class MeinApplet extends javax.swing.JApplet
implements MouseListener, KeyListener {
// Ereignisbehandlung
public void mousePressed( MouseEvent e ) {
...
}
// Leer-Implementierungen der Schnittstelle
public void mouseReleased( MouseEvent e ) {}
...
}
‹ Wichtig: gesamte Schnittstelle muss implementiert
werden
© 2000, IAS
31
Applet-Grundlagen
JDK 1.1 - Ereignismodell (6)
Schritt 3: Listener registrieren
‹ Verbindung zwischen Listener und Applet mit
Registrierungsmethoden herstellen:
addMouseListener();
addMouseMotionListener();
addKeyListener();
‹ für separate Listener-Klasse
m1 = new MeinMausListener();
addMouseListener( m1 );
‹ Applet ist Listener
addMouseListener( this );
© 2000, IAS
32
Applet-Grundlagen
Mausereignisse (1)
Beispiel:
‹ folgendes Applet zeichnet gerade Linien auf den Bildschirm
durch Ziehen der Maus vom Anfangs- zum Endpunkt. Es
können maximal 10 Linien gezeichnet werden.
// Linien.java
import java.awt.*;
import java.awt.event.*;
public class Linien extends javax.swing.JApplet
implements MouseListener, MouseMotionListener {
final int MAXLINES = 10;
Point starts[] = new Point[MAXLINES]; // Startpunkte
Point ends[] = new Point[MAXLINES];
// Endpunkte
Point anchor;
// Start aktuelle Linie
Point currentpoint;
// Ende aktuelle Linie
int currline = 0;
// Anzahl Linien
© 2000, IAS
33
Applet-Grundlagen
Mausereignisse (2)
Beispiel (Forts.)
public void init() {
setBackground( Color.white );
// Event-Listener registrieren
addMouseListener( this );
addMouseMotionListener( this );
}
// Leerimplementierungen der Schnittstellen
public void mouseMoved( MouseEvent e) {}
public void mouseClicked( MouseEvent e) {}
public void mouseEntered( MouseEvent e) {}
public void mouseExited( MouseEvent e) {}
public void mousePressed( MouseEvent e ) {
if( currline < MAXLINES )
anchor = new Point( e.getX(), e.getY() );
else
System.out.println( "Too many lines ..." );
}
© 2000, IAS
34
Applet-Grundlagen
Mausereignisse (3)
Beispiel (Forts.)
public void mouseReleased( MouseEvent e ) {
if( currline < MAXLINES )
addLine( e.getX(), e.getY() );
}
public void mouseDragged( MouseEvent e ) {
if( currline < MAXLINES ) {
currentpoint = new Point( e.getX(), e.getY() );
repaint();
}
}
void addLine( int x, int y ) {
starts[currline] = anchor;
ends[currline] = new Point(x, y);
currline++;
currentpoint = null;
anchor = null;
repaint();
}
© 2000, IAS
35
Applet-Grundlagen
Mausereignisse (4)
Beispiel (Forts.)
public void paint( Graphics g ) {
super.paint(g);
for ( int i = 0; i < currline; i++ ) {
g.drawLine( starts[i].x, starts[i].y,
ends[i].x, ends[i].y );
}
g.setColor( Color.blue );
if( currentpoint != null )
g.drawLine( anchor.x, anchor.y,
currentpoint.x, currentpoint.y);
}
}
// Linien-Applet Ende
© 2000, IAS
36
Applet-Grundlagen
Mausereignisse (5)
Beispiel (Forts.)
© 2000, IAS
37
Applet-Grundlagen
Zusammenfassung
‹ Unterschied Applet – Applikation
‹ AWT vs Swing
‹ Applet-Aktivitäten: Initialisieren, Starten, Stoppen,
Zerstören, Anzeigen
‹ einfache Graphikoperationen: Linien, Rechtecke, ...
‹ Umgang mit Schriften
‹ Applet-Farben
‹ Bilder in Applets
‹ Ereignisbehandlung in Java
© 2000, IAS
38
Herunterladen