Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger Einführung in die Programmierung mit Java 11. Vorlesung WS 2002/2003 Übersicht • Besprechung der Hausaufgabe • Allgemeine Listen/Suchstrukturen (Fortsetzung) • Benutzeroberflächen (Fenster, Menüs, Buttons, Texteingabefenster, ...) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 2 Hausaufgabe Schreibt eine Methode der Klasse Polygon, die den Flächeninhalt eines Polygons berechnet. Hinweise: • Orientiert euch an der Methode "Umfang" • Formel zur Berechnung des Flächeninhalts (Gaussche Flächenformel) in Diskreter Mathe, Vorlesung 2: 5 F= S 1 (xk - xk+1)(yk + 2 k = 1yk+1) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 3 Wh.: Klasse "Polygon": Methode Umfang public class Polygon{ protected LinkedList punktliste; public double umfang() { double umfang = 0; Iterator ersterIt = punktliste.iterator(); Iterator zweiterIt = punktliste.iterator(); zweiterIt.next(); Punkt ersterPt, zweiterPt; while(zweiterIt.hasNext()) { ersterPt = (Punkt) ersterIt.next(); zweiterPt = (Punkt) zweiterIt.next(); umfang = umfang + ersterPt.abstand(zweiterPt); } ersterPt = (Punkt) punktliste.getLast(); zweiterPt = (Punkt) punktliste.getFirst(); umfang = umfang + ersterPt.abstand(zweiterPt); return umfang;} } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 4 Klasse "Polygon": Methode Flächeninhalt public class Polygon{ protected LinkedList punktliste; public double flaecheninhalt() { double f = 0; Iterator ersterIt = punktliste.iterator(); Iterator zweiterIt = punktliste.iterator(); zweiterIt.next(); Punkt ersterPt, zweiterPt; while(zweiterIt.hasNext()) { ersterPt = (Punkt) ersterIt.next(); zweiterPt = (Punkt) zweiterIt.next(); f = f + (ersterPt.x() - zweiterPt.x()) * (ersterPt.y() + zweiterPt.y()); } ersterPt = (Punkt) punktliste.getLast(); zweiterPt = (Punkt) punktliste.getFirst(); f = f + (ersterPt.x() - zweiterPt.x()) * (ersterPt.y() + zweiterPt.y()); return Math.abs(f * 0.5);} } G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 5 Wh.: Listen und Mengen: vordefinierte Klassen Einfache Container-Datenstrukturen Assoziative Datenstrukturen AbstractCollection AbstractMap keine Duplikate Set LinkedList ArrayList TreeSet sortiert Map HashSet TreeMap HashMap sortiert G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 6 Wh.: Laufzeiten / Komplexität Klasse Einfügen/ Löschen Suchen Suchen mit Key LinkedList/ ArrayList const. O(n) TreeSet O(log n) O(log n) HashSet const. const. (mittel) TreeMap O(log n) O(log n) HashMap const. const.(mittel) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 7 HashMaps • Speichern Objekte (Klasse Object) in Struktur • Zuordnung eines (Such-)Schlüssel zu Objekt (Key-Value-Pair) • effizientes Suchen über Schlüssel (Key) • Key muss eindeutig sein (sonst wird letzter Eintrag mit identischem Key überschrieben) • Methoden: – – – – void put(Object Key, Object Value) Object get(Object Key) void clear() int size() //Einfügen //Suchen • Weitere Methoden: JavaDoc G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 8 Beispiel zu HashMap //Speicherung von Studenten in einer Struktur, in der //Studenten effizient nach Namen gesucht werden können import java.util.*; ..... HashMap h = new HashMap(); //Erzeugen von Schlüsseln und Einfügen h.put("Schmitz",new Student("Schmitz","Peter")); h.put("Meyer",new Student("Meyer","Thomas")); h.put("Schulz",new Student("Schulz","Bernd")); h.put("Bauer",new Student("Bauer","Bettina")); ..... Student s = (Student) h.get("Schulz"); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 9 Wrapper-Klassen • Keys einer HashMap: Unterklasse von Object • Problem: einfache Datentypen (int, long, double,...) sind keine Unterklassen von Object • Lösung: Wrapper-Klassen: "Verpacken" eines einfachen Datentyps in Klasse • Welche gibt es? – Klasse Integer: Bsp.: Integer i = new Integer(1234); – Klasse Double: Bsp.: Double d = new Double(1234.565); – ebenso für andere einfache Datentypen (char, boolean, ...) • Methoden der Wrapper-Klassen: JavaDoc G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 10 Beispiel 1 zu HashMaps mit Wrapper-Klassen import java.util.*; ..... HashMap h = new HashMap(); //Erzeugen von Schlüsseln und Einfügen h.put(new Integer(45678),new Student("Schmitz","Peter")); h.put(new Integer(76453),new Student("Meyer","Thomas")); h.put(new Integer(43234),new Student("Schulz","Bernd")); h.put(new Integer(56784),new Student("Bauer","Bettina")); ..... Student s = (Student) h.get(new Integer(76453)); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 11 Beispiel 2 zu HashMaps mit Wrapper-Klassen import java.util.*; ..... HashMap h = new HashMap(); //Erzeugen von Schlüsseln und Einfügen for(int matNr = 1 ; matNr < 100000 ; matNr = matNr + 1) { Student s = new Student("Schmitz","Peter",matNr); Integer key = new Integer(matNr); h.put(key, s); } //Suche: Student s = (Student) h.get(new Integer(76453)); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 12 Benutzeroberflächen: Bibliotheken Java-Klassenbibliotheken: • AWT (Abstract Window Toolkit) – historisch erste Java-Klassenbibliothek für Oberflächen – Aussehen abhängig vom Betriebssystem – Paket java.awt.* • Swing – Erweiterung des AWT – Aussehen unabhängig vom Betriebssystem – Paket javax.swing.* • Weitere – Java 2D /3D – Drag and Drop – .... G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 13 Erzeugen einer Anwendung ("Frame") G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 14 Ergebnis: Unterklasse von "Frame" Form G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 15 Einfügen eines "Button" 1. Klick 2. Klick G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 16 Einfügen eines Menüs 1. Klick 2. Klick G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 17 Ergänzen des Menüs um "MenueItems" G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 18 Ausführen des Programms G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 19 Verknüpfen von MenueItem mit Methode G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 20 Ergebnis: Methode zu MenueItem G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 21 Verknüpfen von Button mit Methode G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 22 Ergebnis: Methode zu Button (bei Mausklick) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 23 Übungsaufgabe • Programmiert eine Anwendung mit einem Button. Bei Klick auf diesen Button soll der Text "Hallo" ausgegeben werden. G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 24 Ändern des Layouts 1. Klick 2. Klick G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 25 Ausführen des Programms G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 26 Einfügen eines Textfeldes G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 27 Ausführen des Programms G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 28 Erzeugte Attribute G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 29 Literatur zu Forte • • • • Forte QuickStart Guide (PDF) Forte User Guide (PDF) Forte Tutorials Guide (PDF) zu finden auf der WWW-Seite dieser Veranstaltung G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 30 Anmerkung • bisher (ohne Frames): – Erzeugen einer Klasse mit Methode "main" – eigener Programmcode in "main" (oder in Methoden, die von "main" aus aufgerufen werden) • mit Frames: – Erzeugen einer Unterklasse von Frame (JFrame) – eigener Programmcode in Methode, die auf ButtonKlick/Menuewahl/sonst. Ereignis reagiert – eine "main" gibt es hier auch, ist aber für uns nicht relevant – zusätzlich wird eine Frame-Datei erzeugt G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 31 Eigenschaften: der Component Inspector G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 32 Methoden für Textfelder Methoden der Klasse java.awt.TextField: • String getText() • void setText(String) • weitere Methoden: Javadoc Beispiel: java.awt.TextField t; .................... String st = t.getText(); t.setText(st+st); G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 33 Übungsaufgabe • Schreibt eine Anwendung mit einem Button und zwei Textfeldern, so dass beim Klicken des Buttons der Text des einen Textfeldes im anderen Textfeld in Grossbuchstaben erscheint: • Hinweis: – die Methode toUpperCase() wandelt einen String in Grossbuchstaben um – Das Klicken auf einen Button löst den Event • Events - Mouse - MouseClicked aus G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 34 Weitere Methoden Methode der Klasse java.awt.Frame: • void setSize(int, int ) – z.B. setSize(500,500); • void setBackground(Color) – z.B. setBackground(java.awt.Color.magenta); Methoden der Klasse java.awt.Button: • void setLabel(String) • void setForeground(Color) • void setBackground(Color) • weitere Methoden: Javadoc G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 35 Umwandeln von String in Zahl • typische Anwendung: mit Eingabe in Textfeld soll gerechnet werden. • Methode: static int parseInt(String) der Klasse Integer • Beispiel: java.awt.TextField tf; ........ String s = tf.getText(); int i = Integer.parseInt(s); int j = 3*i + 8; • Vorsicht: Wenn im String keine "Zahl" steht, stürzt das Programm ab (Lösung: Ausnahmebehandlung, Exceptions) G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 36 Hausaufgabe • Programmiert eine Anwendung, die eine Temperatur von Celsius nach Fahrenheit und umgekehrt umrechnet. Die Ausgangstemperatur soll interaktiv eingegeben werden. Die Richtung der Berechnung soll über eine Checkbox eingestellt werden. Die Anwendung soll also so oder so ähnlich aussehen: • Hinweis: das Programm zur Temperaturumrechnung findet Ihr in Vorlesung 3 (Musterlösung zur Hausaufgabe) • Label (wie "Celsius") erzeugt mal mit • Eine Checkbox erzeugt man mit . Die Methode boolean getState() der Klasse Checkbox gibt an, ob ein Häkchen da ist (true) oder nicht (false). G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 02/03 37