Teil 2

Transcription

Teil 2
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