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 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 Java- Programm 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-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-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-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-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
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
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
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 überstrichener Winkel + - 2000, IAS 12
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
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
Graphiken (6) Beispiel (Forts.): 2000, IAS 15
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
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
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
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ß: (255, 255, 255) Blau: (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
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
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
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
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
Bilder (4) Beispiel (Forts.) 2000, IAS 24
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
Ereignisse & Interaktivität (2) ab JDK 1.1 Applet Fensterereignis init()... initialize applet... register mouse listener... initialize button... register buttonaction listener Registriert mouse listener Registriert actions listener Mausereignis Tastenereignis Schaltflächenereignis 2000, IAS 26
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
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 mousepressed (MouseEvent e) mouseup mousereleased (MouseEvent e) mouseenter mouseentered (MouseEvent e) mouseexit mouseexited (MouseEvent e) mouseclicks mouseclicked (MouseEvent e) MouseMotion- mousemove mousemoved (MouseEvent e) Listener mousedrag mousedragged (MouseEvent e) KeyListener keyup keyreleased (KeyEvent e) keydown keypressed (KeyEvent e) keytyped keytyped (KeyEvent e) 2000, IAS 28
JDK 1.1 - Ereignismodell (3) Schritt 2: Listener-Schnittstellen implementieren der Ereignis-Listener ist eine Klasse, die die Listener- Schnittstelle implementiert Schnittstellen-Implementierung kann auf zwei Arten erfolgen: (A) separate Listener-Klasse: elegante Lösung für größere Programme zu (A): (B) Listener wird direkt in der Applet-Klasse implementiert: schnelle Lösung für kleinere Applets 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 für MouseListener MouseMotionAdapter für MouseMotionListener KeyAdapter für KeyListener 2000, IAS 29
JDK 1.1 - Ereignismodell (4) Schritt 2 (Forts.): Listener-Schnittstellen implementieren zu (A): von den Listener-Adapterklassen werden eigene Listener- Klassen 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
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
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
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
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
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
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
Mausereignisse (5) Beispiel (Forts.) 2000, IAS 37
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