Grafikprogrammierung in Java: Grundlagen



Ähnliche Dokumente
Objektorientierte Software-Entwicklung

GUI Programmierung mit JAVA Swing

Grafikausgabe mit dem Abstract- Windowing-Toolkit. Eine Einführung

Swing Lernen am Code Teil 1

Zentrale Objekte zur Programmierung graphischer Benutzeroberflächen (GUI)

Grundlagen der Programmierung APPLETS

NTB Druckdatum:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

Graphische Benutzungsoberflächen

GUI Programmierung in Java

Kap. 35 Swing: Grundlagen Kap Swing: Hauptfenster

GRAFISCHE BENUTZERSCHNITTSTELLEN

Applets. Applets. Applets. Applet: Java-Programm Eingebettet in einer HTML-Seite Ausführung von einem Java-fähigen Web-Browser oder sog.

Institut für Programmierung und Reaktive Systeme. GUIs mit Swing. Markus Reschke

Java I Vorlesung 11 Graphische Oberflächen mit Swing

Swing :Komponenten I (Teil 2)

GUI-Programmierung. Teil I. Unterlagen zum Modul OOP mit Java V by MOU2/BFH-TI. Berner Fachhochschule Technik und Informatik

Programmieren mit Swing

Programmieren II. Java im Vergleich zu anderen Sprachen. Einführung: GUI. Einführung: Grafische Benutzeroberflächen. Dr.

Hochschule der Medien Prof. Uwe Schulz 14. Juli 2010 Klausur Informatik, EDV-Nr Seite 1 von 5. Teil 2: Aufgaben

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 7. Grafische Benutzeroberflächen 1

Einstieg in die Informatik mit Java

Ziel dieses Kapitels: Einführung in die Grundzüge der Programmierung graphischer Benutzeroberflächen (engl.: "graphical user interface", GUI) in Java

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Abteilung Informatik, JFC/Swing 2004 Diego Schmidlin V2.2

Objektorientierte Softwareentwicklung

Swing Grundlagen. Andre Eichmann

Objektorientierte Programmierung

Einführung: Grafische Benutzeroberflächen. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 22

Beispiel: Eine Choice-Liste...

...erinnern Sie sich? oopjs4b / kwhbkd4r

Ist eine Softwarekomponente, die dem Benutzer eines Computers die Interaktion mit der Maschine über grafische Symbole erlaubt

Programmieren II. Zeichnen in Swing-Komponenten. Heusch 18 Ratz Institut für Angewandte Informatik

Tag 9: Grafische Benutzeroberflächen

Auswahl aus mehreren Alternativen:

JButton, JCheckBox, JRadioButton. Programmieren II. Vorlesung 7. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2009.

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

GUI Programmierung mit javax.swing

Grafische Benutzeroberflächen mit Swing

Schablonen für Klassen, Interfaces oder Methoden, die noch nicht festgelegte Datentypen verwenden

Programmieren in Java

Benutzeroberflächen. Java Teil 4

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Kapitel 7: Ereignis-basierte Kommunikation

24. Textausgabe in Java. Vorgetragen von Rüdiger Heidenreich

Inhaltsverzeichnis Einleitung...1 Die Begleit-CD zu diesem Buch...5 Erweiterungen für Java Ereignisse...15

Programmieren 2 Selbststudium Semesterwoche 4

Java Projekt: Tic Tac Toe + GUI

Universität Paderborn Prof. Dr. Stefan Böttcher. Abschluss von Kapitel 2: Programmierung Grafischer Oberflächen mit der Swing-Bibliothek

DHBW Karlsruhe, Vorlesung Programmieren, Events Musterlösung

Grafikprogrammierung mit Java Teil 1/2

Erstellen von x-y-diagrammen in OpenOffice.calc

Einführung in die Programmierung für NF. Grafische Benutzeroberflächen

AK-Automatisierungs und Kommunikationstechnik TI Technische Informatik. NWT Netzwerktechnik

DAUERHAFTE ÄNDERUNG VON SCHRIFTART, SCHRIFTGRÖßE

Einführung in Swing. Graphical User Interface

Handbuch B4000+ Preset Manager

Mediator 9 - Lernprogramm

GUI-Programmierung in Java

EAD II Übung 5. Graphische Benutzungsoberfläche mit BlueJ

Ziele. Kapitel 8: Grafische Benutzerschnittstellen. AWT und Swing. Ziele (2)

Java: Vererbung. Teil 3: super()

Kapitel 8: Grafische Benutzerschnittstellen

Outlook Erstellen einer aus einer HTML - Vorlage INHALT

2A Basistechniken: Weitere Aufgaben

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Einstellungen im Internet-Explorer (IE) (Stand 11/2013) für die Arbeit mit IOS2000 und DIALOG

Visio Grundlagen. Linda York. 1. Ausgabe, Oktober 2013

Applets I. Grundlagen der g Applet-Programmierung

Wichtige Hinweise zu den neuen Orientierungshilfen der Architekten-/Objektplanerverträge

Fenster in Java. von Stefanie Gerckens 1

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

tentoinfinity Apps 1.0 EINFÜHRUNG

14 Swing-Komponenten , Prof. Dr. D. Ratz

KURZANLEITUNG CLOUD OBJECT STORAGE

Kurzeinführung Excel2App. Version 1.0.0

Einführung in GUI-Programmierung. javax.swing

Die Dateiablage Der Weg zur Dateiablage

Hilfe zur Dokumentenverwaltung

Newsletter. 1 Erzbistum Köln Newsletter

Grafische Benutzeroberfläche mit Glade und Python

Funktionale und Objekt-Orientierte Programmierkonzepte

Einführung in die Programmierung für NF. Übung

Objektorientierte Programmierung. Kapitel 12: Interfaces

Um dies zu tun, öffnen Sie in den Systemeinstellungen das Kontrollfeld "Sharing". Auf dem Bildschirm sollte folgendes Fenster erscheinen:

Visualisierung auf Büro PC s mit dem ibricks Widget

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

Kapitel 3 Frames Seite 1

Java GUI Entwicklung mit Swing

MPDS4 EXAMPLE DATENBANK

Qt-Projekte mit Visual Studio 2005

Kap. 36. SWING: Menüs. und weitere SWING-Container. Seán Dempsey

Hinweise zum Übungsblatt Formatierung von Text:

Swing : Komponeneten I (Teil 1) Was ist Swing?

Novell Client. Anleitung. zur Verfügung gestellt durch: ZID Dezentrale Systeme. Februar ZID Dezentrale Systeme

Einbindung der Tastatur

HTML Programmierung. Aufgaben

Transkript:

Grafikprogrammierung in Java: Grundlagen 11.1 Grundlagen 11.2 Grafische Grundelemente 11.3 Fensterklassen 11.4 Ereignisse und Widgets 11.5 Applets 11.6 Die Swing-Klassen 11.1 Grundlagen 11-1

Schnittstellen für Anwenderprogramme Eine Schnittstelle für Anwenderprogramme (application programming interface, API) stellt wohldefinierte und standardisierte Klassen und Methoden zur Verfügung, die von Anwenderprogrammen genutzt werden können. APIs ermöglichen es, vorhandene Software um weitere Funktionen zu ergänzen. Java stellt beispielsweise APIs für die folgenden Zwecke zur Verfügung: Grafikprogrammierung (mit AWT, Swing) Datenbankzugriffe (mit JDBC) Netzwerkprogrammierung Verarbeitung, Auswertung und Transformation von XML-Dokumenten Verschlüsselung von Daten (Sicherheit, Kryptografie, SecurityManager) Sound... 11.1 Grundlagen 11-2

Grafikprogrammierung Java bietet den Programmierern zwei Bibliotheken zur Programmierung von grafischen Benutzeroberflächen (graphical user interface, GUI) an: Abstract Window Toolkit (AWT) Das AWT ermöglicht die Ausführung grundlegender grafischer Operationen. Die Klassen und Methoden des AWTs sind im Standardpaket java.awt enthalten. Swing Seit der Version 1.1 gibt es eine zweite Grafikbibliothek im Java Development Kit. Sie heißt Swing und ist Bestandteil des Erweiterungspakets javax.swing. Diese Bibliothek beseitigt etliche Schwächen des AWTs und bietet eine weitgehend plattformunabhängige Schnittstelle. Die Möglichkeiten, die Swing bietet, übersteigen die des AWTs. 11.1 Grundlagen 11-3

Grafikprogrammierung Neben AWT und Swing gibt es eine verbreitete Bibliothek zur Programmierung grafischer Benutzeroberflächen: Standard Widget Toolkit (SWT) SWT ist eine Bibliothek für die Erstellung grafischer Oberflächen mit Java. Sie wurde im Jahr 2001 von IBM für die Entwicklungsumgebung Eclipse entwickelt und kommt in einer ganzen Reihe von Anwendungen zum Einsatz, beispielsweise Eclipse selbst. SWT leidet auf einigen Nicht-Windows-Plattformen unter Effizienzproblemen. SWT gehört nicht zum JDK. Wir gehen hier (aus Zeitgründen) nicht auf SWT ein. Es gibt weitere Bibliotheken. 11.1 Grundlagen 11-4

Das Abstract Window Toolkit Die Fähigkeiten des AWTs lassen sich in vier Gruppen einteilen: Grundoperationen zum Zeichnen von Linien und Flächen und zur Ausgabe von Text Methoden zur Programmsteuerung durch die Behandlung von Maus-, Tastaturund Fensterereignissen Dialogelemente zur Kommunikation mit dem Anwender Fortgeschrittene Operationen zur Ausgabe von Bitmaps und Tönen 11.1 Grundlagen 11-5

Ein einführendes Beispiel import java.awt.*; public class Fenster extends Frame { } Fenster() { setbackground(color.yellow); setsize(200,150); setlocation(500,500); setvisible(true); } public static void main(string[] args) { new Fenster(); } 11.1 Grundlagen 11-6

Das Abstract Window Toolkit Zum Ableiten einer eigenen Fensterklasse wird in der Regel entweder die Klasse Frame oder die Klasse Dialog verwendet. Um ein neues Fenster zu erhalten, muss ein Objekt der Klasse Frame erzeugt, auf die gewünschte Größe gebracht und durch Aufruf der Methode setvisible sichtbar gemacht werden. Die Ausgabe in ein Fenster erfolgt durch Überlagern der Methode paint. Diese Methode wird immer dann aufgerufen, wenn das Fenster neu gezeichnet werden muss, z. B. beim Programmstart oder beim Verändern der Größe. Die Methode void paint(graphics g) erhält als Parameter einen grafischen Kontext. Hierunter versteht man allgemeine Einstellungen für Schrift und Grafik, beispielsweise den aktuellen Font und die aktuelle Farbe. 11.1 Grundlagen 11-7

import java.awt.*; class Rechteck extends Canvas { Ein einführendes Beispiel public void paint(graphics g) { g.setcolor(color.red); g.fillrect(20,20,100,40); g.setcolor(color.black); g.drawstring("ein rotes Rechteck",20,80); setlocation(20,15); } } // Vokabeltest: canvas = Leinwand 11.1 Grundlagen 11-8

class EinfachesFenster extends Frame { EinfachesFenster() { add(new Rechteck()); setbackground(color.yellow); setsize(200,150); setvisible(true); setlocation(200,200); } } public static void main(string[] args) { new EinfachesFenster(); } 11.1 Grundlagen 11-9

Ereignisgesteuerte Programmierung Die Programme, die wir bisher betrachtet haben, arbeiten nach dem Prinzip der Ein-Ausgabe-Programmierung. Dieses Modell wird jetzt zur ereignisgesteuerten Programmierung erweitert. Ereignisse sind beispielsweise das Drücken einer Taste, die Betätigung des Rollbalkens oder die Bewegung der Maus. Es gibt viele Varianten der ereignisgesteuerten Programmierung. In Java wird das sogenannte Delegation Based Event Handling verwendet. Es bietet die Möglichkeit, GUI-Ereignisse an beliebige Objekte weiterzuleiten und dort zu behandeln. Auf diese Weise können die Oberfläche und die eigentliche Anwendung klar voneinander getrennt werden. 11.1 Grundlagen 11-10

Ereignisgesteuerte Programmierung Jedes Ereignis besitzt eine Quelle (Source). Ein Ereignis kann von Beobachtern (Listener) wahrgenommen werden. Die Anmeldung von Beobachtern zur Benachrichtigung vom Eintreten eines Ereignisses ist frei programmierbar und muss immer explizit erfolgen. Es ist nicht festgelegt, in welcher Reihenfolge die Beobachter vom Eintreten eines Ereignisses informiert werden. Sichergestellt ist lediglich, dass jeder Beobachter eine Kopie des ursprünglichen Ereignisses erhält. Bei der Verbreitung von Ereignissen ist zwischen den Modi single-cast und multi-cast zu unterscheiden. Für Single-Cast-Ereignisse wird der Beobachter mit einer setxxlistener-methode gesetzt, für Multi-Cast-Ereignisse wird ein Beobachter mit einer addxxlistener-methode der Menge der Beobachter hinzugefügt. 11.1 Grundlagen 11-11

Beispiel: Schließen eines Fensters Um ein Fenster zu schließen, muss ein WindowListener registriert werden. Hierbei handelt es sich um einen Beobachter, dessen Methode windowclosing aufgerufen wird, wenn der Anwender das Fenster über ein System-Menü oder einen Button schließen möchte. Das Fenster wird durch setvisible(false) unsichtbar gemacht, seine Ressourcen durch dispose() wieder freigegeben. 11.1 Grundlagen 11-12

Beispiel: Schließen eines Fensters import java.awt.*; import java.awt.event.*; public class WindowClosingAdapter extends WindowAdapter { public void windowclosing(windowevent event) { event.getwindow().setvisible(false); event.getwindow().dispose(); System.out.println("Das Fenster wurde geschlossen!"); } } Frame wnd = new Frame(); wnd.addwindowlistener(new WindowClosingAdapter()); wnd.setsize(400,300); wnd.setvisible(true); 11.1 Grundlagen 11-13

Adapter-Klassen Eine Adapter-Klasse ist eine Klasse, die eine gegebene Schnittstelle implementiert, indem sie jede abstrakte Methode durch einen leeren Rumpf realisiert. Adapter-Klassen werden verwendet, wenn von einer Schnittstelle lediglich ein Teil der Methoden benötigt wird, der Rest aber uninteressant ist. In diesem Fall leitet man eine neue Klasse aus der Adapter-Klasse ab und überlagert nur die erforderlichen Methoden. Beispiel: Die Klasse WindowAdapter implementiert die Schnittstellen WindowListener, WindowStateListener und WindowFocusListener durch leere Rümpfe. Hierbei handelt es sich um die folgenden Methoden: 11.1 Grundlagen 11-14

Die Klasse WindowAdapter void windowactivated(windowevent e) void windowclosed(windowevent e) void windowclosing(windowevent e) void windowdeactivated(windowevent e) void windowdeiconified(windowevent e) void windowgainedfocus(windowevent e) void windowiconified(windowevent e) void windowlostfocus(windowevent e) void windowopened(windowevent e) void windowstatechanged(windowevent e) 11.1 Grundlagen 11-15

Ein einführendes Beispiel Wir fassen zusammen: import java.awt.*; import java.awt.event.*; class WindowClosingAdapter extends WindowAdapter { public void windowclosing(windowevent event) { event.getwindow().setvisible(false); event.getwindow().dispose(); System.out.println("Das Fenster wurde geschlossen!"); } } 11.1 Grundlagen 11-16

class Rechteck extends Canvas { } public void paint(graphics g) { g.setcolor(color.red); g.fillrect(20,20,100,40); g.setcolor(color.black); g.drawstring("ein rotes Rechteck",20,80); setlocation(20,15); } 11.1 Grundlagen 11-17

public class EinfachesFenster extends Frame { } EinfachesFenster(String title) { super(title); addwindowlistener(new WindowClosingAdapter()); setbackground(color.yellow); setsize(400,200); add(new Rechteck()); setvisible(true); } 11.1 Grundlagen 11-18

EinfachesFenster e1 = new EinfachesFenster("Erstes Fenster"), e2 = new EinfachesFenster("Zweites Fenster"), e3 = new EinfachesFenster("Drittes Fenster"); e1.setlocation(200,200); e2.setlocation(400,300); e3.setlocation(600,400); 11.1 Grundlagen 11-19

Grafikprogrammierung in Java: Grafische Grundelemente 11.1 Grundlagen 11.2 Grafische Grundelemente 11.3 Fensterklassen 11.4 Ereignisse und Widgets 11.5 Applets 11.6 Die Swing-Klassen 11.2 Grafische Grundelemente 11-20

Das grafische Koordinatensystem Die Ausgabe von grafischen Objekten basiert auf einem zweidimensionalen Koordinatensystem, dessen Ursprung (0,0) in der linken oberen Ecke liegt. x y Positive x-werte erstrecken sich nach rechts, positive y-werte nach unten. Die Maßeinheit entspricht einem Bildschirmpixel und ist somit geräteabhängig. 11.2 Grafische Grundelemente 11-21

Der Benutzerbereich Es steht nicht das gesamte Fenster für Ausgaben zur Verfügung. Oben, unten, links und rechts wird Platz zur Ausgabe von Rahmen und Titelzeile benötigt. Mit getsize().width und getsize().height kann die Gesamtbreite bzw. -höhe eines Fensters ermittelt werden. Durch getinsets().left, getinsets().right, getinsets().top und getinsets().bottom lässt sich die Abmessung des Rahmens und durch Differenzbildung die des Benutzerbereichs (client area) bestimmen. 11.2 Grafische Grundelemente 11-22

Elementare Grafikroutinen (Auswahl) void drawstring(string s, int x, int y) drawstring schreibt den String s an die Position (x,y). Diese Koordinaten stellen das linke Ende der Basislinie von s dar. void drawchars(char[] c, int offset, int length, int x, int y) Diese Methode schreibt ein Zeichenfeld. Die Parameter offset und length können zur Angabe des ersten Zeichens und der Anzahl der auszugebenden Zeichen verwendet werden. 11.2 Grafische Grundelemente 11-23

Beispiel: Die Anweisungen Elementare Grafikroutinen (Auswahl) char[] c = { a, b, c, d, e, f }; g.drawstring("zeichenkette",50,50); g.drawchars(c,1,4,50,150); schreiben den String "Zeichenkette" an die Position (50,50) und darunter die Zeichen "bcde" an die Position (50,150). 11.2 Grafische Grundelemente 11-24

Elementare Grafikroutinen (Auswahl) void drawline(int x1, int y1, int x2, int y2) Diese Methode zieht eine Linie von der Position (x1,y1) zur Position (x2,y2). void drawrect(int x, int y, int width, int height) drawrect zeichnet ein Rechteck der Breite width und der Höhe height, dessen linke obere Ecke an der Position (x,y) liegt. void drawroundrect(int x, int y, int width, int height, int arcwidth, int archeight) Es wird ein Rechteck mit abgerundeten Ecken gezeichnet. arcwidth und archeight bestimmen die Halbachsen der Ellipse, die zur Darstellung der Ecken verwendet wird. 11.2 Grafische Grundelemente 11-25

Elementare Grafikroutinen (Auswahl) void drawpolygon(int[] x, int[] y, int anzahl) Diese Methode zeichnet einen Linienzug. Die x-koordinaten der Punkte werden dem ersten Parameter, die y-koordinaten dem zweiten Parameter entnommen. Die Anzahl der Koordinatenpaare wird durch den dritten Parameter festgelegt. Der Polygonzug wird geschlossen. Durch drawpolyline kann ein nichtgeschlossener Linienzug dargestellt werden. Eine andere Möglichkeit, ein Polygon zu erzeugen, besteht darin, einen Konstruktor der Klasse Polygon aufzurufen: Polygon(int[] x, int[] y, int anzahl) Polygon() Durch addpoint kann ein Polygon erweitert werden. 11.2 Grafische Grundelemente 11-26

Elementare Grafikroutinen (Auswahl) void drawoval(int x, int y, int width, int height) Mit dieser Methode können Kreise und Ellipsen gezeichnet werden. Die Parameter spezifizieren ein Rechteck wie in der Methode drawrect. Es wird die größte Ellipse gezeichnet, die in dieses Rechteck hineinpasst. void drawarc(int x, int y, int width, int height, int startangle, int arcangle) Mit drawarc kann ein Kreisbogen dargestellt werden. Die ersten vier Parameter geben den Kreis, startangle den Anfangswinkel und arcangle den Winkel an. 11.2 Grafische Grundelemente 11-27

Elementare Grafikroutinen (Auswahl) Die folgenden Funktionen stellen die gleichen geometrischen Objekte dar wie die obigen, zeichnen aber nicht nur deren Umrisse, sondern füllen auch ihre Fläche aus. void fillrect(... ) void fillroundrect(... ) void fillpolygon(... ) void filloval(... ) void fillarc(... ) 11.2 Grafische Grundelemente 11-28

Elementare Grafikroutinen (Auswahl) void clearrect(int x, int y, int width, int height) Die Methode clearrect überschreibt das angegebene Rechteck mit der aktuellen Hintergrundfarbe. void copyarea(int x, int y, int width, int height, int dx, int dy) copyarea kopiert das ausgewählte Rechteck an die Position (x + dx, y + dy). Mit einer Clipping-Region kann die Ausgabe auf einen bestimmten Bereich eingeschränkt werden. 11.2 Grafische Grundelemente 11-29

Schriftarten Ohne zusätzliche Anweisungen wird Text in einem systemabhängigen Standard-Font ausgegeben. Um einen anderen Font zur Textausgabe zu verwenden, muss zuerst ein Font-Objekt erzeugt und dann in den Grafik-Kontext eingetragen werden. Ein Font-Objekt kann mit einem Konstruktor der Klasse Font erzeugt werden: Font(String name, int style, int size) Mit void setfont(font font) und Font getfont() kann der Font gesetzt bzw. abgefragt werden. 11.2 Grafische Grundelemente 11-30

Schriftarten Der Parameter name gibt den Namen der gewünschten Schrift an. Font-Namen sind beispielsweise Times New Roman, Helvetica oder Courier. Schriften können Serifen besitzen oder auch serifenlos sein. Ein weiteres Kennzeichen einer Schrift ist die Zeichenbreite. Diese kann variabel oder konstant sein. Bei konstanter Zeichenbreite bezeichnet man eine Schrift als monospaced. Beispiel: Der Font, in dem diese Folien geschrieben wurden, ist die serifenlose Variante der Latin Computer Modern. Es können auch die Font-Namen Serif, SansSerif und Monospaced verwendet werden. Sie werden auf entsprechende Fonts abgebildet. 11.2 Grafische Grundelemente 11-31

Schriftarten Der Parameter size gibt die Schriftgröße an. Übliche Schriftgrößen für Text liegen zwischen 10 pt und 12 pt. Die Schriftart wird durch den Parameter style beschrieben: Name Wert Bedeutung Font.PLAIN 0 Standard-Font Font.BOLD 1 Fettdruck Font.ITALIC 2 Kursivdruck 3 fetter Kursivdruck 11.2 Grafische Grundelemente 11-32

Schriftarten Beispiel: Die folgenden Anweisungen bewirken, dass der String "Zeichenkette" in einer Schrift mit konstanter Zeichenbreite in fettem Kursivdruck in 12-Punkt-Schrift an die Position (50,350) geschrieben wird: Font f = new Font("Monospaced",3,12); g.setfont(f); g.drawstring("zeichenkette",50,350); 11.2 Grafische Grundelemente 11-33

Schriftarten Das folgende Beispiel gibt die drei Standardschriften in 36 Punkt aus: public void paint(graphics g) { } Font font; String[] arfonts = {"Serif","SansSerif","Monospaced"}; for (int i = 0; i < arfonts.length; ++i) { font = new Font(arfonts[i],Font.PLAIN,36); g.setfont(font); g.drawstring(arfonts[i],10,30 + (i + 1) * (36 + 5)); } 11.2 Grafische Grundelemente 11-34

Schriftarten Die Klasse Font besitzt Methoden, um Informationen über den aktuellen Font zu gewinnen: String getfamily() int getstyle() int getsize() Die Klasse FontMetrics stellt Methoden zur Verfügung, mit denen die Größenmaßzahlen einzelner Zeichen wie Oberlänge, Unterlänge oder Breite, Größen wie der Zeilenabstand oder die Länge eines Strings ermittelt werden können. int charwidth(char ch) int stringwidth(string str) 11.2 Grafische Grundelemente 11-35

Farbmodell Eine Möglichkeit, in Java Farben zu benutzen, basiert auf dem RGB-Farbmodell (Rot-Grün-Blau-Farbmodell). Jede dieser drei Grundfarben wird durch 8 Bits dargestellt. Der Anteil einer Grundfarbe kann also durch eine Dezimalzahl zwischen 0 und 255 beschrieben werden. Für die gesamte Farbtiefe ergeben sich somit 24 Bits. Farbe Rot Grün Blau Weiß 255 255 255 Grau 127 127 127 Schwarz 0 0 0 Rot 255 0 0 Grün 0 255 0 Blau 0 0 255 Gelb 255 255 0 Magenta 255 0 255 Cyan 0 255 255 Java unterstützt weitere Farbmodelle, in denen Farben z. B. durch Farbton, Intensität und Helligkeit dargestellt werden. 11.2 Grafische Grundelemente 11-36

Erzeugung von Farben Farben werden durch die Klasse Color dargestellt. Jedes Objekt repräsentiert eine Farbe, die durch ihren RGB-Wert eindeutig gekennzeichnet ist. Konstruktoren: Color(int r, int g, int b) Color(float r, float g, float b) Der erste Konstruktor erwartet ganzzahlige Werte im Bereich von 0 bis 255, der zweite Fließkommazahlen zwischen 0.0 und 1.0. Der Wert 0.0 entspricht der ganzzahligen 0, der Wert 1.0 der ganzzahligen 255. 11.2 Grafische Grundelemente 11-37

Erzeugung von Farben Die Klasse Color stellt etliche Farben als statische Objekte zur Verfügung: static Color black static Color red static Color green static Color blue... Von einem bestehenden Farbobjekt kann der RGB-Wert mit den Methoden int getred(), int getgreen() und int getblue() ermittelt werden. 11.2 Grafische Grundelemente 11-38

Verwendung von Farben Um Farben bei der Ausgabe von Schrift oder Grafik zu verwenden, muss ein Objekt der Klasse Color erzeugt und mithilfe der Methode void setcolor(color c) dem grafischen Kontext zugewiesen werden. Die Ausgabe erfolgt solange in der neuen Farbe, bis dem Kontext eine neue Farbe zugeordnet wird. Mit Color getcolor() wird die aktuelle Farbe abgefragt. 11.2 Grafische Grundelemente 11-39

Verwendung von Farben Beispiel: public void paint(graphics g) { g.setcolor(color.red); g.drawstring("zeichenkette",200,500); g.setcolor(new Color(200,200,0)); g.drawoval(50,400,60,160);... } 11.2 Grafische Grundelemente 11-40

Die Klasse SystemColor Die Klasse SystemColor stellt eine Reihe von Farben zur Verfügung, die den Farben des Desktops entsprechen. Damit können Anwendungen entwickelt werden, die im Aussehen an die Betriebssystemumgebung angepasst sind. Beispiele: SystemColor.desktop Hintergrundfarbe des Desktops SystemColor.window Hintergrundfarbe für Fenster SystemColor.text Hintergrundfarbe für Text 11.2 Grafische Grundelemente 11-41

Grafikprogrammierung in Java: Fensterklassen 11.1 Grundlagen 11.2 Grafische Grundelemente 11.3 Fensterklassen 11.4 Ereignisse und Widgets 11.5 Applets 11.6 Die Swing-Klassen 11.3 Fensterklassen 11-42

Fensterklassen Das AWT enthält eine Reihe von Fensterklassen, die über eine Vererbungslinie miteinander verbunden sind. An der Spitze steht die Klasse Component: Component Container Panel - Applet Window - Frame - Dialog FileDialog Button Canvas Checkbox Choice Label List Scrollbar Textcomponent 11.3 Fensterklassen 11-43

Fensterklassen Component ist eine abstrakte Klasse, deren Objekte Programmelemente darstellen, die eine Größe und eine Position besitzen und die Ereignisse senden und auf Ereignisse reagieren können. Container ist eine konkrete Klasse. Sie erlaubt es, innerhalb einer Komponente weitere Komponenten aufzunehmen. Container stellt Methoden, um Komponenten hinzuzufügen oder zu entfernen, bereit. Mit den LayoutManager-Klassen werden die Komponenten positioniert. LayoutManager, LayoutManager2 sind Interfaces. Implementierende Klassen sind beispielsweise BorderLayout, FlowLayout, GridLayout,... 11.3 Fensterklassen 11-44

Fensterklassen Panel ist die einfachste konkrete Klasse mit den Eigenschaften von Component und Container. Applet ist eine direkte Unterklasse von Panel. Ein Applet besitzt also die Fähigkeiten der Klassen Component und Container. Diese Klasse spielt eine entscheidende Rolle in der Entwicklung von Applets. Die Klasse Window abstrahiert ein Top-Level-Window ohne Rahmen, Titelleiste und Menü. Sie ist für Anwendungen geeignet, die die Kontrolle über das gesamte Fenster benötigen. Frame repräsentiert ein Top-Level-Window mit Rahmen, Titelleiste und optionalem Menü. Einem Frame kann ein Icon zugeordnet werden, das angezeigt wird, wenn ein Fenster minimiert wird. 11.3 Fensterklassen 11-45

Aufrufen und Schließen eines Fensters Um ein Fenster auf dem Bildschirm anzuzeigen, muss zunächst eine geeignete Fensterklasse instanziiert werden. Dafür kommen Klassen wie Window, Frame, Dialog, Applet und FileDialog in Frage. Die Klassen haben unterschiedliche Konstruktoren. Nach der Instanziierung wird die Methode setvisible(boolean visible) aufgerufen, um das Fenster anzuzeigen. Wird true übergeben, wird das Fenster angezeigt, andernfalls geschlossen. Um ein Fenster zu schließen, sind die Methoden setvisible(false) und dispose() aufzurufen. 11.3 Fensterklassen 11-46

Eigenschaften eines Fensters Größe und Position, geerbt von Component Aktivierungskomponente, geerbt von Component Fensterelemente Titelleiste, Menü, Icon, Mauscursor, Standardfont, Vorder- und Hintergrundfarbe Die Eigenschaften eines Fensters können mithilfe spezieller Methoden gesetzt und abgefragt werden. Beispiel: Objekte der Klasse Frame besitzen einen Rahmen, eine Titelleiste und optional ein Menü, Objekte der Klasse Window hingegen nicht. 11.3 Fensterklassen 11-47

Grafikprogrammierung in Java: Ereignisse und Widgets 11.1 Grundlagen 11.2 Grafische Grundelemente 11.3 Fensterklassen 11.4 Ereignisse und Widgets 11.5 Applets 11.6 Die Swing-Klassen 11.4 Ereignisse und Widgets 11-48

Ereignisgesteuerte Programmierung Ereignisse sind beispielsweise das Drücken einer Taste, die Betätigung des Rollbalkens oder die Bewegung der Maus. Jedes Ereignis besitzt eine Quelle (Source). Ein Ereignis kann von Beobachtern (Listener) wahrgenommen werden. Die Anmeldung von Beobachtern zur Benachrichtigung vom Eintreten eines Ereignisses ist frei programmierbar und muss immer explizit erfolgen. Es ist nicht festgelegt, in welcher Reihenfolge die Beobachter vom Eintreten eines Ereignisses informiert werden. Sichergestellt ist lediglich, dass jeder Beobachter eine Kopie des ursprünglichen Ereignisses erhält. 11.4 Ereignisse und Widgets 11-49

Ereignisgesteuerte Programmierung Bei der Verbreitung von Ereignissen ist zwischen den Modi single-cast und multi-cast zu unterscheiden. Für Single-Cast-Ereignisse wird der Beobachter mit einer setxxlistener-methode gesetzt, für Multi-Cast-Ereignisse wird ein Beobachter mit einer addxxlistener-methode der Menge der Beobachter hinzugefügt. Eine Adapter-Klasse ist eine Klasse, die eine gegebene Schnittstelle implementiert, indem sie jede abstrakte Methode durch einen leeren Rumpf realisiert. Adapter-Klassen werden verwendet, wenn von einer Schnittstelle lediglich ein Teil der Methoden benötigt wird, der Rest aber uninteressant ist. In diesem Fall leitet man eine neue Klasse aus der Adapter-Klasse ab und überlagert nur die erforderlichen Methoden. 11.4 Ereignisse und Widgets 11-50

Ereignisklassen EventObject AWTEvent ComponentEvent - FocusEvent - InputEvent - KeyEvent - MouseEvent - ContainerEvent - WindowEvent ActionEvent AdjustmentEvent ItemEvent TextEvent 11.4 Ereignisse und Widgets 11-51

EventListener-Schnittstellen EventListener FocusListener ActionListener AdjustmentListener ItemListener TextListener KeyListener MouseListener MouseMotionListener WindowListener ContainerListener ComponentListener 11.4 Ereignisse und Widgets 11-52

Low-Level-Events Beispiel: Window-Events windowopened windowactivated, windowdeactivated windowclosed windowclosing windowiconified, windowdeiconified 11.4 Ereignisse und Widgets 11-53

Widgets Fensterelemente mit Ein- und/oder Ausgabefunktionalität werden als Widgets (window gadgets) bezeichnet. Die Anordnung der Widgets in einem Fenster wird durch den Layout-Manager durchgeführt. Widgets sind beispielsweise: Label Rollbalken Schaltflächen (buttons) Checkboxen und Checkboxgruppen (radio buttons) 11.4 Ereignisse und Widgets 11-54

Widgets Textfelder und Textbereiche Auswahlboxen Listen Canvas Panels Dateidialogboxen (nicht für Applets) Menüs (nicht für Applets) 11.4 Ereignisse und Widgets 11-55

Schritte zur Realisierung eines Widgets Schnittstelle angeben Widget deklarieren und initialisieren Widget dem Layout hinzufügen Beobachter registrieren Ereignis behandeln Man beachte, dass mehrere Widgettypen dieselbe Ereignisklasse verwenden, z. B. benutzen Schaltflächen und Textfelder die Klasse ActionListener. 11.4 Ereignisse und Widgets 11-56

Beispiel: Rollbalken Als erstes Beispiel betrachten wir jetzt die Programmierung eines Rollbalkens. import java.awt.*; import java.awt.event.*; public class WindowBlind extends Frame implements AdjustmentListener { private Scrollbar schieber; private int schieberwert; 11.4 Ereignisse und Widgets 11-57

public WindowBlind() { setlayout(new FlowLayout()); setbackground(color.white); schieber = new Scrollbar(Scrollbar.HORIZONTAL,0,1,0,101); add(schieber); addwindowlistener(new WindowClosingAdapter()); schieber.addadjustmentlistener(this); } 11.4 Ereignisse und Widgets 11-58

public void paint(graphics g) { g.drawstring("rollbalkenwert ist " + schieberwert,120,200); g.setcolor(color.red); g.drawrect(40,80,60,100); g.fillrect(40,80,60,schieberwert); g.setcolor(color.blue); g.drawrect(120,80,60,100); g.fillrect(120,80 + schieberwert,60,100 - schieberwert); g.setcolor(color.green); g.drawrect(200,80,60,100); g.fillrect(200,80,60,100 - schieberwert); } 11.4 Ereignisse und Widgets 11-59

public void adjustmentvaluechanged(adjustmentevent e) { schieberwert = schieber.getvalue(); repaint(); } 11.4 Ereignisse und Widgets 11-60

public static void main(string[] args) { WindowBlind f = new WindowBlind(); f.setsize(400,300); f.setvisible(true); } } 11.4 Ereignisse und Widgets 11-61

Beispiel: Label und Button... implements ActionListener { private Label title; private Button knopf1, knopf2; private int anzahl = 0; public Konstruktor() { setlayout(new FlowLayout()); title = new Label("Zählknopf:"); knopf1 = new Button("Drück mich!"); knopf2 = new Button("Ende"); add(title); add(knopf1); add(knopf2); knopf1.addactionlistener(this); knopf2.addactionlistener(this); } 11.4 Ereignisse und Widgets 11-62

public void paint(graphics g) { g.drawstring("der Knopf wurde " + anzahl + " mal gedrückt.",10,80); } public void actionperformed(actionevent event) { anzahl++; if (event.getsource() == knopf2) System.exit(0); repaint(); } } 11.4 Ereignisse und Widgets 11-63

AbstractButton Die abstrakte Klasse AbstractButton ist eine Unterklasse der Klasse JComponent (s. Abschnitt Swing-Klassen). Die abstrakte Klasse AbstractButton enthält die Methode void doclick() durch die in Implementierungen dieser Klasse ein Klick programmatisch ausgeführt werden kann. Beispiele für Unterklassen von AbstractButton sind die Klassen JButton, JToggleButton und JMenuItem. 11.4 Ereignisse und Widgets 11-64

Weitere Widgets Textfield: ActionListener, addactionlistener void actionperformed(actionevent event) Checkbox, Checkboxgroup: ItemListener, additemlistener void itemstatechanged(itemevent event) Choice: ItemListener, additem, additemlistener void itemstatechanged(itemevent event) 11.4 Ereignisse und Widgets 11-65

Grafikprogrammierung in Java: Applets 11.1 Grundlagen 11.2 Grafische Grundelemente 11.3 Fensterklassen 11.4 Ereignisse und Widgets 11.5 Applets 11.6 Die Swing-Klassen 11.5 Applets 11-66

Anwendungen (Applikationen) Anwendungen und Applets Anwendungen bilden eigenständige Programme. Zur Ausführung benötigen sie nur den Java-Interpreter und die.class-dateien der beteiligten Klassen. Jede Klasse, die die Methode public static void main enthält, kann als Anwendung benutzt werden. Applets (little applications) Applets sind kleine Programme, die in eine Html-Seite eingebettet sind und nur innerhalb eines Web-Browsers oder eines Applet-Viewers ausgeführt werden können. Applets werden nicht durch die Methode main gestartet, sondern müssen aus der Klasse Applet abgeleitet und entsprechend konstruiert werden. 11.5 Applets 11-67

import java.awt.*; import java.applet.*; Ein kleines Applet: Java-Datei public class MinimalApplet extends Applet { } public void paint(graphics g) { g.drawstring("test-ausgabe",0,20); } 11.5 Applets 11-68

Ein kleines Applet: Html-Seite <html> <head> <title>applet-test</title> </head> <body> <applet code="minimalapplet" width=600 height=800> Hier steht das Applet.</applet> </body> </html> 11.5 Applets 11-69

Anwendungen und Applets Ein Applet wird immer aus der Klasse Applet abgeleitet. Bei einer Anwendung ist es dagegen gleichgültig, woraus die Hauptklasse abgeleitet wird. Eine Anwendung wird gestartet, indem vom Java-Interpreter die Methode main aufgerufen wird. Das Starten eines Applets wird dadurch erreicht, dass der Browser oder der Applet-Viewer die Applet-Klasse instanziiert und die Methoden init und start aufruft. Aus Gründen der Sicherheit darf ein Applet in der Regel weder auf Dateien des lokalen Rechners zugreifen noch externe Programme auf dem Rechner starten. 11.5 Applets 11-70

Anwendungen und Applets Ein Applet arbeitet immer ereignisorientiert. Im Gegensatz dazu kann eine Anwendung auf die Behandlung von Ereignissen verzichten und alle Ein- und Ausgaben textbasiert durchführen. Im Vergleich zu Anwendungen bieten Applets einige zusätzliche Möglichkeiten. 11.5 Applets 11-71

Die Klasse Applet Die Klasse Applet steht in der Vererbungshierarchie unter der Klasse Component und Container. Sie besitzt damit deren Eigenschaften. Component Container Panel - Applet Bezüglich der Reaktion auf Ereignisse und die Registrierung und Programmierung von Listener-Klassen verhält sich ein Applet wie jedes andere Fenster. 11.5 Applets 11-72

init(): Initialisierung eines Applets start(): Start eines Applets stop(): Stopp eines Applets, z. B. beim Laden einer anderen Seite. Methoden start und stop können mehrfach während der Lebensdauer eines Applets aufgerufen werden. paint(graphics g): Methode zum Zeichnen destroy(): Beenden eines Applets 11.5 Applets 11-73

Beispiel: Rollbalken Als Beispiel schreiben wir das Rollbalkenprogramm als Applet. import java.awt.*; import java.awt.event.*; import java.applet.applet; public class WindowBlind extends Applet implements AdjustmentListener { private Scrollbar schieber; private int schieberwert; 11.5 Applets 11-74