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