65
Ein- und Ausgabe OOPM, Ralf Lämmel http://www.zazzle.de/input_output_tshirt-235248123204113601 Quiz: Wo ist “Output”?

Ein- und Ausgabe - userpages.uni-koblenz.desoftlang/oopmcourse/slides/io.pdf · (C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau java.applet Applet-Programmierung java.awt

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Ein- und AusgabeOOPM, Ralf Lämmel

http://www.zazzle.de/input_output_tshirt-235248123204113601

Quiz: Wo ist “Output”?

(C) 2007-2018, Ralf Lämmel, 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) + ...

2

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Das Konzept der Ströme

3

Programm

Programm

ProgrammProgramm

Programm

Datei

Datei

Schreiben

in Datensenke

Lesen

aus Datenquelle

(C) 2007-2018, Ralf Lämmel, 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

4

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Beispiel: Addiere 2 Werte aus einer Datei!

5

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

(C) 2007-2018, Ralf Lämmel, 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

6

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Bibliotheksunterstützung für Ströme

7

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

(Basis-) Klassen für Ströme

File Datei- und Verzeichnisnamen InputStream Bytestrom zum Lesen OutputStream Bytestrom zum Schreiben RandomAccessFile Wahlfreier Zugriff auf Dateien mit Bytes Reader Zeichenstrom zum Lesen Writer Zeichenstrom zum Schreiben ...

8

(C) 2007-2018, Ralf Lämmel, 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

9

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Konstruieren von Strömen ausgehend 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)

10

Lies Bytes

Lies Zeichen

... mit Puffer

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Beispiel: Addiere 2 Werte aus einer Datei!

11

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Schreiben der Ausgabe in eine Datei

12

// Write the output file with a buffered writerBufferedWriter bw = new BufferedWriter(

new OutputStreamWriter( new FileOutputStream(output)));

// Write resultbw.write(value1 + " + " + value2 + " = " + sum);

// Done with the outputbw.close();

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Ausnahmebehandlung

13

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?

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Ausnahmebehandlung

14

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");}

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Die Schnittstelle von InputStream

Wichtigste Methoden read(): Lies ein Byte.close(): Strom schließen.

Weitere Methoden available(...): 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.

15

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Die Schnittstelle von Reader

Wichtigste Methoden read(): 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.

16

Das ist InputStream

modulo Umbennung.

(C) 2007-2018, Ralf Lämmel, 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.

17

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Beispiel: Unix’ more

18

Eingabe

Kommandozeilenarrgument

Name einer Textdatei

Ausgabe

Standardausgabe

Inhalt der Datei

Illustrationen zur Ein-/Ausgabesiehe Repository: oo.file

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 19

public class More {public static void main(String[] args)

throws IOException {// Obtain file name from command lineFile file = new File(args[0]);// Construct a buffered reader for the inputBufferedReader br = new BufferedReader(

new InputStreamReader(new FileInputStream(file)));

// Read from the input line by line and echoString line;while ((line = br.readLine()) != null) {

System.out.println(line);}// Donebr.close();

}}

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Die Schnittstelle von Writer

Wichtigste Methoden write(...): Schreibe ein Zeichen.close(): Strom schließen.flush(): Eventuell gepufferte Zeichen schreiben.

20

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

URLs und I/O

Klasse java.net.URL

Konstruktor

URL(String s)

Zuordnung eines Eingabestroms

openStream()

21

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Lesen aus einem URL

22

// 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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Ein- und Ausgabe auf höherer Ebene für den Zweck der Serialisierung von Objekten

23

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Persistente Objekte (bzw. Serialisierung)

DefinitionObjekte bleiben über Programmlaufzeit erhalten

Eine VorgehensweiseSerialisierung der Objekte vor ProgrammendeSpeicherung des Zustandes in Datei oder DatenbankWiederherstellung der Objekte in anderem Programmlauf

Siehe Schnittstelle java.io.Serializable

24

0101010100101 1010101010100 0101010110101

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

A serialized object

25

0101010010110100101010010101010101010100101001101010101001010100101010100101001001101001

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

A class of serializable objects

26

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Serialize an object

27

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.

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

De-serialize an object

28

Company sampleCompany;

FileInputStream fis = new FileInputStream(filename);

ObjectInputStream in = new ObjectInputStream(fis);

sampleCompany = (Company)(in.readObject());

in.close();

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Zugriff auf das Dateisystem

Testen von Datei-EigenschaftenLöschen von DateienAnlegen von VerzeichnissenLesen von Verzeichnissen

29

Hierarchisches Dateisystem (modulo Links)

(C) 2007-2018, Ralf Lämmel, 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?

30

(C) 2007-2018, Ralf Lämmel, 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.

31

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Verzeichnisse lesen (Klasse java.io.File)

File[] listFiles() Liste Dateien im Verzeichnis.

File[] listFiles(...) Filtere die Liste zusätzlich.

32

Beispiel: Wir wollen nun rekursiv alle Dateien ausgehend von einem Wurzelverzeichnis aus auflisten.

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 33

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);

}

}

}

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 34

/**

* A filter that accepts all non-hidden files.

*/

public class NotHiddenFilter implements FileFilter {

public boolean accept(File file) {

return !file.isHidden();

}

}

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Graphische Benutzeroberflächen

• Eingabe: Nutzereingabe

• Ausgabe: GUI-Sichten

• Wichtige Aspekte:

• Verwaltung der Daten in einem Modell (Objekten)

• Registrierung von Routinen zur Ereignisbehandlung

• Konstruktion der GUI-Komponenten

35

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Beispiel: “Exit” Funktion einer Applikation

36

System.out.println("Exiting ...");System.exit(0);

Siehe Repository: oo.gui

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 37

Demo!

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Bestandteile der “Exit”-Applikation

38

1.Konstruktion der GUI-Komponenten

2.Definition der Ereignisbehandlungsroutine

3.Handlerregistrierung bei der GUI

4.Aktivierung (Anzeigen) der GUI

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Konstruktion der GUI-Komponenten

39

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”

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Definition der Ereignisbehandlungsroutine

40

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Handlerregistrierung bei der GUI

41

b.addActionListener(new ExitAction());

das Button-Objekt

Schnittstellen-polymorphe Methode zur

Registrierung

Objekt welches die Behandlung bietet

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Aktivierung (Anzeigen) der GUI

42

f.setVisible(true);

Die GUI ist fertig konstruiert und konfiguriert. Damit kann sie projiziert werden und auf Ereignisse reagieren.

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Grundidee der Ereignisbehandlung

43

Auslöser des Ereignisses Ereignis Hörer des

Ereignisses

Deutsch EnglischEreignis EventAuslösen To triggerZuhörer Listener

Behandler Handler

Methode fürBehandlung

Aufruf

Registrierung

Erzeugung Verteilung

(C) 2007-2018, Ralf Lämmel, 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.

44

(C) 2007-2018, Ralf Lämmel, 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)

45

(C) 2007-2018, Ralf Lämmel, 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

46

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Komplexeres Beispiel: GUI-Interaktion mit einem Modell

47

ModellDaten der Applikation

Ein Zähler-ObjektGUI

“Sicht auf Modell” (View)Anzeige‣ Zählerstand

Aktionen‣ Step: Zähler erhöhen‣ Reset: Zähler zurücksetzen

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 48

Demo!

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Konstruktion der GUI-Komponenten mit Registrierung und Start der GUI

49

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 50

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Trennung von Modell und Sicht

51

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”).

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

GUI-Komponenten (Swing API) Die javax.swing.JComponent-Hierarchie

Im BeispielJFrame Eine umrahmtes FensterJPanel Container für Komponenten mit LayoutJButton Ein Button

WeitereJLabel TextkomponenteJList Auswahl aus einer ListeJTextField EingabefeldJComboBox Kombination aus Feld und ListeJSlider Wertauswahl mit Slider...

52

(C) 2007-2018, Ralf Lämmel, 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

53

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

GUI-Ereignisse: Klassenhierachie in java.awt.event

AWTEvent ActionEvent High-level, Komponenten-spezifische EreignisseAdjustmentEvent Ereignisse für anpassbare KomponentenComponentEvent Low-level, Komponenten-spezifische Ereignisse

FocusEventInputEvent

‣ MouseEvent- MouseWheelEvent

‣ KeyEventPaintEventWindowEvent

ItemEvent Selektieren / Deselektieren eines ItemsTextEvent Änderung des Textes eines Objektes

54

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

MouseEvent

55

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Zuhörer (Schnittstellen) für GUI events

56

Ereignis Zuhörer

ActionEvent ActionListener

MouseEvent MouseListener

... ...

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

MouseListener

57

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Mehrere GUI-Sichten auf ein Modell

58

Zähler-Objekt

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 59

Demo!

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Ereignisse zur Zustandsänderung von Objekten

Klasse PropertyChangeEventKonstruktorparameter

Object source String propertyName Object oldValue Object newValue

Schnittstelle PropertyChangeListenervoid propertyChange(PropertyChangeEvent e)

60

Zähler-Objekte sollten nun alle abhängigen Sichten

über Zustandsänderungen informieren.

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau 61

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Setter mit Benachrichtigung

62

private void setCount(int newValue) {

// Backup valueint oldValue = count;

// Do the updatecount = newValue;

// Construct the eventPropertyChangeEvent event =

new PropertyChangeEvent(this,"count",oldValue,newValue);

// Notify all subscribed listenersfor (PropertyChangeListener l : listeners)

l.propertyChange(event);}

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Verdrahten der Sichten und des Modells

63

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

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Sichten als Beobachter

64

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"))

...}

}

(C) 2007-2018, Ralf Lämmel, Universität Koblenz-Landau

Zusammenfassung Ein- und Ausgabe mit StrömenGraphische BenutzeroberflächenEreignisse und Ereignisbehandlung

Ausblick PrüfungsvorbereitungPrüfungMehr Kurse