Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM,...
Transcript of Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM,...
![Page 1: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/1.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ein- und Ausgabe
Strombasierte Ein- und Ausgabe
Die Klassenhierachie InputStream, OutputStream, Reader, Writer
Anwendung von Strömen für die Serialisierung von Objekten
Zugriff auf das Dateisystem
Ein- und Ausgabe mit Graphischen Benutzeroberflächen (GUIs)
Unterscheidung von Modell und Sicht
Ergeignisse in der GUI und Ereignisbehandlung
Ereignisse zur Zuständsänderung von Objekten
987
![Page 2: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/2.jpg)
Ein- und AusgabeOOPM, Ralf Lämmel
http://www.zazzle.de/input_output_tshirt-235248123204113601
Quiz: Wo ist “Output”?
![Page 3: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/3.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
java.applet Applet-Programmierung java.awt GUI-Programmierung mit AWT java.beans JavaBeans™-Entwicklung java.io Ein-/Ausgabe, Datenströme java.lang fundamentale Klassen (z.B. String) java.net Netzwerkfunktionen java.rmi Remote Method Invocation java.security Zertifikate, Kryptographie java.sql Datenbank-Funktionen java.util Klassen für Datenstrukturen javax.swing GUI-Programmierung mit Swingorg.w3c.dom XML-Programmierung mit DOM ...
Java Plattform =Sprache + APIs (Bibliotheken) + ...
989
![Page 4: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/4.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Das Konzept der Ströme
990
Programm
Programm
ProgrammProgramm
Programm
Datei
Datei
Schreiben
in Datensenke
Lesen
aus Datenquelle
![Page 5: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/5.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ströme (Streams)
Sequentiell organisierte Datenmengen Auf untersten Ebene
BytefolgenZeichenfolgen
Auf höherer EbenePrimitive WerteSerialisierte Objekte
mit Zugriffsformenlesend (“Datenquellen”)schreibend (“Datensenken”)
Ausnahme: RandomAccessFileWahlfreier Zugriff auf Datei von Bytes
991
![Page 6: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/6.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Beispiel: Addiere 2 Werte aus einer Datei!
992
Reader r = ...;
int value1 = Integer.parseInt(r.readLine()); int value2 = Integer.parseInt(r.readLine()); int sum = value1 + value2; System.out.println(value1 + " + " + value2 + " = " + sum); r.close();
Die Eingabe wird mittels eines “Dateieingabestromes” gelesen.
Illustrationen zur Ein-/Ausgabesiehe Repository: oo.file
![Page 7: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/7.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Aufgaben von strombasierter I/O
Datenaustausch / Kommunikation
zwischen Programm und Nutzer
zwischen Programm und Netzwerk
zwischen Programmen
Dateizugriff im Dateisystem
Persistenz von Objekten
Remote Method Invocation
993
![Page 8: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/8.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Bibliotheksunterstützung für Ströme
994
![Page 9: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/9.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
(Basis-) Klassen für Ströme
File Datei- und VerzeichnisnamenInputStream Bytestrom zum LesenOutputStream Bytestrom zum SchreibenRandomAccessFile Wahlfreier Zugriff auf Dateien mit BytesReader Zeichenstrom zum LesenWriter Zeichenstrom zum Schreiben...
995
![Page 10: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/10.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Wichtige Arten von Eingabeströmen
File
InputStream
ByteArrayInputStream Lies von einem Feld von Bytes
FileInputStream Lies Bytes von einer Datei
FilterInputStream Filtere (transformiere) einen Strom
ObjectInputStream Serialisierung von Objekten
PipedInputStream Erlaubt Modus vergleichbar zu “|” in Unix
SequenceInputStream Verkettung zweier Ströme
StringBufferInputStream Lies Bytes von einem String
OutputStream
RandomAccessFile
Reader
Writer
996
![Page 11: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/11.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Konstruieren von Strömenausgehend von einer Datei (File) f
fis = new FileInputStream(f)
isr = new InputStreamReader(fis)
br = new BufferedReader(isr)
fos = new FileOutputStream(f)
osw = new OutputStreamWriter(fos)
bw = new BufferedWriter(osw)
997
Lies Bytes
Lies Zeichen
... mit Puffer
![Page 12: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/12.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Beispiel: Addiere 2 Werte aus einer Datei!
998
public class Program {
public static void main(String[] args) throws IOException {
File input = new File(args[0]); BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(input)));
int value1 = Integer.parseInt(br.readLine()); int value2 = Integer.parseInt(br.readLine()); int sum = value1 + value2; System.out.println(value1 + " + " + value2 + " = " + sum); br.close(); }}
Die Eingabe wird mittels “Dateieingabestrom”
gelesen.
Illustrationen zur Ein-/Ausgabesiehe Repository: oo.file
![Page 13: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/13.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Schreiben der Ausgabe in eine Datei
999
// Write the output file with a buffered writer BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(output))); // Write result bw.write(value1 + " + " + value2 + " = " + sum); // Done with the output bw.close();
![Page 14: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/14.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ausnahmebehandlung
1000
public class Program {
public static void main(String[] args) throws IOException {
// Lese 2 Zahlen aus Datei und addiere sie.
}}
Was ist die Aufgabe dieser Deklaration?
![Page 15: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/15.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ausnahmebehandlung
1001
try {
... code as before ...
} catch (FileNotFoundException fnfe) { System.err.println( "Input file missing");} catch (IOException ioe) { System.err.println( "Some I/O error");} catch (NumberFormatException nfe) { System.err.println( "Content of input file cannot be converted");}
![Page 16: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/16.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Die Schnittstelle von InputStream
Wichtigste Methodenread(): Lies ein Byte.close(): Strom schließen.
Weitere Methodenavailable(...): Teste ob nächstes read(...) blockiert.read(...): Lies Bytes in ein Feld.skip(...): Überlese eine gewisse Anzahl Bytes.Optional
mark(...): Merke die aktuelle Position vor.reset(...): Kehre zu früherer Position zurück.
1002
![Page 17: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/17.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Die Schnittstelle von Reader
Wichtigste Methodenread(): Lies ein Zeichen.close(): Strom schließen.
Weitere Methoden
ready(): Teste ob nächstes read(...) blockiert.read(...): Lies Zeichen in ein Feld.skip(...): Überlese eine gewisse Anzahl Zeichen.Optional
mark(...): Merke die aktuelle Position vor.reset(...): Kehre zu früherer Position zurück.
1003
Das ist InputStream
modulo Umbennung.
![Page 18: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/18.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
BufferedReader
Benutzt Zwischenspeicher (Puffer)
Optimierungen
Anzahl der Zugriffe auf den Eingabestrom.
Anzahl der Konvertierungen und Ergebnisse.
Wichtige zusätzliche Methode
readLine(): Liest eine ganze Zeil als String ein.
1004
![Page 19: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/19.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Beispiel: Unix’ more
1005
Eingabe
Kommandozeilenarrgument
Name einer Textdatei
Ausgabe
Standardausgabe
Inhalt der Datei
Illustrationen zur Ein-/Ausgabesiehe Repository: oo.file
![Page 20: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/20.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1006
public class More { public static void main(String[] args) throws IOException { // Obtain file name from command line File file = new File(args[0]); // Construct a buffered reader for the input BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream(file))); // Read from the input line by line and echo String line; while ((line = br.readLine()) != null) { System.out.println(line); } // Done br.close(); }}
![Page 21: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/21.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Die Schnittstelle von Writer
Wichtigste Methoden
write(...): Schreibe ein Zeichen.
close(): Strom schließen.
flush(): Eventuell gepufferte Zeichen schreiben.
1007
![Page 22: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/22.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
URLs und I/O
Klasse java.net.URL
Konstruktor
URL(String s)
Zuordnung eines Eingabestroms
openStream()
1008
![Page 23: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/23.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Lesen aus einem URL
1009
// Obtain URL from command lineURL url = new URL(args[0]);
// Construct a buffered reader for the inputBufferedReader br = new BufferedReader( // Make the reader a buffered reader new InputStreamReader( // Create a reader from the stream url.openStream())); // Create an input stream from URL
![Page 24: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/24.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ein- und Ausgabe auf höherer Ebene für den Zweck der Serialisierung von Objekten
1010
![Page 25: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/25.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Persistente Objekte (bzw. Serialisierung)
Definition
Objekte bleiben über Programmlaufzeit erhalten
Eine Vorgehensweise
Serialisierung der Objekte vor Programmende
Speicherung des Zustandes in Datei oder Datenbank
Wiederherstellung der Objekte in anderem Programmlauf
Siehe Schnittstelle java.io.Serializable
1011
010101010010110101010101000101010110101
![Page 26: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/26.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
A serialized object
1012
0101010010110100101010010101010101010100101001101010101001010100101010100101001001101001
![Page 27: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/27.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
A class of serializable objects
1013
public class Employee implements Serializable {
private static final long serialVersionUID = -210889592677165250L;
private Person person;
private double salary;
public Person getPerson() { return person; }
public void setPerson(Person person) { this.person = person; }
public double getSalary() { return salary; }
public void setSalary(double salary) { this.salary = salary; }
}
Eindeutige Identifikation der Klasse insbesondere auch für die Serialisierung
![Page 28: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/28.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Serialize an object
1014
Company sampleCompany = new Company();
...
FileOutputStream fos = new FileOutputStream(filename);
ObjectOutputStream out = new ObjectOutputStream(fos);
out.writeObject(sampleCompany);
out.close();
Ein Objekt eines serialisierbaren Betriebes mit serialisierbaren Angestellten etc.
![Page 29: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/29.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
De-serialize an object
1015
Company sampleCompany;
FileInputStream fis = new FileInputStream(filename);
ObjectInputStream in = new ObjectInputStream(fis);
sampleCompany = (Company)(in.readObject());
in.close();
![Page 30: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/30.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Zugriff auf das Dateisystem
Testen von Datei-Eigenschaften
Löschen von Dateien
Anlegen von Verzeichnissen
Lesen von Verzeichnissen
1016
Hierarchisches Dateisystem (modulo Links)
![Page 31: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/31.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Testen von Datei-Eigenschaften(Klasse java.io.File)
boolean exists() Existiert die Datei mit dem gegebenen Namen?
boolean canRead() Ist die Datei lesbar? Rechte verfügbar?
boolean canWrite() Ist die Datei schreibbar? Rechte verfügbar?
boolean isFile() Ist diese Datei tatsächliche eine Datei?
boolean isDirectory() ... oder ist es ein Verzeichnis?
boolean isHidden() Ist diese Datei “verborgen”?
long length() Was ist die Länge der Datei?
1017
![Page 32: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/32.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Änderungen im Dateisystem(Klasse java.io.File)
boolean delete() Lösche die Datei.
boolean renameTo(...) Benenne die Datei um.
void deleteOnExit() Lösche die Datei bei Programmende.
boolean mkDir() Lege ein Verzeichnis an.
boolean mkDirs() ... einschließlich aller Unterverzeichnisse.
1018
![Page 33: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/33.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Verzeichnisse lesen(Klasse java.io.File)
File[] listFiles() Liste Dateien im Verzeichnis.
File[] listFiles(...) Filtere die Liste zusätzlich.
1019
Beispiel: Wir wollen nun rekursiv alle Dateien ausgehend von einem Wurzelverzeichnis aus auflisten.
![Page 34: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/34.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1020
public static void listDirectories(File dir) {
File[] children = dir.listFiles(
new NotHiddenFilter());
if (children != null) {
for (int i=0; i<children.length; i++) {
File file = children[i];
System.out.println(file.toString());
if (file.isDirectory())
listDirectories(file);
}
}
}
![Page 35: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/35.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1021
/**
* A filter that accepts all non-hidden files.
*/
public class NotHiddenFilter implements FileFilter {
public boolean accept(File file) {
return !file.isHidden();
}
}
![Page 36: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/36.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Graphische Benutzeroberflächen
• Eingabe: Nutzereingabe
• Ausgabe: GUI-Sichten
• Wichtige Aspekte:
• Verwaltung der Daten in einem Model (Objekten)
• Registrierung von Routinen zur Ereignisbehandlung
• Konstruktion der GUI-Komponenten
1022
![Page 37: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/37.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Beispiel: “Exit” Funktion einer Applikation
1023
System.out.println("Exiting ...");System.exit(0);
Siehe Repository: oo.gui
![Page 38: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/38.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1024
Demo!
![Page 39: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/39.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Bestandteile der “Exit”-Applikation
1025
1.Konstruktion der GUI-Komponenten
2.Definition der Ereignisbehandlungsroutine
3.Handlerregistrierung bei der GUI
4.Aktivierung (Anzeigen) der GUI
![Page 40: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/40.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Konstruktion der GUI-Komponenten
1026
import javax.swing.*;
...JFrame f = new JFrame();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JButton b = new JButton("Exit");f.add(b);f.pack();...
Aus den Java-Tutorials: “A Frame is a top-level window with
a title and a border.”
Aus den Java-Tutorials: “A common (push) button.”
Aus der Java-Dok.: “Appends the specified component to the end
of this container.”
Aus der Java-Dok.: “Causes this window to be sized to fit the preferred
size and layouts of its subcomponents.”
Java’s “GUI API”
![Page 41: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/41.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Definition der Ereignisbehandlungsroutine
1027
import java.awt.event.*;
public class ExitAction implements ActionListener { public void actionPerformed(ActionEvent event) { System.out.println("Exiting ..."); System.exit(0); }}
Aus der Java-Dok.: “The listener interface for receiving action events. The class that is interested in processing an action
event implements this interface, and the object created with that class is registered with a component, using the component's
addActionListener method. When the action event occurs, that object's actionPerformed method is invoked.”
Java’s API für Ereignisbehandlung und “Low-
Level” GUI-Funktionalität
![Page 42: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/42.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Handlerregistrierung bei der GUI
1028
b.addActionListener(new ExitAction());
das Button-Objekt
Schnittstellen-polymorphe Methode zur
Registrierung
Objekt welches die Behandlung bietet
![Page 43: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/43.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Aktivierung (Anzeigen) der GUI
1029
f.setVisible(true);
Die GUI ist fertig konstruiert und konfiguriert. Damit kann sie projiziert werden und auf Ereignisse reagieren.
![Page 44: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/44.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Grundidee der Ereignisbehandlung
1030
Auslöser des Ereignisses
EreignisHörer des
Ereignisses
Deutsch EnglischEreignis Event
Auslösen To trigger
Zuhörer Listener
Behandler Handler
Methode fürBehandlung
Aufruf
Registrierung
Erzeugung Verteilung
![Page 45: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/45.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Zusammenfassung des allgemeinen Ereignis-Zyklus
Erzeugung: eine Quelle (ein Objekt) erzeugt ein Objekt als Manifestation des Ereignisses.
Verschicken: die Quelle (oder eine der Quelle bekannten Autorität) versendet das Ereignis an alle (potentiell) interessierten Zuhörer.
Verarbeitung: der Zuhörer empfängt das Ereignis und entscheidet über die Verarbeitung.
Abschluss: das Ereignis ist konsumiert wenn alle Zuhörer ihre Verarbeitung beendet haben.
1031
![Page 46: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/46.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Begrifflichkeiten bei der “Exit”-Applikation
Auslöser des Ereignisses
GUI der Applikation (Nutzer wählt “Exit” Button)
Ereignis
Aktion “button pressed”
Zuhörer
Objekt mit entsprechender Schnittstelle
Behandlung
System.exit(0)
1032
![Page 47: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/47.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Verallgemeinerte Ereignisse in einer OO GUI
Ereignis: Auftreten einer Eingabe-basierten Situation in der GUI
Ereignis-Quelle: GUI-Komponente die mit dem Ereignis assoziiert ist
Ereignis-Objekt: OO-Repräsentation des Ereignisses
Ereignis-Zuhörer: Objekte die über Ereignisse benachrichtigt werden wollen.
Ereignis-Aktion: Methode (Handler) welche der Zuhörer zur Ausführung bringt
1033
![Page 48: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/48.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Komplexeres Beispiel: GUI-Interaktion mit einem Modell
1034
ModellDaten der Applikation
Ein Zähler-ObjektGUI
“Sicht auf Modell” (View)Anzeige‣ ZählerstandAktionen‣ Step: Zähler erhöhen‣ Reset: Zähler zurücksetzen
![Page 49: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/49.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1035
Demo!
![Page 50: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/50.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Konstruktion der GUI-Komponentenmit Registrierung und Start der GUI
1036
frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);updateTitle();panel = new JPanel();frame.add(panel);panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));step = new JButton("Step");step.addActionListener(this);panel.add(step);reset = new JButton("Reset");reset.addActionListener(this);panel.add(reset);frame.pack();frame.setVisible(true);
Container zur Anreihung von Komponenten
Vertikale Anreihung der Komponenten
Spezialfall: Konstruierendes Objekt = Behandelndes Objekt
![Page 51: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/51.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1037
public void actionPerformed(ActionEvent event) { if (event.getSource() == step) { counter.step(); updateTitle(); return; } if (event.getSource() == reset) { counter.reset(); updateTitle(); return; }}
Abfrage der Quelle eines Ereignisses
Eine Ereignisbehandlungsroutinefür beide Buttons
![Page 52: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/52.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Trennung von Modell und Sicht
1038
public class View implements ActionListener { private Counter counter; private JFrame frame; private JPanel panel; private JButton step; private JButton reset; public View(Counter counter) {
... store counter and construct GUI ... } public void actionPerformed(ActionEvent event) {
... handle the GUI event ... } public void updateTitle() { frame.setTitle(Integer.toString(counter.getCount())); }}
Eine einzelne Klasse übernimmt die Aufbewahrung der GUI-Komponenten und
des Anwendungszustandes (“Counter”) sowie die Ereignisbehandlung (“implements
ActionListener”).
![Page 53: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/53.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
GUI-Komponenten (Swing API) Die javax.swing.JComponent-Hierarchie
Im Beispiel
JFrame Eine umrahmtes Fenster
JPanel Container für Komponenten mit Layout
JButton Ein Button
Weitere
JLabel Textkomponente
JList Auswahl aus einer Liste
JTextField Eingabefeld
JComboBox Kombination aus Feld und Liste
JSlider Wertauswahl mit Slider
...
1039
![Page 54: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/54.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ereignisse in interaktiven Programmen
High-level Ereignisse
Fenster schließen/öffnen
Button gedrückt
Editierbarer Text geändert
Low-level Ereignisse
Tastatur-Ereignisse
Mouse-Ereignisse
Timer-Ereignisse
Peripherie-Ereignisse
1040
![Page 55: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/55.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
GUI-Ereignisse:Klassenhierachie in java.awt.event
AWTEvent
ActionEvent High-level, Komponenten-spezifische Ereignisse
AdjustmentEvent Ereignisse für anpassbare Komponenten
ComponentEvent Low-level, Komponenten-spezifische Ereignisse
FocusEvent
InputEvent
‣ MouseEvent
- MouseWheelEvent
‣ KeyEvent
PaintEvent
WindowEvent
ItemEvent Selektieren / Deselektieren eines Items
TextEvent Änderung des Textes eines Objektes
1041
![Page 56: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/56.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
MouseEvent
1042
![Page 57: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/57.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Zuhörer (Schnittstellen) für GUI events
1043
Ereignis Zuhörer
ActionEvent ActionListener
MouseEvent MouseListener
... ...
![Page 58: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/58.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
MouseListener
1044
![Page 59: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/59.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Mehrere GUI-Sichten auf ein Modell
1045
Zähler-Objekt
![Page 60: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/60.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1046
Demo!
![Page 61: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/61.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Ereignisse zur Zustandsänderung von Objekten
Klasse PropertyChangeEvent
Konstruktorparameter
Object source
String propertyName
Object oldValue
Object newValue
Schnittstelle PropertyChangeListener
void propertyChange(PropertyChangeEvent e)
1047
Zähler-Objekte sollten nun alle abhängigen Sichten
über Zustandsänderungen informieren.
![Page 62: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/62.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau 1048
Zähler-Klasse mit Protokoll für die Benachrichtigung bei Zustandsänderungen
public final class Counter {
private int count = 0;
private Collection<PropertyChangeListener> listeners = new LinkedList<PropertyChangeListener>(); public void step() { setCount(count+1); } public void reset() { setCount(0); } public int getCount() { return count; } private void setCount(int value) { ... } // see next slide public void addListener(PropertyChangeListener listener) { listeners.add(listener); }}
Verwaltung der Beobachter
Eintragen eines Beobachters
![Page 63: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/63.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Setter mit Benachrichtigung
1049
private void setCount(int newValue) {
// Backup value int oldValue = count; // Do the update count = newValue; // Construct the event PropertyChangeEvent event = new PropertyChangeEvent( this, "count", oldValue, newValue); // Notify all subscribed listeners for (PropertyChangeListener l : listeners) l.propertyChange(event); }
![Page 64: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/64.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Verdrahten der Sichten und des Modells
1050
Die Sichten müssen ...
sich mit dem Modell registrieren und
PropertyChangeListener implementieren.
public static void main(String[] args) {
Counter counter = new Counter();
new View(counter,100,100);
new View(counter,200,150);
}
Konstruktion eines Zählers
Konstruktion von zwei Sichten
![Page 65: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/65.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Sichten als Beobachter
1051
public class View implements ActionListener,PropertyChangeListener {
private Counter counter; private JFrame frame; ... public View(Counter counter, int x, int y) { counter.addListener(this); ... }
public void propertyChange(PropertyChangeEvent event) { if (event.getSource() == counter &&event.getPropertyName().equals("count"))
... }}
![Page 66: Ein- und Ausgabe - userpages.uni-koblenz.delaemmel/oopm/slides/io.pdf · (C) Ralf Lämmel, OOPM, Universität Koblenz-Landau Ein- und Ausgabe Strombasierte Ein- und Ausgabe Die Klassenhierachie](https://reader030.fdocuments.net/reader030/viewer/2022041214/5e03336fd9e2ea2f20423aa8/html5/thumbnails/66.jpg)
(C) Ralf Lämmel, OOPM, Universität Koblenz-Landau
Zusammenfassung
Ein- und Ausgabe mit Strömen
Graphische Benutzeroberflächen
Ereignisse und Ereignisbehandlung
Ausblick
Weiterführende Themen der Objektorientierung
Prüfungsvorbereitung
Prüfung
Mehr Kurse