Einführung in JAVA - Teil II – D R . P ETER M ERZ – Wilhelm-Schickard-Institut für Informatik Abteilung Rechnerarchitektur Eberhard-Karls-Universität Tübingen Inhalte der Vorlesung Einleitung 1 Java-I/O 3 Java Collections Framework 37 Graphische Benutzungsschnittstellen 52 Peter Merz Einführung in JAVA 2 Programmierung mit den Java-APIs Programmierung mit den Java-APIs: Die wichtigsten in Java 2 Development Kit enthaltenen API sind: • Java Core API : Wichtige grundlegende Klassen • Java I/O API : Ein- und Ausgabeströme • Java Collections API : Allgemeine Datenstrukturen • Java AWT Swing API : Graphische Benutzungsschnittstellen (GUI) – AWT: Abstract Windowing Toolkit – Swing: Neue API für GUI-Entwicklung Peter Merz Einführung in JAVA 3 Die Java I/O API Überblick über E/A (Ein-/Ausgabe-)Ströme: Im Daten einzulesen, öffnet ein Programm einen Strom auf einer Datenquelle und ließt die Daten sequentiell: Analog sendet ein Programm Daten zu einem externen Ziel, indem es einen Strom zum Ziel öffnet und die Daten sequentiell schreibt: Peter Merz Einführung in JAVA 4 Die Java I/O API E/A-Ströme: • Datenquelle/Ziel: Datei, Speicher, Socket (Netzwerkverbindung) • Algorithmus zum Lesen: open a stream while more information read information close the stream • Algorithmus zum Schreiben: open a stream while more information write information close the stream • Man unterscheidet Character Streams (Text) und Byte Streams (Binärdaten) Peter Merz Einführung in JAVA 5 Klassenhierarchie der E/A-Ströme Character Streams: • Reader bietet eine unvollständige Implementierung zum Lesen von 16-Bit Zeichenströmen • Einige Subklassen implementieren Ströme, die aus Datenquellen lesen (grau) • Andere implementieren Ströme, die aus anderen Strömen lesen und Daten verarbeiten (weiss) Peter Merz Einführung in JAVA 6 Klassenhierarchie der E/A-Ströme • Writer bietet eine unvollständige Implementierung zum Schreiben von 16-Bit Zeichenströmen • Einige Subklassen realisieren Ströme, die in Datensenken schreiben (grau) • Andere implementieren Ströme, die Daten verarbeiten und in andere Ströme schreiben (weiss) Peter Merz Einführung in JAVA 7 Klassenhierarchie der E/A-Ströme Byte Streams: Lesen • Zum Lesen von Binärdaten dienen Subklassen von InputStream • Einige Subklassen lesen aus Datenquellen (grau dargestellt) • Andere Subklassen verarbeiten Ströme (weiss dargestellt) Peter Merz Einführung in JAVA 8 Klassenhierarchie der E/A-Ströme Byte Streams : Schreiben • Zum Schreiben von Binärdaten dienen Subklassen von OutputStream • Einige Subklassen schreiben in Datensenken (grau dargestellt) • Andere Subklassen verarbeiten Ströme (weiss dargestellt) Peter Merz Einführung in JAVA 9 Klassenhierarchie der E/A-Ströme Aufbau der I/O Superklassen: Reader und InputStream definieren ähnliche APIs aber für unterschiedliche Datentypen: Reader sind definiert für Chars und Arrays von Chars: int read() int read(char cbuf[]) int read(char cbuf [], int offset , int length) InputStream sind definiert für Bytes und Arrays von Bytes: int read() int read(byte cbuf []) int read(byte cbuf [], int offset , int length) Peter Merz Einführung in JAVA 10 Klassenhierarchie der E/A-Ströme Writer und OutputStream sind ebenfalls ähnlich: Writer definiert Methoden für Chars und Arrays von Chars: int write ( int c) int write (char cbuf []) int write (char cbuf [], int offset , int length) OutputStream definiert Methoden für Bytes und Arrays von Bytes: int write ( int c) int write (byte cbuf []) int write (byte cbuf [], int offset , int length) Alle Streams werden automatisch geöffnet beim Erzeugen (mit new). Mit close kann ein Strom geschlossen werden – oder automatisch durch die Garbage Collection Peter Merz Einführung in JAVA 11 E/A-Ströme Die wichtigsten Streams: • Lesen und Schreiben von Dateien: FileReader, FileWriter, FileInputStream, FileOutputStream • Lesen und Schreiben in einen Speicherbereich (Array): CharArrayReader, CharArrayWriter, ByteArrayInputStream, ByteArrayOutputStream • Lesen und Schreiben primitiver Datentypen in einem maschinenunabhängigen Format: DataInputStream, DataOutputStream • Textausgabe (System.out.println()): PrintWriter, PrintStream • Puffern von Strömen: BufferedReader, BufferedWriter, BufferedInputStream, BufferedOutputStream • Konvertierung zwischen Character- und Byte-Strömen: InputStreamReader, OutputStreamWriter Peter Merz Einführung in JAVA 12 E/A-Ströme Beispiel Kopieren einer Text-Datei: import java.io .∗; public class Copy { public static void main(String [] args) throws IOException { String inputFileName = ”farrago. txt ” ; String outputFileName = ”outagain.txt”; FileReader in = new FileReader(inputFileName); FileWriter out = new FileWriter(outputFileName); int c; while ((c = in .read ()) != −1) out. write (c ); in .close (); out.close (); } } Peter Merz Einführung in JAVA 13 E/A-Ströme Beispiel zur Benutzung von Puffern: FileReader fileReader = new FileReader(”input1.txt” ), BufferedReader reader = new BufferedReader(fileReader); while ((c = reader.read ()) != −1) { ... } ... FileInputStream fileInputStream = new FileInputStream(”input2.txt” ), BufferedInputStream stream = new BufferedInputStream(fileInputStream); while ((c = stream.read()) != −1) { ... } ... Peter Merz Einführung in JAVA 14 E/A-Ströme Beispiel für das Speichern von Binärdaten: prices = new double[n]; units = new int[n]; desc = new String[n); ... DataOutputStream out = new DataOutputStream(new ByteArrayOutputStream()); for ( int i = 0; i < prices.length ; i ++) { out.writeDouble(prices[ i ]); out. writeInt ( units [ i ]); out.writeChars(descs[i ]); out.writeChar(’\n ’); } out.close (); ... Peter Merz Einführung in JAVA 15 E/A-Ströme Beispiel für das Speichern von Binärdaten: byte [] buffer = out.toByteArray(); DataInputStream in = new DataInputStream(new ByteArrayInputStream(buffer)); try { while (true) { double price = in.readDouble(); int unit = in . readInt (); String desc = ”” ; while ((chr = in .readChar () != ’\ n ’) { desc.append(chr); } System.out.println( ”Sie haben ” + unit + ” mal Artikel ” + desc + ” zum Preis von Euro”+ price + ” bestellt ” ); } } catch (EOFException e) { ... } in .close (); Peter Merz Einführung in JAVA 16 Serialisierung Objekt-Serialisierung: • Klassen zum Speichern-/Lesen von Objekten: ObjectInputStream, ObjectOutputStream • Es können nur Objekte serialisiert werden, die das Serializable Interface implementieren! Das Interface enthält keine Methoden! • Alle Attribute (Außer: transient, static) werden der Reihe nach gespeichert, Referenzen auf andere Objekte (rekursiv) traversiert. • Methoden: private void writeObject(java. io .ObjectOutputStream out) throws IOException private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; • Die writeObject Methode wirft eine NotSerializableException, wenn das übergebene Objekt nicht serialisierbar ist. Peter Merz Einführung in JAVA 17 Serialisierung Beispiel für Serialisierung: // Schreiben FileOutputStream out = new FileOutputStream(”theTime”); ObjectOutputStream s = new ObjectOutputStream(out); s.writeObject(”Today”); s.writeObject(new Date()); s. flush (); ... // Lesen FileInputStream in = new FileInputStream(”theTime”); ObjectInputStream s = new ObjectInputStream(in); String today = ( String)s.readObject(); Date date = (Date)s.readObject(); Peter Merz Einführung in JAVA 18 Erweiterte E/A-Operationen Weitere E/A-Klassen: File: Repräsentiert eine Datei im Dateisystems des Rechners. Informationen, wie Datei-Typ, Länge und Zugriffsrechte können erfragt werden. FileDescriptor: Repräsentiert einen File Handle bzw. File Descriptor, wird in den meisten Anwendungen nicht benötigt. RandomAccessFile: Im Gegensatz zu Readern/Streams erlaubt diese Klasse den wahlfreien Zugriff auf eine Datei. StreamTokenizer: Teilt den Inhalt eines Streams in Token (Worte, Symbole) ein. Wird zum Parsen von Text-Dateien verwendet. Die Package java.util.zip enthält weitere Streams, die eine Prüfsummenbildung oder das Komprimieren von Daten erlauben. Peter Merz Einführung in JAVA 19 Erweiterte E/A-Operationen RandomAccessFile: Erzeugung: /// Nur Lesen: new RandomAccessFile(”farrago.txt”, ”r”); /// Lesen und Schreiben: new RandomAccessFile(”farrago.txt”, ”rw”); Zusätzlich zu den normalen I/O-Operationen gibt es drei Methoden, die einen Lese-/Schreib-Zeiger verwenden: int skipBytes(int ) // Bewegt den Zeiger eine vorgegebene Anzahl Byte weiter void seek(long) // Bewegt den Zeiger an die angegebene Position long getFilePointer () // Liefert den Wert des Zeigers zurueck Peter Merz Einführung in JAVA 20 Erweiterte E/A-Operationen StreamTokenizer: class StreamTokenizer { /// Token Identifizierer public static final int TT NUMBER, TT WORD, TT EOF, TT EOL; // Token Werte public String sval ; public double nval; /// Construktor public StreamTokenizer(Reader r); /// parse naechsten Token, gebe Identifier zurueck public int nextToken(); ... }; Peter Merz Einführung in JAVA 21 Erweiterte E/A-Operationen Beispiel für StreamTokenizer: FileReader reader = new FileReader(”test.text” ); StreamTokenizer tokenizer = new StreamTokenizer(reader); int id = 0; while ( ( id = tokenizer .nextToken ()) != tokenizer .TT EOF) { switch(id) { case tokenizer.TT NUMBER: System.out.println( ”Found number: ” + tokenizer.nval); break; case tokenizer.TT WORD: System.out.println( ”Found text: ” + tokenizer . sval ); break; case tokenizer.TT EOL: System.out.println( ”Found End−Of−Line”); break; } } Peter Merz Einführung in JAVA 22 Erweiterte E/A-Operationen Package java.nio (ab Java 2 Version 1.4): Zusätzlich zu den bisher besprochenen I/O-Klassen kommen: • Buffers, die Datencontainer (für primitive Datentypen) darstellen • Charsets und ihre assoziierten Decoder und Encoder, welche zwischen Bytes und Unicode-Zeichen wandeln • Channels verschiedener Art, I/O-Operationen repräsentieren die Verbindungen zu Entitäten mit • Selectors, die Multiplexing und nicht-blockierende I/O erlauben (selectable channels) Erlauben sehr schelle I/O, z.B. durch Memory-mapped I/O (MappedByteBuffer). Peter Merz Einführung in JAVA 23 Die Java Core API Package java.lang: • Boolean, Integer, Double, Float, ...: Klassen zur Kapselung der primitiven Datentypen • Math: Mathematische Funktionen • System: Systemnahe Funktionen, u.a. Ein- und Ausgabe auf den Bildschirm (Konsole) mit System.out und System.err und zum Kopieren von Arrays (arraycopy) • String, StringBuffer: Klassen zur Behandlung von Zeichenketten, StringBuffer erlaubt schnelle Konkatenation von Strings • ... Peter Merz Einführung in JAVA 24 Die Java Core API Package java.util: Enthält Hilfsklassen und Datenstrukturen, wie • Random: Zufallszahlengenerator • Arrays: Hilfsklassen zum Füllen, Vergleichen, Durchsuchen und Sortieren von Arrays • LinkedList: Verkettete Liste zum Speichern von Objekten • Vector: Speichern von Objekten in einer Liste bzw. einem vergrößerbaren Array • ArrayList: Speichern von Objekten in einer Liste (vergrößerbares Array Implementierung) • HashTable: Implementierung einer Hash-Tabelle Peter Merz Einführung in JAVA 25 Die Java Core API Operationen auf Arrays: • Kopieren: // Quelldaten aus array src nach Array dst kopieren // src position , dst position geben die Startindizies an und length // die Anzahl der zu kopierenden Elemente System.arraycopy(src, src position , dst , dst position , length ); • Sortieren ,Füllen: Arrays.sort (array1 ); // Sortieren von array1 in aufsteigender Reihenfolge Arrays.sort (vec, a , b ); // Sortieren von Index a bis b−1 (vec[b] nicht ) Arrays. fill (y , 0); // Array y [] mit Nullen fuellen • Vergleichen: if ( Arrays.equals(arrays1, arrays2 )) { ... } Peter Merz Einführung in JAVA 26 Die Java Core API Datenstruktur Vector: public Vector(int initialCapacity); Erzeugt einen Vektor mit vorgegebener Länge public int size(); Liefert die aktuelle Anzahl Elemente public void addElement(Object element); Fügt ein Objekt dem Vektor hinzu public void clear(); Löscht alle Elemente public Object getElementAt(int index); Liefert das Objekt an Stelle index im Vektor public Object setElementAt(Object element, int index); Ersetzt das Objekt an Position index Peter Merz Einführung in JAVA 27 Die Java Core API public Object removeElementAt(int index); Löscht das Element an Position Index und liefert es zurück (alle folgenden werden um eins nach Vorne geschoben) public Object removeElement(Object o); Löscht das erste Element, das identisch zu o ist. Es verwendet zum Vergleich der Objekte die equals-Methode! public Enumeration elements(); Liefert eine ”Aufzählung” aller Elemente im Vektor. Dazu wird ein Objekt, welches das Interface Enumeration implementiert zurückgeliefert. Peter Merz Einführung in JAVA 28 Die Java Core API Beispiel Verwendung von Vector: vector = new Vector(100); String string1 = ”54657347”; String string2 = ”Hello World”; vector.addElement(string1); // Fuegt einen String hinzu vector.addElement(string2); // Fuegt einen String hinzu ... vector.removeElementAt(1); // Loescht Element an Position 1 for( int i = 0; i < vector. size (); i ++) { // Liefert einen String − Cast ist notwendig String str = ( String)vector.getElementAt(i); System.out.println( str ); } Peter Merz Einführung in JAVA 29 Die Java Core API Vector und Enumerations: • Das Interface Enumeration erlaubt eine alternative Verwendung eines Vectors public interface Enumeration { boolean hasMoreElements(); Object nextElement(); } • Beispiel: vector = new Vector(); ... for ( Enumeration e = vector.elements() ; e.hasMoreElements() ;) { System.out.println (e.nextElement()); } Peter Merz Einführung in JAVA 30 Die Java Core API Datenstruktur ArrayList: public ArrayList(int initialCapacity); Erzeugt einen Vektor mit vorgegebener Länge public void add(Object element); Fügt ein Objekt dem Vektor hinzu public Object get(int index); Liefert das Objekt an Stelle index im Vektor public Object set(int index, Object element); Ersetzt das Objekt an Position index public Object remove(int index); Löscht das Element an Position Index und liefert es zurück (alle folgenden werden um eins nach Vorne geschoben) public int size(); Liefert die aktuelle Anzahl Elemente Peter Merz Einführung in JAVA 31 Die Java Core API public void clear(); Löscht alle Elemente Unterschiede Vector und ArrayList: • Vector beinhaltet andere Methoden zum hinzufügen, löschen, etc. • Ab Version 1.2 haben Vector und ArrayList angepasste Methoden, d.h. Vector enthält get(), set(), remove(), ... • ArrayList verwendet keine Enumeration sondern Iteratoren (werden später erläutert) • Vector ist Thread-Safe, d.h. mehrere Threads (Programmstränge) können gleichzeitig mit einem Vector arbeiten Peter Merz Einführung in JAVA 32 Die Java Core API Beispiel Verwendung von ArrayList: arrayList = new ArrayList(); String string1 = ”54657347”; String string2 = ”Hello World”; arrayList .add(string1 ); // Fuegt einen String hinzu arrayList .add(string2 ); // Fuegt einen String hinzu ... arrayList .remove(1); // Loescht Element an Position 1 for( int i = 0; i < arrayList . size (); i ++) { // Liefert einen String − Cast ist notwendig String str = ( String) arrayList .get( i ); System.out.println( str ); } Peter Merz Einführung in JAVA 33 Die Java Core API Die Klasse Hashtable: Assoziativspeicher - speichert zu Objekte über Schlüssel public HashTable(int initialCapacity); Erzeugt eine Hashtabelle. Parameter kann weggelassen werden. public Object put(Object key, Object value); Fügt ein Objekt value unter dem Schlüssel key hinzu public Object get(Object key); Liefert ein Objekt mit dem Schlüssel key public Object remove(Object key); Entfernt ein Objekt mit dem Schlüssel key public int size(); Liefert die aktuelle Anzahl Elemente Peter Merz Einführung in JAVA 34 Die Java Core API public void clear(); Löscht alle Elemente public boolean containsValue(Object value); Liefert true, wenn value enthalten ist public boolean containsKey(Object key); Liefert true, wenn key enthalten ist public Enumeration elements(); Liefert alle Elemente (values) public Enumeration keys(); Liefert alle Schlüssel (keys) Peter Merz Einführung in JAVA 35 Die Java Core API Beispiel zu Hashtable: // Dieses Beispiel erzeugt eine Hashtabelle, die Integer−Zahlen speichert. // Als üSchlssel werden Strings verwendet. Hashtable numbers = new Hashtable(); numbers.put(”one”, new Integer(1)); numbers.put(”two”, new Integer(2)); numbers.put(”three”, new Integer(3)); // Um eine Zahl zu erhalten, verwendet man den folgenden Code: Integer n = ( Integer)numbers.get(”two”); // Cast nicht vergessen! if ( n != null ) { System.out.println( ”two = ” + n); } Peter Merz Einführung in JAVA 36 Die Java Collections API Java Collections Framework: Was sind Collections? • Eine Collection (Container) ist ein Objekt das andere Objekte zu einer Einheit zusammenfasst • Beispiele sind: – Poker-Hand ➠ Karten – Mail-Ordner ➠ E-Mails – Telefonbuch ➠ Zuordnungen von Namen zu Telefonnummern • Beispiele in Java: Vector, ArrayList, HashTable Peter Merz Einführung in JAVA 37 Die Java Collections API Was ist ein Collections Framework? Es stellt eine vereinheitlichte Architektur zur Repräsentation und Verwendung von Collections dar! Bestandteile: • Schnittstellen/Interfaces: Abstrakte Datentypen, die Collections darstellen. Ermöglichen die einheitliche Verwendung von Collections unabhängig von den Details ihrer Repräsentierung! • Implementierungen: Konkrete Implementierungen der Collection Interfaces durch unterschiedliche Datenstrukturen. • Algorithmen: Methoden, die häufige Berechnungen bzw. Operationen Collections ausführen. Diese Algorithmen sind polymorph, d.h. die selbe Methode kann für viele unterschiedliche Implementierungen verwendet werden. Peter Merz Einführung in JAVA 38 Die Java Collections API Vorteile des Collections Framework: ✓ Es reduziert Programmieraufwand! ✓ Es erhöht Programmgeschwindigkeit und Qualität! ✓ Es erlaubt die Interoperabilität von verschiedenen APIs! ✓ Es reduziert den Lernaufwand zur Verwendung neuer APIs! ✓ Es reduziert den Aufwand zur Entwicklung neuer APIs! ✓ Es fördert Wiederverwendung von Software! Peter Merz Einführung in JAVA 39 Die Java Collections API Interface-Hierarchie: • Collection: Basis-Interface • Set: Eine Collection, die keine doppelten Elemente enthält • List: Eine geordnete Collection (Sequenz) • Map: Eine Zuordnung von Schlüssel zu Werten, jeder Schlüssel kann nur einmal vorkommen • SortedSet: Set mit Elementen in aufsteigender Reihenfolge • SortedMap: Map mit Schlüsseln in aufsteigender Reihenfolge Sortieren erfolgt durch Comparable, Comparator-Interfaces Peter Merz Einführung in JAVA 40 Die Java Collections API Definition von Collection: public interface Collection { // Basic Operations int size (); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); // Optional boolean remove(Object element); // Optional Iterator iterator (); // Bulk Operations boolean containsAll(Collection c ); boolean addAll(Collection c ); // boolean removeAll(Collection c); // boolean retainAll(Collection c ); // void clear (); // Optional Optional Optional Optional // Array Operations Object [] toArray (); Object [] toArray(Object a []); } Peter Merz Einführung in JAVA 41 Die Java Collections API Definition von Set: public interface Set extends Collection { // Basic Operations int size (); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); // Optional boolean remove(Object element); // Optional Iterator iterator (); // Bulk Operations boolean containsAll(Collection c ); boolean addAll(Collection c ); // boolean removeAll(Collection c); // boolean retainAll(Collection c ); // void clear (); // Optional Optional Optional Optional // Array Operations Object [] toArray (); Object [] toArray(Object a []); } Peter Merz Einführung in JAVA 42 Die Java Collections API Definition von List: public interface List extends Collection { // Positional Access Object get(int index); Object set( int index , Object element); void add(int index , Object element); Object remove(int index); abstract boolean addAll(int index, Collection c ); // // // // Optional Optional Optional Optional // Search int indexOf(Object o); int lastIndexOf(Object o); // Iteration ListIterator ListIterator listIterator (); listIterator ( int index); // Range−view List subList( int from, int to ); } Peter Merz Einführung in JAVA 43 Die Java Collections API Definition von Map: public interface Map { // Basic Operations Object put(Object key, Object value); Object get(Object key); Object remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); int size (); boolean isEmpty(); // Bulk Operations void putAll (Map t); void clear (); // Collection Views public Set keySet(); public Collection values (); public Set entrySet (); } Peter Merz Einführung in JAVA 44 Die Java Collections API Iteratoren: Iteratoren sind ähnlich wie Enumeratoren. Das Interface Iterator ist wie folgt definiert: public interface Iterator { boolean hasNext(); Object next (); void remove(); // Optional } Verwendungsbeispiel: Löschen von Elementen einer Collection für die eine Bedingung cond erfüllt ist: static void filter ( Collection c) { for ( Iterator i = c. iterator (); i .hasNext (); ) if (! cond(i.next ())) i .remove(); } Peter Merz Einführung in JAVA 45 Die Java Collections API Implementierungen im Überblick: Implementierung Hash-Tabelle Set Interfaces HashSet List Map Array Baum Verkettete Liste TreeSet ArrayList HashMap LinkedList TreeMap Sortierte Datenstrukturen: • TreeMap : Implementiert Interface SortedMap • TreeSet : Implementiert Interface SortedSet Peter Merz Einführung in JAVA 46 Die Java Collections API Algorithmen: Fast alle Algorithmen sind statische Methoden in der Klasse Collections (Parameter in eckigen Klammern sind optional): • Sortieren: static void sort( List list [, Comparator c]) • Binäre Suche: static int binarySearch(List list , Object key [, Comparator c]) • Minimum und Maximum bestimmen: static Object min(Collection collection [, Comparator comp]) static Object max(Collection collection [, Comparator comp]) Peter Merz Einführung in JAVA 47 Die Java Collections API Algorithmen, fortgesetzt: • Füllen und Kopieren: static void fill ( List list , Object o) static void copy(List dest , List src) • Reihenfolgen umdrehen und zufällig vertauschen: static void reverse(List list ) static void shuffle ( List list ) Anmerkungen: ✗ Fast alle Algorithmen arbeiten auf Listen! ✗ Sets und Maps können in Listen konvertiert werden! ✗ Zusätzlich existieren für Sets und Maps sortierte Varianten! Peter Merz Einführung in JAVA 48 Die Java Collections API Sortieren von Objekten: Zu sortierende Objekte müssen das Comparable Interface implementieren: public interface Comparable { public int compareTo(Object o); } Rückgabewert von obj1.compareTo(obj2): -1 : obj1 ist kleiner als obj2 0 : beide Objekte sind gleich 1 : obj1 ist größer als obj2 Die Klassen String, Integer, Double, Float, ... sind bereits ”Comparable”, ebenso Date, File und einige andere! Peter Merz Einführung in JAVA 49 Die Java Collections API Sortieren von Objekten mit Comparator: In einigen Fällen kann es sinnvoll sein, einen Comparator zu verwenden: public interface Comparator { int compare(Object obj1, Object obj2); } Rückgabewert von compare(obj1, obj2): -1 : obj1 ist kleiner als obj2 0 : beide Objekte sind gleich 1 : obj1 ist größer als obj2 Anmerkung: Die zu sortierenden Objekte müssen nicht ”Comparable” sein! Peter Merz Einführung in JAVA 50 Die Java Collections API Konvertierung von Datentypen: • List, Set ➠ Array: toArray()-Methoden in List und Set. • List ➠ Set und umgekehrt: addAll(Collection c)-Methoden in List und Set, oder über Konstruktoren. • Map ➠ Collection: keySet()-Methode liefert Schlüssel-Objekte als Set. values()-Methode liefert Wert-Objekte als Collection. Peter Merz Einführung in JAVA 51 Die Java Swing API Graphische Benutzungsschnittstellen (GUI): Ziele: Vereinfachte Benutzung von Programmen • Verwendung von Zeigergeräten oder anderen Eingabehilfen (Mäuse, Lichtstifte, ...) • Fenstertechnik zur übersichtlichen Darstellung • Darstellung mehrerer Sichten und Programme gleichzeitig • Darstellung von (bewegten) Bildern Wichtige Konzepte: • Nebenander oder übereinander angeordnete Fenster • Maus erlaubt neben Tastatur zielgerichtete Steuerung bzw. Bedienung Peter Merz Einführung in JAVA 52 Die Java Swing API Wichtige Merkmale von graphischen Benutzungsschnittstellen: • Fenstermanagement: Minimierung, Maximierung, Verschieben, Vergrößern, Verkleinern • Eingabe erfolgt über standardisierte Bedienelemente • Darstellungsformen sind Text, Vektorgrafik oder Bilder (Rastergrafik) Wichtige Merkmale von GUI-Programmen: • Programmabläufe sind ereignisgesteuert statt ”top–down” • Hoher Grad an Wiederverwendung von Programmcode durch einheitliche Benutzungsschnittstellen ➠ GUI-API Peter Merz Einführung in JAVA 53 Die Java Swing API Java Swing API: Offizieller Name: Java Foundation Classes (JFC) Bestandteile: Swing Komponenten: Bedienelemente für GUI-Programme Look and Feel: Veränder- und erweiterbares Aussehen der Bedienelemente Accessibility API: Zugriff auf Eingabegeräte wie Blindenschriftleser Java 2D API (Java 2): Erweiterte Darstellungsformen von 2-dimensionaler Grafik Drag and Drop Support (Java 2) : Datenaustausch zwischen Programmen Swing basiert auf dem Abstract Windowing Toolkit (AWT). Peter Merz Einführung in JAVA 54 Die Java Swing API Visueller Überblick über die Swing-Komponenten: Man unterscheidet: • Bedienelemente - Controls – Standardelemente – Editierbare Elemente – Nichteditierbare Elemente • Container – ”Top Level” Container – Allgemeine Container – Spezielle Container Peter Merz Einführung in JAVA 55 Die Java Swing API Standard-Bedienelemente: Buttons JCombobox JList Menus JSlider JTextField – Buttons: JButton, JCheckButton, JRadioButton – Menus: JMenu, JMenuBar, JMenuItem Peter Merz Einführung in JAVA 56 Die Java Swing API Standard-Bedienelemente, fortgesetzt: JToolBar – JToolBar: Es können Buttons hinzugefügt werden Nichteditierbare Informationsdarstellung: JLabel Peter Merz JProgressBar JToolTip Einführung in JAVA 57 Die Java Swing API Editierbare (formatierte) Informationsdarstellung: JColorChooser JTable Peter Merz JFileChooser JTextArea JTree Einführung in JAVA 58 Die Java Swing API ”Top Level” Container: Applet JDialog JFrame Diese Container können nicht in andere eingefügt werden, da sie äußere Rahmen (Fenster) darstellen. • Applet: unsichtbares Fenster/Rahmen in einer Webseite • JDialog: Eingabefenster (Benutzerdialog) • JFrame: Beliebiges Fenster Peter Merz Einführung in JAVA 59 Die Java Swing API Allgemeine Container: JPanel JScrollPane JSplitPane JTabbedPane Diese Container erlauben das Einfügen beliebiger Bedienelemente oder Container. • JPanel: Container, der einen Rahmen um seinen Inhalt zeichnet • JScrollPane: Container, der seinen Inhalt scrollt • JSplitPane: Container, der zwei Komponenten von einander trennt • JTappedPane: Karteikarten-Container Peter Merz Einführung in JAVA 60 Die Java Swing API Spezielle Container: JInternalFrame JLayeredPane JRootPane • JInternalFrame: Neues Fenster in einem bestehenden Fenster • JLayeredPane: Einfügen von Ebenen, Controls können so übereinander liegen • JRootPane: Innere Komponente eines Top-Level Containers Peter Merz Einführung in JAVA 61 Die Java Swing API Ein einfaches Swing Programm: import javax.swing.∗; import java.awt.Container; public class SwingExample1 { public static void main(String [] args) { JFrame frame = new JFrame(”SwingExample1”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JLabel label = new JLabel(”Hello World”); // Erzeugt ein neues Label contentPane.add(label); // Fuegt label dem Frame hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 62 Die Java Swing API Ein einfaches Swing Programm, Schritt für Schritt: Erzeugen eines Fensters mit einem Titel und speichern der ContentPane des Fensters: JFrame frame = new JFrame(”SwingExample1”); Container contentPane = frame.getContentPane(); Erzeugen einer Control (Bedienungselement) und Hinzufügen zum Fenster (ContentPane des Fensters): JLabel label = new JLabel(”Hello World”); contentPane.add(label); Fensterinhalt anordnen (pack) und darstellen: frame.pack(); frame.setVisible (true ); Peter Merz Einführung in JAVA 63 Die Java Swing API Programmende: Was passiert bei Schließen des Fensters? Das wird durch folgende Anweisung festgelegt: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); Wichtig: Obwohl nach frame.setVisible(true); die main-Methode beendet wird, ist das Programm noch nicht beendet! Programmabbruch geschieht explizit durch den Benutzer. Peter Merz Einführung in JAVA 64 Die Java Swing API Programmablauf eines GUI-Programms: 1) Erzeugung von Fenster(n) 2) Hinzufügen von Controls zu Fenster(n) 3) Festlegen der Aktionen für die möglichen Ereignisse (Benutzereingaben) 4) Anordnen und Darstellen der Controls bzw. Fenster (Layout) 5) Warten auf und Verarbeiten von Benutzereingaben (Events) – Erfolgt automatisch Ereignisgesteuerte Programmierung: Festlegen von Aktionen für Ereignisse Peter Merz Einführung in JAVA 65 Die Java Swing API Events und Listener: Aktionen werden in Swing über Listener ausgeführt: Bei Drücken eines Buttons wird ein ActionEvent ausgelößt ➠ zugehöriger ActionListener wird benachrichtigt: public interface ActionListener extends EventListener { public void actionPerformed(ActionEvent e); } Festlegen des ActionListeners mit: button.addActionListener(object); Peter Merz Einführung in JAVA 66 Die Java Swing API Beispiel ActionListener: import javax.swing.∗; import java.awt.Container; import java.awt.event.∗; public class SwingExample2 implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println( ”Button pressed”); } public static void main(String [] args) { JFrame frame = new JFrame(”SwingExample2”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JButton button = new JButton(”Click Me”); // Erzeugt einen neuen Button button.addActionListener(new SwingExample2()); // Listener! contentPane.add(button); // Fuegt button dem Frame hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 67 Die Java Swing API Übersicht Events und Listener: Vorgang der Event auslöst Listener-Typ Benutzer klickt auf einen Button, drückt Return während er in ein TextField eingibt, oder wählt einen Menüpunkt aus ActionListener Benutzer schließt ein Fenster WindowListener Benutzer drückt eine Maustaste während der Cursor über einer Komponente ist MouseListener Benutzer bewegt die Maus über eine Komponente MouseMotionListener Komponente wird sichtbar ComponentListener Komponente bekommt den Tastatur-Fokus FocusListener Tabellen- oder Listenauswahl ändert sich ListSelectionListener Peter Merz Einführung in JAVA 68 Die Java Swing API Layout von Komponenten: Wie lassen sich Komponenten innerhalb von Containern anordnen? • Statisch: Position und Größe müssen manuell vorgegeben werden Nachteile: – Programmierer muss Position selbst berechnen und Sorge tragen, dass die gewählte Größe ausreicht, um Inhalte darzustellen – Fontgrößenänderungen sind nicht ohne weiteres möglich – Vergrößern und Verkleinern von Fenstern nicht möglich/sinnvoll • Dynamisch: LayoutManager bestimmen Position und Größe Vorteile: – Komponenten verwenden nur soviel Platz, wie sie tatsächlich benötigen – Programmierer braucht keine Berechnungen zu machen – Fontgrößenänderungen, Vergrößern und Verkleinern von Fenstern möglich Peter Merz Einführung in JAVA 69 Die Java Swing API BorderLayout: Verwendung: container.setLayout(new BorderLayout()); container.add(new JButton(”Button 1 (NORTH)”), BorderLayout.NORTH); container.add(new JButton(”2 (CENTER)”), BorderLayout.CENTER); container.add(new JButton(”Button 3 (WEST)”), BorderLayout.WEST); container.add(new JButton(”Long−Named Button 4 (SOUTH)”), BorderLayout.SOUTH); container.add(new JButton(”Button 5 (EAST)”), BorderLayout.EAST); Peter Merz Einführung in JAVA 70 Die Java Swing API Eigenschaften von BorderLayout: • Es gibt ein zentrales Feld und vier Ränder • Beim Vergrößern wird dem Center der zusätzliche Platz zugefügt, alle anderen Felder bleiben unberührt. • Es müssen nicht alle 5 Felder verwendet werden - eins reicht! • BorderLayout ist das voreingestellte Layout für alle Top-Level-Container! • Mit BorderLayout(int horizontalGap, int verticalGap) void setHgap(int) void setVgap(int) läßt sich Zwischenraum zwischen den Komponenten definieren. Peter Merz Einführung in JAVA 71 Die Java Swing API BoxLayout: Verwendung: container.setLayout(new BoxLayout(container, BoxLayout.Y AXIS)); container.add(new JCenteredButton(”Button 1”)); container.add(new JCenteredButton(”2”)); container.add(new JCenteredButton(”Button 3”)); container.add(new JCenteredButton(”Long−Named Button 4”)); container.add(new JCenteredButton(”Button 5”)); Peter Merz Einführung in JAVA 72 Die Java Swing API Eigenschaften von BoxLayout: • Elemente werden entweder horizontal (BoxLayout.Y AXIS) oder vertikal (BoxLayout.X AXIS) angeordnet. • Im Gegensatz zu anderen LayoutManagern wird das X/Y-Alignment und die Maximale Größe einer Komponente berücksichtigt. • Unsichtbare Füller können eingefügt werden: – Box.createRigidArea(size): Zwischenraum mit fester Größe – Box.createVerticalGlue(), Box.createHorizontalGlue(): Zwischenraum variabler Größe – new Box.Filler(minSize, prefSize, maxSize): Wählbarer Zwischenraum mit minimaler, gewünschter und Maximaler Größe. Peter Merz Einführung in JAVA 73 Die Java Swing API FlowLayout: Verwendung: container.setLayout(new FlowLayout()); container.add(new JButton(”Button 1”)); container.add(new JButton(”2”)); container.add(new JButton(”Button 3”)); container.add(new JButton(”Long−Named Button 4”)); container.add(new JButton(”Button 5”)); Peter Merz Einführung in JAVA 74 Die Java Swing API Eigenschaften von FlowLayout: • Elemente werden in einer Reihe dargestellt in ihrer gewünschten Größe (getPreferedSize()). • Wenn der horizontale Platz nicht ausreicht, wird eine neue Reihe hinzugefügt • in Jeder Reihe sind die Elemente zentriert (FlowLayout.CENTER), linksbündig (FlowLayout.LEFT) oder rechtsbündig (FlowLayout.RIGHT) angeordnet: FlowLayout(int alignment, int horizontalGap, int verticalGap) void setAlignment(int alignment) void setHgap(int horizontalGap) void setVgap(int verticalGap) Peter Merz Einführung in JAVA 75 Die Java Swing API GridLayout: Verwendung: container.setLayout(new GridLayout(0,2)); container.add(new JButton(”Button 1”)); container.add(new JButton(”2”)); container.add(new JButton(”Button 3”)); container.add(new JButton(”Long−Named Button 4”)); container.add(new JButton(”Button 5”)); Peter Merz Einführung in JAVA 76 Die Java Swing API Eigenschaften von GridLayout: • Elemente werden Zellen eines Gitternetzes platziert. • Die Zahl der Reihen und Spalten wird durch den Konstruktor vorgegeben: • Ebenfalls können Zwischenräume definiert werden. public GridLayout(int rows, int columns) public GridLayout(int rows, int columns, int horizontalGap, int verticalGap) void setRows(int rows) void setColumns(int columns) void setHgap(int horizontalGap) void setVgap(int verticalGap) Peter Merz Einführung in JAVA 77 Die Java Swing API GridBagLayout: Verwendung: GridBagLayout gridBagLayout = new GridBagLayout(); GridBagConstraints contraints = new GridBagConstraints(); container.setLayout(gridBagLayout); button = new JButton(”Button 1”); // Set Contraints gridBagLayout.setConstraints(button, constraints ); container.add(button ); ... Peter Merz Einführung in JAVA 78 Die Java Swing API Eigenschaften von GridBagLayout: • Elemente werden in Zellen eines Gitternetzes platziert, können aber über mehrere Zeilen oder Spalten gehen. • Zeilen müssen nicht alle die selbe Höhe haben, Spalten nicht die selbe Breite • GridBagConstraints legen fest auf wieviele Zellen sich eine Komponente verteilt: Peter Merz Einführung in JAVA 79 Die Java Swing API CardLayout: Verwendung: cardLayout = new CardLayout(); cards = new JPanel(); cards.setLayout(cardLayout); JPanel p1 = new JPanel(); p1.add(new JButton(”Button 1”)); p1.add(new JButton(”Button 2”)); p1.add(new JButton(”Button 3”)); JPanel p2 = new JPanel(); Peter Merz Einführung in JAVA 80 Die Java Swing API p2.add(new JTextField(”TextField” , 20)); cards.add(p1, ”ButtonPanel”); cards.add(p2, ”TextPanel”); cardLayout.show(”ButtonPanel”); container.add(cards, BorderLayout.CENTER); Eigenschaften von CardLayout: • Zwei oder mehrere Komponenten teilen sich den Platz zur Darstellung • Welche Komponente angezeigt wird, läßt sich wählen (show()-Methode) • Ähnlich zu TabbedPane Peter Merz Einführung in JAVA 81 Die Java Swing API Vollständiges Beispiel zur Verwendung von BoxLayout: Die Klasse JCenteredButton ist in Swing nicht definiert und muß daher selbst definiert werden. Sie wird dazu von JButton abgeleitet: import java.awt.∗; import java.awt.event.∗; import javax.swing.∗; class JCenteredButton extends JButton { public JCenteredButton(String text) { super(text); setAlignmentX(Component.CENTER ALIGNMENT); } } Peter Merz Einführung in JAVA 82 Die Java Swing API public class BoxWindow extends JFrame { public BoxWindow() { Container contentPane = getContentPane(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y AXIS)); // Hinzufuegen der Buttons contentPane.add(new JCenteredButton(”Button 1”)); contentPane.add(new JCenteredButton(”2”)); contentPane.add(new JCenteredButton(”Button 3”)); contentPane.add(new JCenteredButton(”Long−Named Button 4”)); contentPane.add(new JCenteredButton(”Button 5”)); } public static void main(String [] args) { BoxWindow frame = new BoxWindow(); // Erzeugt ein Fenster // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 83 Die Java Swing API Verwendung von JFrame: Wichtige Methoden: Erzeugt ein Fenster mit Titel (Constructor) Setzt Operation bei Schließen des Fensters durch den Benuter Container getContentPane() Liefert den Container für den Fensterinhalt setJMenuBar(JMenuBar menuBar) Fügt ein Menü dem Fenster hinzu JFrame(String title) setDefaultCloseOperation(int) • Mögliche Parameter für DefaultCloseOperation: DO NOTHING ON CLOSE, HIDE ON CLOSE (default), DISPOSE ON CLOSE • Zu jeder set-Methode gibt es auch eine get-Methode! • Zur prinzipiellen Verwendung siehe vorhergehende Beispiele! Peter Merz Einführung in JAVA 84 Die Java Swing API Verwendung von JDialog: Wichtige Methoden: JDialog(JFrame parent, boolean modal) Erzeugt einen modalen oder nicht-modalen Container getContentPane() show() hide() setTitle(String) setModal(boolean) Dialog Liefert den Container für den Fensterinhalt Zeigt den Dialog an Macht den Dialog unsichtbar Setzt den Dialogtitel Wählt modalen oder nicht-modalen Dialog • JDialog ist ähnlich zu JFrame, wird bei Benutzereingaben verwendet • Ein Dialog wird immer einem Hauptfenster zugeordnet • Modaler Dialog: Eingabe nur in diesem Fenster/Dialog möglich, show()-Methode wird beendet, wenn Fenster geschlossen wird (hide()) Peter Merz Einführung in JAVA 85 Die Java Swing API Verwendung von JLabel: Wichtige Methoden: JLabel(String text) JLabel(String text, Icon icon) setText(String) setIcon(Icon) Erzeugt ein Label mit Text Erzeugt ein Label mit Text und Icon Setzt den Text des Label Setzt das Icon des Label • Zu jeder set-Methode gibt es auch eine get-Methode! Peter Merz Einführung in JAVA 86 Die Java Swing API Verwendung von JButton: Wichtige Methoden: Erzeugt ein Button mit Text Erzeugt ein Button mit Text und Icon Setzt den Text des Button Setzt das Icon des Button Setzt die Taste, mit der der Button gedrückt werden kann setActionCommand(String) Setzt den Namen der Aktion, die ausgelöst werden kann addActionListener(ActionListener) Fügt einen ActionListener hinzu removeActionListener() Entfernt einen ActionListener JButton(String text) JButton(String text, Icon icon) setText(String) setIcon(Icon) setMnemonic(int) • Zu jeder set-Methode gibt es auch eine get-Methode! Peter Merz Einführung in JAVA 87 Die Java Swing API import javax.swing.∗; import java.awt.∗; import java.awt.event.∗; public class ButtonExample implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println( ”Button pressed, Action: ” + e.getActionCommand()); } public static void main(String [] args) { ButtonExample buttonExample = new ButtonExample(); JFrame frame = new JFrame(”SwingExample2”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JButton button = new JButton(”Begin”); // Erzeugt einen neuen Button button.addActionListener(buttonExample); // Listener! button.setMnemonic(KeyEvent.VK B); button.setActionCommand(”start”); contentPane.add(button, BorderLayout.CENTER); // Fuegt button hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 88 Die Java Swing API Verwendung von JCheckBox: Wichtige Methoden: JCheckBox(String, boolean) JCheckBox(String, Icon, boolean) addItemListener(ItemListener) ItemListener removeItemListener() Erzeugt eine Checkbox mit Text Erzeugt eine Checkbox mit Text und Icon Fügt einen ActionListener hinzu Fügt einen ActionListener hinzu • Die zuvor beschriebenen Methoden des Buttons stehen ebenfalls zur Verfügung. • Zwei mögliche Events: ItemEvent und ActionEvent • Der ItemListener ist dem ActionListener vorzuziehen, da man leicht den Status der Checkbox abfragen kann Peter Merz Einführung in JAVA 89 Die Java Swing API import javax.swing.∗; import java.awt.∗; import java.awt.event.∗; public class CheckBoxExample implements ItemListener { public void itemStateChanged(ItemEvent e) { if ( e.getStateChange() == ItemEvent.DESELECTED) System.out.println( ”CheckBox ist deaktiviert” ); else System.out.println( ”CheckBox ist aktiviert” ); } public static void main(String [] args) { JFrame frame = new JFrame(”SwingExample2”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JCheckBox checkBox = new JCheckBox(”Beispiel Checkbox”); checkBox.addItemListener(new CheckBoxExample()); // Listener! contentPane.add(checkBox); // Fuegt button hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 90 Die Java Swing API Verwendung von JRadioButton und ButtonGroup: Wichtige Methoden: JRadioButton(String, boolean) Erzeugt einen RadioButton mit Text JRadioButton(String, Icon, boolean) Erzeugt einen RadioButton mit Text und Icon ButtonGroup() add(AbstractButton) remove(AbstractButton) Erzeugt ButtonGroup-Instanz Zufügen eines (Radio)Button zur ButtonGroup Entfernen eines Button aus der ButtonGroup • Die zuvor beschriebenen Methoden des Buttons stehen ebenfalls zur Verfügung. • Die ButtonGroup stellt sicher, das immer genau ein RadioButton aktiv ist • ActionListener werden verwendet, um zu ermitteln welcher Button aktiviert wurde. Peter Merz Einführung in JAVA 91 Die Java Swing API public class RadioButtonExample implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println( ”Button pressed, Action: ” + e.getActionCommand()); } public static void main(String [] args) { RadioButtonExample buttonExample = new RadioButtonExample(); JFrame frame = new JFrame(”Transportmittel”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); ButtonGroup buttonGroup = new ButtonGroup(); JRadioButton button = new JRadioButton(”Auto”, true); button.addActionListener(buttonExample); // Listener! button.setActionCommand(”auto”); buttonGroup.add(button); contentPane.add(button, BorderLayout.NORTH); // Fuegt button hinzu button = new JRadioButton(”Zug”); button.addActionListener(buttonExample); // Listener! button.setActionCommand(”zug”); buttonGroup.add(button); contentPane.add(button, BorderLayout.SOUTH); // Fuegt button hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 92 Die Java Swing API Verwendung von JComboBox: Wichtige Methoden: JComboBox(Object[]) void addItem(Object) void insertItemAt(Object, int) Object getItemAt(int) Object getSelectedItem() void removeAllItems() void removeItemAt(int) void removeItem(Object) int getItemCount() Erzeugt eine Combobox Fügt einen Eintrag hinzu Fügt einen Eintrag an einer bestimmten Stelle hinzu Liefert einen Eintrag an einer bestimmten Position Liefert einen selektierten Eintrag Entfernt Einträge Liefert Anzahl der Einträge • Mit ActionListener’n kann die Auswahl bestimmt werden. Peter Merz Einführung in JAVA 93 Die Java Swing API import javax.swing.∗; import java.awt.∗; import java.awt.event.∗; public class ComboBoxExample implements ActionListener { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String selected = ( String)cb.getSelectedItem(); System.out.println( ”ComboBox Auswahl: ” + selected); } public static void main(String [] args) { JFrame frame = new JFrame(”SwingExample2”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); String [] liste = { ”Rot” , ”Gelb”, ”Blau” , ”Schwarz”}; JComboBox comboBox = new JComboBox(liste); comboBox.addActionListener(new ComboBoxExample()); // Listener! contentPane.add(comboBox, BorderLayout.CENTER); // Fuegt button hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 94 Die Java Swing API Verwendung von JList: Wichtige Methoden: JList() JList(Object[]) void setListData(Object[]) void setListData(Vector) addListSelectionListener(ListSelectionListener) int getSelectedIndex() int[] getSelectedIndices() Object getSelectedValue() Object[] getSelectedValues() int getSelectionMode() Erzeugt eine List Erzeugt eine List Liste mit Objekten füllen Liste mit Objekten füllen fügt Listener hinzu Liefert den Index des selektierten Objektes Liefert die Indices der selektierten Objekte Liefert das selektierte Objekt Liefert die selektierten Objekte Liefert den Selektionsmodus: SINGLE SELECTION, SINGLE INTERVAL SELECTION, MULTIPLE INTERVAL SELECTION Peter Merz Einführung in JAVA 95 Die Java Swing API public class ListExample implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { if ( e.getValueIsAdjusting ()) return; JList list = ( JList )e.getSource(); if (! list .isSelectionEmpty()) { String selected = ( String) list .getSelectedValue(); System.out.println( ” List Auswahl: ” + selected); } } public static void main(String [] args) { JFrame frame = new JFrame(”SwingExample2”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); String [] liste = { ”Rot” , ”Gelb”, ”Blau” , ”Schwarz”}; JList list = new JList( liste ); list .setSelectionMode(ListSelectionModel.SINGLE SELECTION); list .addListSelectionListener(new ListExample()); // Listener ! contentPane.add(list , BorderLayout.CENTER); // Fuegt button hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 96 Die Java Swing API Verwendung von JSlider: Wichtige Methoden: JSlider() Erzeugt ein JSlider-Objekt JSlider(int min, int max, int value) Erzeugt ein Slider mit setValue(int) setMinimum(int) setMaximum(int) setPaintTicks(boolean) setMajorTickSpacing(int) setMinorTickSpacing(int) setPaintLabels(boolean) vorgegebenem Wertebereich und einer Voreinstellung (value) Setzt den Wert (Position) des Sliders Setzt Minimal-Wert Setzt Maxima-Wert Aktiviert das Zeichnen von Markierungen Abstand der Hauptmarkierungen Abstand der Untermarkierungen Aktiviert das Zeichnen von Beschriftungen • Zu jeder set-Methode gibt es auch eine get-Methode! • ChangeListener für das Überprüfen einer Änderung Peter Merz Einführung in JAVA 97 Die Java Swing API public class SliderExample implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider slider = ( JSlider )e.getSource(); if (! slider .getValueIsAdjusting ()) { int value = slider .getValue(); System.out.println( ” Slider−Wert: ” + value); } } public static void main(String [] args) { JFrame frame = new JFrame(”SwingExample2”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JSlider slider = new JSlider(0, 100); slider .setMajorTickSpacing(20); slider .setMinorTickSpacing(10); slider .setPaintTicks(true); slider .setPaintLabels(true); slider .addChangeListener(new SliderExample()); // Listener! contentPane.add(slider, BorderLayout.CENTER); // Fuegt button hinzu // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 98 Die Java Swing API Verwendung von JTextField: Wichtige Methoden: Erzeugt ein leeres TextField Erzeugt ein leeres TextField mit Inhalt Erzeugt ein leeres TextField mit Inhalt und vorgegebener Spaltenanzahl setText(String) Setzt den Text im TextField setEditable(boolean) Aktiviert die Editierbarkeit des TextFeldes setColumns(int) Legt Anzahl der Spalten fest setHorizontalAlignment(int) Wählt horizontales Aligmnent addActionListener(ActionListener) Fügt ActionListener hinzu removeActionListener(ActionListener) Entfernt ActionListener JTextField() JTextField(String) JTextField(String, int) • Zu jeder get-Methode gibt es eine set-Methode Peter Merz Einführung in JAVA 99 Die Java Swing API public class TextFieldExample implements ActionListener { public void actionPerformed(ActionEvent e) { if ( e.getActionCommand().equals(”text”)) { JTextField textField = ( JTextField)e.getSource(); System.out.println( ” TextField : ” + textField .getText ()); textField . selectAll (); } } public static void main(String [] args) { JFrame frame = new JFrame(”TextFieldExample”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JTextField textField = new JTextField(”irgendein text” , 30); textField .addActionListener(new TextFieldExample()); // Listener! textField .setActionCommand(”text”); contentPane.add(textField, BorderLayout.CENTER); // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 100 Die Java Swing API Weitere Möglichkeiten der Texteingabe/Ausgabe: • JPasswordField: Wie JTextField, nur werden die eingegebenen Zeichen als ’∗’ ausgegeben! • JTextArea: Erlaubt Darstellung von mehrzeiligem Text! • JTextPane: Erlaubt Darstellung von mehrzeiligem Text in unterschiedlichen Fonts/Farben! Peter Merz Einführung in JAVA 101 Die Java Swing API Verwendung von Menus: Wichtige Methoden aus den Klassen JFrame, JMenuBar, JMenu: JFrame.setJMenuBar(JMenuBar) JMenuBar.add(Menu) JMenu.add(JMenuItem) JMenu.addSeparator() Setzt einen MenuBar für das Frame Fügt ein Menu dem MenuBar hinzu Fügt einen Eintrag einen Menu hinzu Fügt eine Trennungslinie dem Menu hinzu JMenuItem() JCheckBoxMenuItem() JRadioButtonMenuItem() Ein einfacher Menüeintrag Die Menü-Version der JCheckBox Die Menü-Version des JRadioButton • Den Menüeinträgen werden Listener zugeordnet: JMenuItem, JRadioButtonMenuItem —- ActionListener JCheckBoxMenuItem —- ItemListener Peter Merz Einführung in JAVA 102 Die Java Swing API public class MenuExample implements ActionListener { public void actionPerformed(ActionEvent e) { System.out.println( ”Command: ” + e.getActionCommand()); if ( e.getActionCommand().equals(”exit programm”)) System.exit(0); } public static void main(String [] args) { ActionListener listener = new MenuExample(); JFrame frame = new JFrame(”MenuExample”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JMenu menu; JMenuItem menuItem; JMenuBar menuBar = new JMenuBar(); frame.setJMenuBar(menuBar); menu = new JMenu(”File”); menu.setMnemonic(KeyEvent.VK F); menuBar.add(menu); menuItem = new JMenuItem(”Open”); menuItem.setMnemonic(KeyEvent.VK O); menuItem.addActionListener(listener); menuItem.setActionCommand(”open file”); menu.add(menuItem); menu.addSeparator(); Peter Merz Einführung in JAVA 103 Die Java Swing API menuItem = new JMenuItem(”Exit”); menuItem.setMnemonic(KeyEvent.VK E); menuItem.addActionListener(listener); menuItem.setActionCommand(”exit programm”); menu.add(menuItem); menu = new JMenu(”Edit”); menu.setMnemonic(KeyEvent.VK E); menuBar.add(menu); menuItem = new JMenuItem(”Copy”); menuItem.setMnemonic(KeyEvent.VK C); menuItem.addActionListener(listener); menuItem.setActionCommand(”copy buffer”); menu.add(menuItem); JLabel label = new JLabel(”irgendein text”); contentPane.add(label, BorderLayout.CENTER); // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.setSize(320, 200); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } } Peter Merz Einführung in JAVA 104 Die Java Swing API Verwendung von JFileChooser: Wichtige Methoden: Erzeugt einen FileChooser Erzeugt einen FileChooser und setzt Verzeichnis int showOpenDialog(Component) Öffnet einen Datei-Öffnen-Dialog int showSaveDialog(Component) Öffnet einen Datei-Speichern-Dialog setMultiSelectionEnabled(boolean) Aktiviert die Auswahl mehrerer Dateien setSelectedFile(File) Setzt die ausgewählte Datei setSelectedFiles(File[]) Setzt ausgewählte Dateien setFileFilter(FileFilter) Setzt ein Datei-Filter JFileChooser() JFileChooser(File) • Jede get-Methode hat auch eine entsprechende set-Methode • Ergebnisse von showOpenDialog() und showSaveDialog() können sein: APPROVE OPTION oder CANCEL OPTION Peter Merz Einführung in JAVA 105 Die Java Swing API import javax.swing.∗; import java.awt.∗; import java.awt.event.∗; import java.io . File ; import javax.swing.filechooser.∗; public class FileChooserExample extends FileFilter { public boolean accept(File f) { return f . isDirectory () || f .getName().endsWith(”.txt”); } public String getDescription () { return ”Text Files ” ; } public static void main(String [] args) { JFrame frame = new JFrame(”FileChooserExample”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JLabel label = new JLabel(”Das ist das Hauptfenster”); contentPane.add(label, BorderLayout.CENTER); // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); Peter Merz Einführung in JAVA 106 Die Java Swing API frame.setSize(640, 480); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm // Create a file chooser JFileChooser fileChooser = new JFileChooser(); fileChooser. setFileFilter (new FileChooserExample()); int returnVal = fileChooser.showOpenDialog(frame); if ( returnVal == JFileChooser.APPROVE OPTION) { System.out.println( ”You chose to open this file: ” + fileChooser.getSelectedFile (). getName()); } // Create a file chooser fileChooser = new JFileChooser(); fileChooser. setFileFilter (new FileChooserExample()); returnVal = fileChooser.showSaveDialog(frame); } } if ( returnVal == JFileChooser.APPROVE OPTION) { System.out.println( ”You chose to save this file : ” + fileChooser.getSelectedFile (). getName()); } Peter Merz Einführung in JAVA 107 Die Java Swing API Verwendung von JOptionPane: Wichtige Methoden: int showMessageDialog(Component, Object, String, int, Icon) Nachricht int showConfirmDialog(Component, Object, String, int, int, Icon) Bestätigung String showInputDialog(Component, Object, String, int, Icon, Object[], Object) Eingabe • Parameter 1 (Component): Zugeordnete Eltern-Komponente • Parameter 2 (Object): Ausgegebener Text • Parameter 3 (String): Fenster-Titel • Parameter 4 (int): Message-Typ • Parameter 5/6 (Icon): Darzustellendes Icon • Weitere Parameter: siehe Beispiel • Weitere Verwendung durch Instantiierung von JOptionPane-Objekten Siehe API! Peter Merz Einführung in JAVA 108 Die Java Swing API Beispiel für JOptionDialog: import javax.swing.∗; import java.awt.∗; import java.awt.event.∗; public class OptionDialogExample { public static void main(String [] args) { JFrame frame = new JFrame(”OptionPaneExample”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); JLabel label = new JLabel(”Das ist das Hauptfenster”); contentPane.add(label, BorderLayout.CENTER); // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.setSize(640, 480); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm Peter Merz Einführung in JAVA 109 Die Java Swing API (Einfache Dialoge) // Info JOptionPane.showMessageDialog(frame, ”Das ist eine Info .” ); // Warnung JOptionPane.showMessageDialog(frame, ”Das ist eine Warnung.”, ”Message Dialog”, JOptionPane.WARNING MESSAGE); // Error JOptionPane.showMessageDialog(frame, ”Das ist ein Error .” , ”Message Dialog”, JOptionPane.ERROR MESSAGE); Peter Merz Einführung in JAVA 110 Die Java Swing API (Dialoge mit mehreren Buttons) // Ja/Nein Dialog int n = JOptionPane.showConfirmDialog(frame, ”Wollen Sie alle Daten ölschen?”, ”Confirm Dialog”, JOptionPane.YES NO OPTION); if ( n == JOptionPane.NO OPTION) System.out.println(”Antwort war Nein”); // Drei öAuswahlmglichkeiten, Text der Buttons ist ueberschrieben Object [] options = { ”Ja” , ”Nein” , ”Abbrechen”}; n = JOptionPane.showOptionDialog(frame, ”Es ist ein Fehler aufgetreten!” , ”Option Dialog”, JOptionPane.YES NO CANCEL OPTION, JOptionPane.QUESTION MESSAGE, null , options, options [2]); if ( n == JOptionPane.YES OPTION) System.out.println(”Antwort war Ja”); Peter Merz Einführung in JAVA 111 Die Java Swing API (Dialoge mit Eingabe) String ret = JOptionPane.showInputDialog(frame, ”Wie ist Ihr Name?”, ”Input Dialog”, JOptionPane.QUESTION MESSAGE); System.out.println( ”Name: ” + ret); Object [] choices = { ”Maennlich”, ”Weiblich” , ”Keine Ahnung”}; ret = ( String)JOptionPane.showInputDialog(frame, ”Was ist ihr Geschlecht?”, ”Input Dialog”, JOptionPane.QUESTION MESSAGE, null , choices, choices [0]); System.out.println( ”Geschlecht: ” + ret ); } } Peter Merz Einführung in JAVA 112 Die Java Swing API MVC-Architektur: Benutzungsschnittstellen lassen sich über eine Model-View-Controller-Architektur realisieren: • Model: Datenmodell, das Daten speichert und manipuliert • View: Darstellung des Inhalts des Datenmodells • Controller: Steuert das Programm (Model, View) in Abhängigkeit von Benutzereingaben Wichtig: Ein Model kann mehrere Views / Controller haben Peter Merz Einführung in JAVA 113 Die Java Swing API MVC-Architektur in Swing: • Model: – Liefert internen Zustand – Manipuliert internen Zustand – Hinzufügen/Entfernen von Event-Listenern – Löst Events aus • View + Controller: – Stellt die Daten dar – Liefert geometrische Informationen – Bearbeitet Events Peter Merz Einführung in JAVA 114 Die Java Swing API MVC-Beispiele in Swing: Model View-Controller Listener DefaultListModel JList ListDataListener DefaultTableModel JTable TabelModelListener DefaultListSelectionModel JList, JTable ListSelectionListener DefaultTreeModel JTree TreeModelListener TreeSelectionModel JTree TreeSelectionListener DefaultBoundedRangeModel Slider ChangeListener DefaultComboBoxModel JComboBox ListDataListener DefaultButtonBodel JButton, JCheckBox Action-, Item-, JRadioButton ChangeListener Peter Merz Einführung in JAVA 115 Die Java Swing API Verwendung von JList mit ListModel: • Model: DefaultListModel, View: JList • DefaultListModel speichert Einträge • Löschen oder Hinzufügen zum Modell bewirkt Aktualisierung der JList • ListDataListener wird aufgerufen, wenn das Modell geändert wird • ListSelectionListener wird bei der Auswahl von Elementen aufgerufen • ListDataListener und ListSelectionListener brauchen nicht definiert zu werden Es folgt ein Beispiel. Peter Merz Einführung in JAVA 116 Die Java Swing API public class ListModelExample implements ActionListener { protected JList list ; protected DefaultListModel listModel; public ListModelExample() { JFrame frame = new JFrame(”ListModelExample”); // Erzeugt ein Fenster Container contentPane = frame.getContentPane(); String [] liste = { ”Rot” , ”Gelb”, ”Blau” , ”Schwarz”}; listModel = new DefaultListModel(); for( int i = 0; i < liste .length ; i ++) listModel .addElement(liste[i ]); list = new JList(listModel ); list .setSelectionMode(ListSelectionModel.SINGLE SELECTION); contentPane.add(new JScrollPane(list), BorderLayout.CENTER); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2, 1)); JButton button = new JButton(”remove”); button.addActionListener(this); panel.add(button); button = new JButton(”insert” ); button.addActionListener(this); panel.add(button); contentPane.add(panel, BorderLayout.SOUTH); // Fuegt buttons hinzu Peter Merz Einführung in JAVA 117 Die Java Swing API // Beenden des Programmes bei Schliessen des Fensters: frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.pack(); // Anordnung der Inhalte des Frames frame.setVisible (true ); // Dartstellung auf dem Bildschirm } public void actionPerformed(ActionEvent e) { JButton button = (JButton)e.getSource(); } if ( button.getText (). equals(”remove”)) { if (! list .isSelectionEmpty()) { int index = list .getSelectedIndex(); list .clearSelection (); listModel .remove(index); } } else { listModel .addElement(”Neue Farbe”); } public static void main(String [] args) { ListModelExample app = new ListModelExample(); } } Peter Merz Einführung in JAVA 118 Die Java Swing API Grafische Ausgaben: Erweiterung eines JPanels : class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); //paint background int w = getWidth(); int h = getHeight(); g.drawLine(0, 0, w, h); g.drawLine(0, h, w , 0); ... } } Alle Methoden der Klasse Graphics können verwendet werden Peter Merz Einführung in JAVA 119 Die Java Swing API Klasse Graphics: Einige Methoden: Zeichnet eine Linie Zeichnet ein (gefülltes) Rechteck Zeichnet einen (gefüllten) Kreis oder eine Ellipse Zeichnet einen (gefüllten) Kreisoder Ellipsenbogen drawPolygon(), fillPolygon() Zeichnet ein (gefülltes) Polygon drawPolyline() Zeichnet eine Reihe von verbundenen Linien drawString() Zeichnet einen Text drawImage() Zeichnet eine Bitmap setColor() Setzt die Zeichenfarbe setFont() Setzt den Font setPaintMode(), setXORMode() Zeichenmodus setClip() Legt die Zeichenfläche fest drawLine() drawRect(), fillRect() drawOval(), fillOval() drawArc(), fillArc() Peter Merz Einführung in JAVA 120 Die Java Swing API Graphics-Zustand: Das Zeichnen hängt vom internen Zustand des Grafik-Systems ab, dazu gehört: • Das Component-Objekt auf das gezeichnet werden soll • Der (verschobene) Ursprung des Koordinatensystems • Die aktuelle Begrenzung – clipping • Die aktuelle Zeichen-Farbe • Der aktuelle Font • Der aktuelle Zeichenmodus (Paint oder XOR) sowie die XOR-Farbe Peter Merz Einführung in JAVA 121 Die Java Swing API Graphics2D-API: Erweitert Graphics um folgende Funktionalität: • Das Zeichnen von Linien beliebiger Dicke • Das Füllen von Flächen mit Farbverläufen (gradients) und Texturen • Verschieben, Rotieren, Skalieren und Scheren von Grafikelementen und Text • Das Überlappen von Text und Grafik (composites) Peter Merz Einführung in JAVA 122 Die Java Swing API Graphics2D Rendering Context: Attribute zum Zeichnen können mit folgenden Methoden festgelegt werden: setStroke() setPaint() setComposite() setTransform() setClip() setFont() setRenderingHints() Peter Merz legt die Linienart (Dicke, Muster, ...) fest legt das Füllen von Objekten fest legt das Überlappen von Objekten fest legt die Transformation der Koordinaten fest legt das Clipping fest legt den Font fest legt weitere Attribute für das Zeichnen fest Einführung in JAVA 123 Die Java Swing API Graphics2D Operationen: Folgende Grafikprimitiven existieren: draw(Shape) – Zeichnet den Umriss eines Grafik-Objektes mit aktuellem Stroke und Paint fill(Shape) – Zeichnet ein Grafik-Objekt durch Füllen mit aktuellem Paint drawString() – Zeichnet einen Text mit dem aktuellen Font drawImage() – Zeichnet eine Bitmap Beispiele für Shapes: Rectangle2D – Rectangle2D.Double(double x, double y, double w, double h) Ellipse2D – Ellipse2D.Double(double x, double y, double w, double h) Peter Merz Einführung in JAVA 124 Die Java Swing API Verwendung in einer Swing-Komponente: So werden Graphics2D-Methoden aufgerufen: class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); //paint background Graphics2D g2 = (Graphics2D)g; // cast g2.setStroke(new BasicStroke(...)); g2.draw(new Rectangle2D.Double(x, y, w, h)); g2.setPaint(new GradientPaint (...)); g2. fill (new Ellipse2D.Double(x, y, w, h )); ... } } Peter Merz Einführung in JAVA 125 Die Java Swing API Vollständiges Beispiel: class MyPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); //paint background int w = getWidth(); int h = getHeight(); g.drawLine(0, 0, w, h); g.drawLine(0, h, w , 0); paint2D((Graphics2D)g); } } public void paint2D(Graphics2D g) { g.setPaint(new GradientPaint(0, 0, Color.RED, 600, 400, Color.WHITE)); g. fill (new RoundRectangle2D.Double(20, 20, 600, 400, 5, 5)); g.setStroke(new BasicStroke(2)); g.setPaint(Color.BLACK); g.draw(new RoundRectangle2D.Double(20, 20, 600, 400, 5, 5)); g.setFont(new Font(”serif” , Font.BOLD, 120)); g.setRenderingHint(RenderingHints.KEY ANTIALIASING, RenderingHints.VALUE ANTIALIAS ON); g.drawString(”Java2D”, 100, 250); } Peter Merz Einführung in JAVA 126 Die Java Swing API public class Graphics2DExample { public Graphics2DExample() { JFrame frame = new JFrame(”JavaGraphics”); Container contentPane = frame.getContentPane(); contentPane.add(new MyPanel(), BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT ON CLOSE); frame.setSize(800, 600); frame.setLocation(100, 100); frame.setVisible (true); } } public static void main(String [] args) { Graphics2DExample javaGraphics = new Graphics2DExample(); } Peter Merz Einführung in JAVA 127 Die restlichen Java-APIs Weitere wichtige APIs: • Networking API: java.net • Remote-Method-Invocation (RMI) API: java.rmi • Reflection API: java.lang.reflect Dies APIs werden im folgenden kurz erläutert. Peter Merz Einführung in JAVA 128 Die restlichen Java-APIs Networking: Die Networking API enthält die folgenden Funktionen: • Funktionen zur Verwendung von URLs • Zugriff auf URL-Resourcen • TCP-Verbindungen zwischen Internet-Rechnern • UDP-Unterstützung zum Senden und Empfangen von Datagrammen • Ab Version 1.4: Unterstützung von verschlüsselten Verbindungen (Secure Socket Layer) Peter Merz Einführung in JAVA 129 Die restlichen Java-APIs Begriffe: • Socket: Endpunkt einer Zwei-Wege-Internet-Verbindung zwischen zwei Rechnern • Port: Jeder Socket ist an eine Port-Nummer gebunden • TCP: Verbindungsprotokol zwischen zwei Rechnern, Datenübertragung ist gesichert • UDP: Ungesichertes, verbindungsloses Protokoll – Es werden nur Pakete/Datagramme versendet – Pakete können verlorengehen oder in falscher Reihenfolge beim Ziel ankommen Peter Merz Einführung in JAVA 130 Die restlichen Java-APIs Prinizipielle Vorgehensweise bei der Programmierung von Internet-Programmen: 1) Öffnen eines Sockets 2) Öffnen eines Input- und OutputStreams zu dem Socket ➠ java.io-API 3) Senden und Empfangen über Lesen und Schreiben in und aus den Streams 4) Schließen der Streams 5) Schließen des Sockets Peter Merz Einführung in JAVA 131 Die restlichen Java-APIs Remote Method Invocation: Überblick: • Erlaubt den Aufruf von Methoden von entfernten Objekten • Erleichtert die Entwicklung von (im Netzwerk) verteilten Anwendungen • Verwendet Networking-API und Serialisierung Features: • Der Aufruf einer Methode eines entfernten Objektes ist (fast) so, als ob das Objekt lokal vorhanden wäre • Klassen (Bytecode) können von einem Web-Server nachgeladen werden Peter Merz Einführung in JAVA 132 Die restlichen Java-APIs Ablauf RMI: • Client: Möchte entfernte Objekte aufrufen • Server: Stellt diese bereit • RMI-Registry: Server registriert Objekte Client holt Objektreferenzen • Web-Server: Stellt den Bytecode für neue Klassen bereit bekannt sind Peter Merz Einführung in JAVA 133 Die restlichen Java-APIs Reflection API: Funktionen: • Bestimmung der Klasse eines Objektes • Bestimmung von Attributen, Methoden, Konstruktoren und Superklassen einer Klasse • Bestimmung von Methoden und Konstanten eines Interfaces • Erzeugung von Objekten die erst zur Laufzeit des Programmes bekannt sind • Aufrufen von Methoden eines Objektes, die erst zur Laufzeit bekannt sind In vielen Anwendungen werden diese Funktionen nicht gebraucht, werden aber von einigen anderen APIs verwendet. Peter Merz Einführung in JAVA 134 Die restlichen Java-APIs Nicht in der Vorlesung besprochene APIs: • Sound API • JDBC API • XML API • JavaBeans API • Servlets • ... Peter Merz Einführung in JAVA 135