new - beim Fachbereich Informatik
new - beim Fachbereich Informatik
new - beim Fachbereich Informatik
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Entwicklung nutzerorientierter<br />
Anwendungen<br />
ENA<br />
Wintersemester 2012/13<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling
Wenn Microsoft Autos bauen würde …<br />
� Die Warnlampen für Öldruck, Lichtmaschine, Benzin und andere wären<br />
durch eine einzige Warnlampe mit der Aufschrift „Allgemeiner<br />
Autofehler“ ersetzt .<br />
� Der Airbag würde bei einem Unfall „Sind Sie sicher?“ fragen, bevor er<br />
aufginge.<br />
� Das Lenkrad würde durch eine Maus oder einen Trackball ersetzt<br />
werden.<br />
�� Sie müssten sich Tastenkombinationen für „Bremsen“ merken.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 2
Wenn Microsoft Autos bauen würde …<br />
� Beim Versuch, das Auto zu starten, würden Sie oft die<br />
Fehlermeldung „Abbruch, Wiederholen, Ignorieren“ erhalten.<br />
� Der Tachometer würde 70 anzeigen, auch wenn Sie nur 40 km/h<br />
fahren.<br />
� Der Motor wäre nicht gleich nach dem Starten voll funktionsfähig.<br />
Stattdessen würde das Auto stehen bleiben und wieder losfahren,<br />
während der Motor versucht, die nötigen Zubehörteile<br />
anzuschrauben.<br />
�� Jedes Mal, wenn Sie einen neuen Fahrgast mitnehmen, müssten Sie<br />
die Zusammenstellung des Autos ändern. Diese würde natürlich<br />
auch erhalten bleiben, wenn der Passagier schon lange ausgestiegen<br />
ist.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 3
Benutzer sind nur Menschen!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 4
Entwicklung nutzerorientierter Anwendungen<br />
� Gestaltung von grafisch-interaktiven Systemen<br />
�� Bedürfnisse, Fähigkeiten und Erwartungen der (spezifischen)<br />
Endanwender stehen im Mittelpunkt<br />
� Endanwender identifizieren<br />
� Bedürfnisse befriedigen<br />
� Fähigkeiten unterstützen<br />
� Erwartungen erfüllen<br />
� Interdisziplinäres Gebiet (Psychologie, Design, Softwareentwicklung, ...)<br />
�� Usability steht in den verschiedenen Phasen im Vordergrund<br />
� Anforderungen erfassen und analysieren<br />
� Prototypen entwerfen, umsetzen, testen und reflektieren<br />
� Ergebnisse evaluieren<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 5
Überblick<br />
� „Java for Run-aways“<br />
�� Human Computer Interaction:<br />
� Usability<br />
Konsistenz, Intuitive Bedienbarkeit, Erlernbarkeit, ...<br />
� Layout<br />
Gestaltung/Farbe, Schrift, Anordnung<br />
� Entwurf: benutzerzentrierte Analyse, Design, Rapid Prototyping<br />
� Konstruktion unter Java/Swing mit Tool (eclipse):<br />
�� Componenten, Container, LayoutManager, Eventhandling<br />
� Programmiermuster<br />
� Model-View-Control, Observer<br />
� Beispiele in der Vorlesung: Trouble Tickets Systeme, Turtle Grafik<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 6
Lernziele der Veranstaltung<br />
� Grafisch-interaktive Benutzungsoberflächen (GO)<br />
�� Benutzerorientierung verinnerlichen<br />
(Benutzergruppen/Rollen identifizieren, Usability-Überlegungen einsetzen, ...)<br />
� intuitiv und ergonomisch gestalten<br />
� visuell ansprechend entwerfen<br />
� GO-Entscheidungen - Verwendung bestimmter Componenten -<br />
begründen können<br />
� objektorientiert konstruieren<br />
� gute GOs spiegeln sich im Entwurfs- und Realisierungsaufwand wider<br />
�� Methodisch Vorgehen lernen<br />
� Konzept der Ereignisorientierung verstehen<br />
� Bausteine grafischer Oberflächen (Componenten) kennen lernen<br />
� ... und das alles in Java und mit Swing<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 7
Inhalte<br />
� SW-Technik: Rollenerfassen, Nutzungsfall, Szenario, Screen-Diagramm<br />
�� Trennung Datenverarbeitung �� �� Oberfläche, Dokument ��> ��> Ansicht<br />
� MVC als Architektur- und Designpattern<br />
� Screen-Design und Ergonomie<br />
� Gruppierung, Formen, Farben, statisches/dynamisches Layout<br />
� Java Crash-Kurs für Kenner von C++<br />
� Implementierungstechniken<br />
� Bausteine: Datentypen, Attribute, Ereignisse<br />
� Fenster und Dialoge, Layout-Manager<br />
� Ereignisbehandlung<br />
� U.U. zusätzliche Klassen (Dateihandling, Serialisierung, …)<br />
� Gute Beispiele, schlechte Beispiele<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 8
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 9
Praktikum<br />
Semesterprojekt: Entwurf, prototypische Realisierung und Verfeinerung eines<br />
Systems<br />
� Problembewusstsein<br />
entsteht im Laufe des<br />
Semesters;<br />
optimierende Iterationen<br />
sind wichtig<br />
�� http://www.eclipse.org/downloads/ (und http://www.eclipse.org/archived/)<br />
� http://www.eclipse.org/windowbuilder/download.php<br />
� http://netbeans.org<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 10
Prüfung/Klausur<br />
� mit Papier und Kugelschreiber ☺<br />
� Am 04.02.2013 von 10.15 Uhr bis 11.45 Uhr; Raum siehe OBS<br />
(Anmeldung bis 20.01.2013; Abmeldung bis 31.01.2013)<br />
� regelmäßige Teilnahme am Praktikum – es sind 6 Termine -<br />
wird kontrolliert und ist Voraussetzung;<br />
Beginn am 18. (donnerstags) bzw. 19.10. (freitags)<br />
� alte Klausur vom Vorsemester und „Übungs-/Vorbereitungstermin“<br />
Tipp:<br />
Aktive Mitarbeit macht einen guten Teil der Prüfungsvorbereitung aus!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 11
Grundlagen-Literatur<br />
� http://www.javabuch.de<br />
Guido Krüger, Addison-Wesley, ISBN 3-8273-1949-8<br />
� http://openbook.galileocomputing.de/javainsel8/index.htm<br />
� http://www.dpunkt.de/java/index.html<br />
� http://www.java2s.com/Tutorial/Java/CatalogJava.htm und<br />
� http://java.sun.com/docs/books/tutorial/index.html<br />
� Sun: The Java Tutorial + Suchapplet<br />
http://java.sun.com/docs/books/tutorial/uiswing/components/components.html<br />
http://java.sun.com/docs/books/tutorial/information/download.html<br />
http://www.siteforum.com/sun/download/jtutorial_dfi.zip<br />
� Sun: Java 2 SDK API documentation + Suchapplet<br />
http://java.sun.com/products/jdk/1.3/index.html#docs<br />
http://www.siteforum.com/sun/download/jdk13_dfi.zip<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 12
Weiterführende Literatur<br />
� Bernhard Preim: Entwicklung interaktiver Systeme<br />
� Ivo Wessel: GUI-Design<br />
� Alan Cooper: About Face - The Essentials of User Interface Design<br />
� Sun: Java Look and Feel Design Guidelines<br />
� Online http://java.sun.com/products/jlf/dg/index.htm<br />
� Sun: Sonstiges rund um Java<br />
�� http://java.sun.com/docs/<br />
� Helmut Balzert: Lehrbuch Grundlagen der <strong>Informatik</strong><br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 13
Analyse-Design-Realisierung-Test-Evaluation<br />
Den gesamten Prozess<br />
Analyse<br />
wollen wir im Praktikum<br />
�� Benutzorientiertes RequirementsEngineering: zumindest einmal<br />
Usability-Engineering<br />
durchlaufen.<br />
� Heuristic – GUI wird ohne Benutzer(in) testet und bewertet<br />
� Observation – Benutzer(in) wird <strong>beim</strong> Bedienen beobachtet<br />
� Thinking-Aloud – Beim Bedienen denkt der Benutzer „laut“ und<br />
äußert sich so zusätzlich<br />
� Questionnaire – mit Hilfe eines Fragebogens werden Information<br />
über den Benutzer, die Wünsche und Anforderungen gesammelt<br />
� Interview – Befragung, Stärken und Schwächen werden<br />
herausgearbeitet<br />
� U.U. Erarbeitung von Anwendungswissen<br />
� U.U. Erarbeitung von zusätzlichem technischem (Hintergrund-)Wissen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 14
Analyse-Design-Realisierung-Test-Evaluation<br />
Design<br />
� Legen Sie Designziele fest<br />
� Welche Benutzergruppen adressieren Sie?<br />
� Entlasten Sie den Benutzer!<br />
� Beschreiben Sie Anwendungsszenariien und Use Cases<br />
� Skizzieren Sie das Layout (es sollte dynamisch sein)<br />
� Überlegen und begründen Sie Gestaltungsentscheidungen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 15
Analyse-Design-Realisierung-Test-Evaluation<br />
Realisierung<br />
� Entwickeln Sie die Funktionalität getrennt von der GUI!<br />
� Überlegen Sie, wie Sie Funktionalität und Dialog(Controls) koppeln:<br />
Model-View-Control<br />
� Denken Sie auch an<br />
� die Navigation im Systeme,<br />
� die Arbeitsabläufe und<br />
�� den generellen Workflow<br />
� Rapid Prototyping:<br />
� iterativ, unter Einbeziehung der Nutzer<br />
� Früh Machbarkeit demonstrieren<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 16
Analyse-Design-Realisierung-Test-Evaluation<br />
Test<br />
� Wer von Ihnen würde ein nicht getestetes Programm benutzen?<br />
� Überlegen Sie von Beginn an Testfälle<br />
� Wie lange dauert es, um eine bestimmte Aufgabe zu lösen?<br />
� Wie viele Klicks/Interaktionen werden benötigt, um die Aufgabe<br />
zu lösen?<br />
� Wie schnell erlernbar ist das GUI?<br />
�� Wie viele Fehler werden gemacht? Wie sicher ist die GUI?<br />
� Testen Sie die Gebrauchstauglichkeit (Usability)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 17
Analyse-Design-Realisierung-Test-Evaluation<br />
Evaluation der Umsetzung<br />
� Welche Ziele werden erreicht?<br />
� Wie gut werden Ziele erreicht?<br />
� Evaluationsmethoden:<br />
� Experteninspektionen, kognitiver Walkthrough, Usability-Tests,<br />
Fragebogenverfahren<br />
�� Klassifikation von Evaluationsmethoden:<br />
analytisch vs. empirische bzw.<br />
deskriptiv vs. präskriptive Evaluationsmethoden<br />
� Formen der Evaluation: summative und formative Evaluation<br />
� Bestimmung von Evaluationskriterien<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 18
Bedeutung der Entwurfsphase<br />
� Beim Entwurf und der Realisierung muss insbesondere in der Praxis<br />
darauf geachtet werden, dass<br />
� das Projekt<br />
„in-time“ und „in-budget“<br />
bleibt und<br />
� die User Requirements erfüllt werden.<br />
… muss auch etwas mit<br />
Qualität zu tun haben<br />
�� Fehler in der Analyse und Konzeption haben dabei dramatische<br />
Auswirkungen auf die beiden erstgenannten Punkte!<br />
� Ein erstes, wichtiges Ziel muss also sein, die Anforderungen der<br />
Benutzer richtig und vollständig zu erfassen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 19
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling
Softwaretechnik für User Interfaces<br />
Arten von Applikationen<br />
� U-Software in Anlehnung an<br />
� Spiele<br />
U- und E-Musik<br />
� Funware<br />
� Heim-Software<br />
� E-Software<br />
� Office-Anwendungen<br />
� Kommerzielle Datenverarbeitung<br />
fließende Übergänge<br />
• in diesem Stil machen wir das Praktikum !<br />
� Inhouse-Applikationen<br />
� Maschinensteuerungen<br />
Kiosksysteme,<br />
POI (Point of Interest),<br />
POS (Point of Sales)<br />
Hoher GO/UI Anteil<br />
� wohin gehören Fahrplanauskunft, Geldautomat, Ticketservice, ... ?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 21
Gelegenheit, über Usability nachzudenken<br />
� Ständiger Technologiewandel verlangt permanente<br />
Auseinandersetzung mit Organisationsabläufen und den Systemen<br />
� Anstehende System- oder Versionswechsel sind zusätzlich günstige<br />
Zeitpunkte, dabei müssen gerade die unterschiedlichen Nutzer<br />
überzeugt und mitgenommen werden<br />
� Bereitschaft, sich mit Arbeitsabläufen und der Einbindung von<br />
IT - Prozessen auseinander zusetzen mit dem Ziel<br />
� Produktivität/Wirtschaftlichkeit zu steigern<br />
�� Ressourcen zu schon und Kosten (Durchlaufzeit) zu reduzieren<br />
� Qualität und Kundenzufriedenheit zu verbessern<br />
� Neben den Aspekten Preis, Lizenzen, Standards, branchentypischen<br />
Lösungen, verkauften Systemen, Schnittstellen und Integration spielt<br />
die Nutzerzufriedenheit eine wichtige Rolle<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 22
Mensch-Maschine-Schnittstelle -<br />
Graphische Benutzungsoberfläche<br />
kreativ, intuitiv<br />
Beobachten,<br />
Bedienen<br />
Interaktion<br />
Präsentation,<br />
Visualisierung<br />
monoton, schnell<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling
Phänomene nicht nur im Zusammenhang<br />
mit grafischen Benutzungsoberflächen (1/2)<br />
Kognitive Dissonanz<br />
� entsteht, wenn man zwischen verschiedenen Alternativen wählen<br />
muss und die Vor- und Nachteile dieser Systeme abwägt.<br />
� Hat man eine Entscheidung getroffen, ist man bemüht, sich zu<br />
versichern, dass man die richtige Wahl getroffen hat und nimmt<br />
Argumente besonders wahr, die die Entscheidung unterstützen und<br />
verharmlost/ignoriert Gegenargumente.<br />
� Beispiel:<br />
� Festhalten an möglicherweise kryptisch und schwer zu<br />
benutzenden oder teueren Systeme<br />
� Anordnung der Tasten auf der qwertz-Tastatur<br />
[Alternative siehe z.B. http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard ] ...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 24
Phänomene nicht nur im Zusammenhang<br />
mit grafischen Benutzungsoberflächen (2/2)<br />
Magisches Denken<br />
� bezieht sich darauf, dass sich Benutzer eine Vorstellung (mentales<br />
Modell) von dem System/Geräte machen, mit dem sie arbeiten.<br />
Diese hängt von der Erfahrung und Vorbildung ab.<br />
� Die Modelle sind so konstruiert, dass sie Analogieschlüsse zulassen:<br />
„wenn das Mail-Tool geöffnet ist, stürzt die Textverarbeitung bei<br />
der Rechtschreibprüfung ab“<br />
�� Benutzer sind sehr bemüht an diesen Modellen festzuhalten;<br />
auch dann wenn gedankliche Verrenkungen nötig werden:<br />
„wenn das Mail-Tool offen ist und mehr als zehn neue Mails<br />
eingetroffen sind, dann stürzt die Textverarbeitung ab“<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 25
Entwickler und Anwender … (1/4)<br />
… spielen einen neuen Dialog durch:<br />
Entwickler: … So, jetzt hast Du einen Teil der Aufgabe bereits<br />
ausgeführt. Willst Du nun noch etwas verändern?<br />
Anwender: Ja, ich möchte eine Komponente löschen. Was muss ich tun?<br />
E: Deute auf das Menu mit dem Namen ‘CD‘.<br />
A: CD ?<br />
E: CD bedeutet ‘Component Delete‘.<br />
A: OK, ich habe verstanden … Oh, was passiert jetzt?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 26
Entwickler und Anwender … (2/4)<br />
E: Du bist jetzt im Analyse-Modus.<br />
Du musst aus Versehen ‘AM‘ ausgewählt haben.<br />
A: Ach so, ich dachte, ich hätte ‘CD‘ ausgewählt.<br />
Wie verlasse ich den Analyse-Modus?<br />
E: Kein Problem. Gib einfach ‘control Q‘ ein.<br />
A: [tippt C O N T R O L …]<br />
E: Nein! Drücke die ‘Strg‘-Taste und die ‘Q‘-Taste.<br />
A: Wie dumm von mir. … Ich versuch‘s noch einmal.<br />
… Es passiert gar nichts. Was habe ich falsch gemacht?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 27
Entwickler und Anwender … (3/4)<br />
E: Du hast nichts falsch gemacht. Die Komponente ist gelöscht aber<br />
noch nicht vom Bildschirm entfernt. Gib noch ‘control-J‘ ein.<br />
A: Ich habe verstanden. Wenn ich die nächste Komponente lösche, gebe<br />
ich wieder ‘control-Q‘ ein.<br />
… Hoppla, warum ist der Bildschirm jetzt weiß?<br />
E: Du hast nur ‘Q‘ eingegeben. ‘Q‘ bedeutet Quit und beendet das<br />
Programm. Jetzt musst Du leider alles noch einmal eingeben!<br />
A: Wenn das so ist, machen wir nächste Woche weiter.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 28
Entwickler und Anwender … (4/4)<br />
Folgende Fehler wurden gemacht:<br />
� Kommandos (CD, AM) sind nicht intuitiv<br />
� erzeugt unnötige Belastung für den Anwender<br />
� Auf welches Objekt wird das Kommando angewendet?<br />
� Keine Statusinformation zu Zustandsänderungen<br />
� Kryptische Kommandos (control-J, control-Q) sind ungeeignet für<br />
unerfahrene, gelegentliche Benutzer<br />
�� Kein Feedback bei Delete<br />
� erzeugt Frustration und Ablehnung bei dem Anwender<br />
� ergibt Negativausstrahlung auf das Gesamtsystem<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 29
Allgemeine Tipps (1/4)<br />
� Unklare Verwendung von Dialogbausteine:<br />
� Element sieht aus wie ein Buttons, es löst aber keine Aktion aus<br />
� Für exklusive Alternativen werden keine Radiobuttons verwendet<br />
� Anwender reagieren sensibel auf diese Inkonsistenzen<br />
� Zu wenig oder kein Feedback<br />
� Aktionen (Suchen, Filtern, …) müssen bestätigt werden<br />
� Hinweise auf fehlerhafte Eingaben sollten in räumlicher und<br />
zeitlicher Nähe erfolgen<br />
� Meldungen müssen einen Hinweis auf die Fehlerursache geben<br />
bzw. einen Tipp auf die korrekte Eingabe geben<br />
� Anwender können nur so den nächsten Schritt planen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 30
Allgemeine Tipps (2/4)<br />
� Unüberwindbare Formulare:<br />
�� Die Felder sind zu klein für die Texte<br />
� Tabulatorweiterschaltung ist nicht umgesetzt<br />
� Die Reihenfolge ist nicht sinnvoll<br />
� Standardtasten (z.B. Enter-Taste) ist nicht erwartungskonform<br />
� Anwender ist irritiert und erwartet doch Standardverhalten<br />
� Abfrage zu vieler Daten an der falschen Stelle<br />
� Das Anlegen eines Konto etwa vor der ersten (Produkt-)Auswahl<br />
ist eher hinderlich als verkaufsfördernd<br />
� Voreinstellungen sinnvoll wählen<br />
� Vorseinstellungen können Interaktionen beschleunigen<br />
� Hinweise geben, wie Felder auszufüllen sind<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 31
Allgemeine Tipps (3/4)<br />
� Umständliche und zu lange Texte vermeiden<br />
�� Kurz und prägnant formulieren<br />
� Aufforderungen, Meldungen und Hinweise leicht verständlich<br />
angeben<br />
� Bestätigungen sollten klar erkennbar sein und leicht aufzufinden<br />
sein<br />
� Konventionen überraschen den Anwender nicht;<br />
er „weiß“, was passiert und kann der Anwendung vertrauen<br />
�� Bedienoberflächen sind kein Selbstzweck!<br />
Sie sollen helfen, die Aufgabe<br />
� effizient (mit geringem Aufwand) und<br />
� effektiv (Aufgabe vollständig lösen)<br />
zu erledigen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 32
Allgemeine Tipps (4/4)<br />
� Eine gute Bedienoberfläche kann man nicht „berechnen“<br />
� Eine gute Bedienoberfläche muss man „erfahren“<br />
� Eine geeignete Methode,<br />
� um die Ideen der Entwickler zu demonstrieren und<br />
� deren Umsetzbarkeit zu belegen<br />
und auch<br />
� um die Anwender frühzeitig zu beteiligen<br />
ist die Erstellung eines Prototypen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 33
Ziele (1/2)<br />
� Benutzerführung gemäß Regeln<br />
� Motto: Fehlervermeidung statt Fehlerbehebung<br />
� Trennung von Anwendung und graphischer Benutzungsoberfläche<br />
� Einheitliches Look-and-Feel<br />
� Innerhalb einer Applikation und applikationsübergreifend<br />
� einfache Anpassung von Text und Schrift;<br />
relative Positionierung ist zusätzlich sehr hilfreich:<br />
„Componente C1 links von C2 und oberhalb von C3“<br />
� Methode<br />
Dialoge mit Hilfe von Zustände und<br />
Objekthierarchien (z.B. Fenster) modellieren<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 34
Ziele (2/2)<br />
� Aufgabenangemessene Präsentation und Interaktion<br />
� Direkte Manipulation<br />
� Benutzerunterstützung <strong>beim</strong><br />
� Gestalten und Steuern<br />
� Erstellen und Modifizieren<br />
� Inspizieren und Prüfen<br />
� Navigation(sunterstützung) in komplexen Situationen<br />
�� Beherrschung der Komplexität und Menge durch<br />
Informationsaufbereitung: selbsterklärend, kontextbezogene Hilfe<br />
� Realitätsnähe �� Abstraktion<br />
� Joy of Use: begeistern, stimulieren, motivieren, überzeugen, fesseln, ...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 35
Usability-Kriterien<br />
� Usability-Kriterien sind:<br />
�� Effizienz (Efficiency)<br />
• Wenig Interaktion (Benutzer entlasten)<br />
• Fokussteuerung an Hauptabläufen orientiert (Benutzer führen)<br />
� Effektivität (Effectiveness)<br />
• Können alle Aufgaben vollständig gelöst werden?<br />
� Erlernbarkeit (Learnability)<br />
• Kann die BO aus der Benutzererfahrung heraus bedient werden?<br />
�� Erinnerbarkeit (Memorability)<br />
• Kann man die BO nach einer gewissen Zeit noch sicher bedienen?<br />
� Zufriedenheit/Wohlbefinden/Spaß (Satisfaction; Emotional Usability)<br />
• Gestaltung, Feedback, Klarheit<br />
� Fehlersituation durch Bedienung (Error)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 36
Usability-Aspekte<br />
� Struktur (Layout, Design) planen und festlegen<br />
� Dazu gehört auch<br />
• Elemente identifizieren<br />
• Elemente sinnvoll benennen („Sprache der Nutzer sprechen“)<br />
• Skizze erstellen und<br />
schrittweise (zunächst abstrakt dann konkret) verfeinern<br />
� An Anforderungen orientiert:<br />
• Welche Aufgaben möchte der Benutzer lösen<br />
� An Aufgaben und Bedürfnissen der unterschiedlichen<br />
Benutzergruppen angemessen<br />
• Welche unterschiedlichen Benutzergruppen gibt es?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 37
Emotional Usability: Joy of Use<br />
� Merkmale<br />
� Die Software muss den Benutzer unauffällig unterstützen, indem es<br />
interessante Funktionen als zu lösende Aufgaben präsentiert und<br />
Neugier weckt sowie Anreiz zum eigenständigen Lernen gibt<br />
� Die Aufgabenstellung wird in eine Geschichte integriert<br />
(und die Bearbeitung einer Teilaufgabe ist ein Schritt in einer<br />
größeren Aufgabenstellung).<br />
� Die Glaubwürdigkeit der Arbeitswelt wird durch Konsistenz und<br />
Aufmerksamkeit für Details gesichert<br />
(� Erwartungskonformität).<br />
Quelle: Marc Hassenzahl: Attraktive Software – Was Gestalter von Computerspielen<br />
lernen können; In: J Machate&M.Burmester: User Interface Tuning;<br />
Benutzerschnittstellen menschlich gestalten; Software & Support Verlag 2003<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 38
Componenten und Events<br />
� Componenten (Dialogbausteine) und Events (Dialogbausteine)<br />
spielen eine zentrale Rolle in grafischen Benutzungsoberflächen<br />
� Dabei wird ein wiederkehrendes Entwurfsmuster angewendet:<br />
Observer-Pattern<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 39
Observer Pattern (1/4)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 40
Observer Pattern (2/4)<br />
� Objekte werden über Zustandsänderungen informiert. Gleichzeitig<br />
soll eine möglichst geringe Kopplung zwischen den beteiligten<br />
Objekten bestehen.<br />
� Typisches Anwendungsbeispiel ist, dass es zu einem Objekt<br />
verschiedene Sichten (Views) gibt, die synchron über Veränderungen<br />
informiert werden.<br />
� Dabei übernehmen die Sichten die Rolle des Beobachters<br />
(Observers) und das Objekt (Observable) selbst wird beobachtet.<br />
� Es ergeben sich markante Muster zwischen den beteiligten<br />
Objekten:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 41
Observer Pattern (3/4)<br />
� Das beobachtete Objekt verfügt über die folgenden Methoden:<br />
� add – füge Beobachter hinzu,<br />
� remove – entferne Beobachter,<br />
� notify – benachrichtige Beobachte,<br />
� get – erfrage Objektzustand und<br />
� set – setze Objektzustand<br />
� Das beobachtende Objekt verfügt über Methode(n) zum Aktualisieren<br />
der Sicht (z. B. refresh).<br />
� Das Objekt kennt seine Beobachter nicht<br />
� Das Pattern wird entweder durch Vererbung umgesetzt oder<br />
durch Implementierung einer Schnittstelle (interface) realisiert.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 42
Observer Pattern (4/4)<br />
� In der konkreten Situation benachrichtigt das überwachte Objekt alle<br />
Beobachter (Broadcast)<br />
� Jeder Beobachter entscheidet für sich, wie er mit der Information<br />
umgeht;<br />
ggfls. können zusätzlich verschiedene Ereignisse unterschieden<br />
werden<br />
� In komplexen Situation (z. B. bei Tabellen) kann es auch zu unnötigen<br />
Aktualisierungen kommen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 43
Wie wird das Oberserver-Patern unter<br />
Java/Swing umgesetzt?<br />
� Die Componenten können überwacht werden:<br />
� _____________________<br />
_____________________<br />
� Beobachter werden angemeldet/registriert:<br />
� _____________________<br />
_____________________<br />
� Ereignisse werden an die Beobachter gemeldet:<br />
�� _____________________<br />
_____________________<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 44
Observer Pattern – Codemuster (1/3)<br />
import java.util.Observer;<br />
public class Hauptprogramm {<br />
public static void main(String[] args) {<br />
ApplModel ap = <strong>new</strong> ApplModel();<br />
Beobachter b1 = <strong>new</strong> Beobachter();<br />
Beobachter b2 = <strong>new</strong> Beobachter();<br />
ap.addObserver(b1);<br />
ap.addObserver(b2);<br />
// löst Benachrichtigung aus:<br />
ap.setValue("Observer Test");<br />
}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 45
Observer Pattern – Codemuster (2/3)<br />
// Observable<br />
// stellt die Methoden addObserver, notifyObservers bereit<br />
import java.util.Observable;<br />
import java.util.Observer;<br />
public class ApplModel extends Observable<br />
{<br />
private String value;<br />
ApplModel() { value = “ “; }<br />
public void setValue(String s) {<br />
value = s;<br />
setChanged(); // z.B. Flag setzen<br />
notifyObservers(value); // Beobachter informieren<br />
}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 46
Observer Pattern – Codemuster (3/3)<br />
import java.util.Observable;<br />
import java.util.Observer;<br />
public class Beobachter implements Observer {<br />
}<br />
// Methode muss objektspezifisch realisiert werden<br />
public void update(Observable am, Object value) {<br />
}<br />
System.out.println("update: " + am + " " + value);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 47
Umsetzung des Observer Patterns<br />
� Wie müssen die Methoden addObserver und notifyObservers<br />
implementiert sein?<br />
� _____________________<br />
_____________________<br />
_____________________<br />
_____________________<br />
_____________________<br />
_____________________<br />
�� Wie müssen Sie das bei der GUI-Programmierung unter Java/Swing<br />
umsetzen?<br />
� _____________________<br />
_____________________<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 48
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 49
Java Crash-Kurs: Interpreter-Prinzip<br />
� Compiler übersetzt Quellcode in Byte Code<br />
� Quellcode in .java-Datei<br />
� Bytecode in .class-Datei<br />
� Bytecode ist hardware-unabhängiger Befehlssatz für einen<br />
Interpreter<br />
• wird z.B. im Internet übertragen<br />
�� Java Virtual Machine interpretiert Byte Code<br />
� teilweise zur Geschwindigkeitssteigerung:<br />
Just-In-Time-Compiler übersetzt Byte Code<br />
in Maschinencode der Zielhardware<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 50
"Java ist streng objektorientiert"<br />
� In Java gibt es<br />
�� dynamische Feldobjekte<br />
� Laufzeitkontrolle (bzgl. Typen als auch bzgl. Feldgrenzen)<br />
� Systemunabhängige Festlegung der elementaren Datentypen<br />
� Garbage Collection ist Bestandteil der Sprache<br />
� "keine" Pointer �� alle Objektvariable sind Pointer<br />
� kein call-by-reference<br />
� keine structs<br />
� kein Dereferenzieren<br />
�� keines Pointerarithmetik<br />
� spezielle Klassen zur Unterstützung der (einfachen) Entwicklung<br />
internetbasierter Anwendungen<br />
(Client-Server Komponenten: Applets und Servlets)<br />
� Hauptprogramme verlieren an Bedeutung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 51
Java ist streng objektorientiert!<br />
Java = C++--<br />
� Klassen, Objekte, Konstruktoren, Instanziierung wie unter C++<br />
Syntax fast wie unter C++ (aber konsequenter)<br />
� Vererbung/Inheritance<br />
� Polymorphismus: gleicher Methodenname in unterschiedl. Klassen<br />
� Überladen:<br />
• gleicher Methodenname in gleicher Klasse bei unterschiedl.<br />
Parametern (Typ/Anzahl)<br />
� kein Überladen von Operatoren<br />
('+' hat immer die Bedeutung einer Addition; Ausnahme: Strings)<br />
� "keine" Multiple Inheritance sondern interfaces<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 52
“plattformunabhängig“<br />
<strong>Informatik</strong>ervision<br />
� gut: Wertebereiche primitiver Datentypen sind festgelegt<br />
� die Sprache ist meist nicht das Problem, sondern die Bibliotheken<br />
� AWT 1.0, AWT 1.1, Swing, SWT<br />
� vgl. MFC, OWL, Qt<br />
� Zugriff auf Betriebssystemfunktionen<br />
� die Implementation der Virtual Machine und ihrer Bibliotheken wird<br />
zur neuen Plattform<br />
�� VMs von Sun, Netscape, Microsoft, ...<br />
� Versionsnummern ...<br />
� hohe HW-Anforderung: viel Rechenleistung, viel RAM<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 53
“sicher“<br />
� etliche Methoden mittlerweile "deprecated„ (ablehnen, missbilligen),<br />
weil "inherently unsafe"<br />
� z.B. Thread.stop(), Runtime.runFinalizersOnExit(...)<br />
� Ausführungszeitpunkte von finalize und garbage collector undefiniert<br />
� Zuweisungen für double und long (64-Bit-Werte) sind nicht atomar<br />
� d.h. können als 2 Maschinenbefehle implementiert und damit<br />
unterbrechbar sein (müssen aber nicht)<br />
Programmierer machen in jeder Sprache Fehler...<br />
� Sie sind nicht von Ihrer Sorgfaltspflicht entbunden!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 54
“ausgereift“<br />
� große Zahl von "deprecated" Klassen, Feldern und Methoden<br />
� grundlegender Wechsel der Ereignisverarbeitung<br />
von 1.0 auf 1.1<br />
� Java war ursprünglich für kleine Anwendungen gedacht; wurde dann<br />
zur Universalsprache mit vielen Spezialbibliotheken ausgebaut<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 55
Dateitypen und Tools<br />
auch IDE mit<br />
GUI-Editor<br />
�<br />
�<br />
�<br />
Bibliotheken<br />
LIB<br />
LIB class<br />
jar<br />
mindestens<br />
eine Klasse<br />
enthält main<br />
Editor java Compiler class Virtual Machine<br />
Editor java Compiler<br />
class<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 56
Java Development Kit (JDK)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 57
Entwicklung mit JDK<br />
� JDK enthält alle nötigen Werkzeuge<br />
� Aufruf von der Kommandozeile (DOS-Box)<br />
� Vorgehensweise<br />
� MeineKlasse.java mit Notepad erstellen<br />
� JAVAC MeineKlasse.java<br />
• Compiler-Aufruf; erzeugt MeineKlasse.class<br />
� SET CLASSPATH=vollständigerPfadname oder auch<br />
SET CLASSPATH=.<br />
• damit die Java VM weiß, wo sie die Klassen suchen soll<br />
� JAVA MeineKlasse<br />
• Aufruf der Java Virtual Machine (Interpreter)<br />
• MeineKlasse muß eine Methode main enthalten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 58
Entwickeln mit<br />
Eclipse<br />
�� Project View<br />
� zugehörige Dateien (Klassen)<br />
� Structure View (dateibezogen)<br />
� Source Klasse, Attribute,<br />
Methoden, Importe<br />
� Design Elemente der GUI-Oberfläche<br />
� Content View<br />
�� Source Text-Editor für mehrere Dateien<br />
� Design Quelltext, grafischer Editor<br />
� Doc Dokumentation wenn vorhanden<br />
� Message View<br />
� Meldungen von Compiler und VM<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 59
„Hello, World“<br />
public class hello { // Datei: hello.java<br />
public static void main(String[] args) {<br />
System.out.println ("Hello, World!");<br />
}<br />
}<br />
� jede .java-Datei enthält genau eine public Klasse<br />
� Klassenname = Dateiname; Groß-/Kleinschreibung beachten !<br />
�� weitere Klassen ohne Angabe von public sind möglich<br />
� die Java VM braucht ein Klasse mit einer Methode main als Start<br />
� es gibt keine freistehenden Funktionen/Methoden<br />
(in einer objektorientierten Programmiersprache)<br />
� in String[] args werden Kommandozeilenparameter übergeben<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 60
Ausgabe auf die Konsole<br />
public class System {<br />
public static PrintStream out;<br />
}<br />
public class PrintStream extends FilterOutputStream {<br />
public void println(String x) {...}<br />
public void println(Object x) {...}<br />
}<br />
� der println-Aufruf verwendet obige Klassen der Standardbibliothek<br />
System.out.println ("Hello, World!");<br />
� println ist überladen für alle einfachen Datentypen boolean, int, ...<br />
� jede Klasse, die von Object abgeleitet ist, hat eine Methode, die eine<br />
Textdarstellung des Objekts abliefert: String toString()<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 61
Konsole vs. GUI/GO (I)<br />
„Hello, World“ ist das Programm, das immer wieder als erstes Beispiel<br />
herangezogen wird:<br />
#include <br />
main ()<br />
{ cout
Konsole vs. GUI/GO (II)<br />
� Aus heutiger Sicht stellt sie die Situation wie folgt dar:<br />
�� Verschiedene Programme konkurrieren nicht nur um Speicherplatz und<br />
Prozessorleistung sondern auch um die Darstellungsfläche<br />
� Woher kann das Programm wissen, wo (in welchem Kontext) der String<br />
ausgegeben werden soll?<br />
� An welcher Position soll der Text ausgeben werden?<br />
Wenn der Text zentriert ausgeben werden soll, dann müssen zusätzlich<br />
gerätespezifische Control-Codes angegeben werden<br />
� Kann das gleiche Programm mehrfach gestartet werden und<br />
ablaufen ohne dass es sich gegenseitig stört?<br />
�� Wenn das Programm beendet wurde, ist dennoch die Ausgabe sichtbar.<br />
Die Ausgabe wird nicht aufgeräumt.<br />
� Das „Hello, World“-Programm wurde in einer Zeit geschaffen als man ein<br />
noch sehr einfaches Modell/Verständnis von Interaktion und Präsentation<br />
hatte.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 63
Die einfachste GUI-Applikation<br />
� Hauptfensterklasse abgeleitet von JFrame (extends)<br />
� Referenz auf einziges Objekt als Klassenvariable ( (static) )<br />
� wird von main-Funktion erzeugt<br />
� Konstruktor gibt Fensterereignisse frei (setvisible();...)<br />
� processWindowEvent ist zugehörige Behandlungsroutine<br />
� beendet Java VM mit System.exit();<br />
� Untergeordnetes Objekt von JPanel (Fläche, Armaturenbrett)<br />
�� wird mit add der contentPane (Scheibe, Fläche) zugeordnet<br />
� Initialisierung diverser Attribute der visuellen Komponenten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 64
GUI-Applikation mit Eclipse<br />
� Applikationsklasse enthält eine main-Methode<br />
� diese wählt das Look & Feel<br />
� diese erzeugt das Applikationsobjekt<br />
� der Konstruktor des Applikationsobjekts erzeugt das Hauptfensterobjekt<br />
und macht es sichtbar<br />
� Fensterklasse ist abgeleitet von javax.swing.JFrame<br />
� erzeugt und verwendet ein Border-Layout<br />
�� gibt sich eine feste Fenstergröße<br />
ohne gibt es ein<br />
statisches Layout<br />
� überschreibt processWindowEvent, um <strong>beim</strong> Schließen des<br />
Fensters durch System.exit(0) die VM zu beenden<br />
nicht am Ende von main ! – warum?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 65
Allgemein<br />
� package (1. Anweisung in der Datei) ordnet eine Klasse einem Paket (=<br />
Gruppe von logisch zusammenhängenden Klassen) zu<br />
� Die Import Anweisung macht die entsprechende Klasse<br />
sichtbar/verfügbar<br />
� instanceof - testet, ob ein Objekt Instanz einer best. Klasse ist:<br />
... if (obj instanceof class) ...<br />
� int, float, double, boolean, … sind intrinsic (= elementarer<br />
Bestandteil), Wrapper-Klassen (Integer, Float, Double, Boolean, …)<br />
existieren etwa für Typumwandlungen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 66
Bibliotheken: Packages<br />
� Package ist ein Ordner im Dateisystem<br />
� enthält mehrere .java-Dateien und Subpackages (=Unterordner)<br />
� Zugehörigkeit zu Package package meinpackage;<br />
� Import-Anweisung macht andere Packages verfügbar<br />
� eine Klasse: import java.util.ArrayList;<br />
� alle Klassen: import java.util.*;<br />
� alle Klassen mit Kurzreferenz: import java.util;<br />
Kurzreferenz ist dann: util.ArrayList;<br />
� weltweit eindeutige Namen für wichtige Packages<br />
� package de.h-da.fbi.projekt.meinpackage;<br />
� spiegelt die Schachtelung der Ordner wider<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 67
Klassen<br />
public class NeueKlasse extends Basisklasse { ... }<br />
�� Konstruktor<br />
� Vorinitialisierungsliste gibt es nicht<br />
� super(...) ruft den Konstruktor der Basisklasse auf<br />
� Attribute können an der Deklarationsstelle<br />
oder im Konstruktor initialisiert werden<br />
Ableitung<br />
� alle Methoden sind standardmäßig virtuell<br />
�� Schlüsselwort final (="nicht-virtuell") verhindert<br />
Überschreiben<br />
� keine separaten Header-Dateien<br />
� jede Klasse kann zum Testen eine main-Methode haben<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 68
Mutter aller Klassen: class Object<br />
� viele Klassen sind (indirekt) von class Object abgeleitet<br />
public class Object<br />
{<br />
public String toString() {...}<br />
//liefert Textdarstellung des Objekts<br />
public boolean equals(Object obj) {...}<br />
// vergleicht Objekt-Inhalte<br />
protected Object clone() // dupliziert das Objekt<br />
throws CloneNotSupportedException {...}<br />
protected void finalize()// Aufruf vor der Garbage Collection<br />
throws Throwable {...}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 69
Klassenhierarchie<br />
class NeueKlasse extends Basisklasse<br />
implements Interface1, Interface2<br />
� keine Mehrfachvererbung, nur Einfachvererbung<br />
� aber Implementierung mehrerer interfaces möglich<br />
� damit wird das Problem in verschiedenen Basisklassen eventuell<br />
doppelt vorhandener Elementvariablen umgangen; virtuelle<br />
Ableitung ist daher überflüssig<br />
� Besonderheiten<br />
�� eine Klasse muss mit abstract markiert werden, wenn sie<br />
abstract Methoden enthält<br />
� eine abstract Klasse kann nicht instantiiert werden!<br />
� eine Klasse, die als final markiert ist, kann nicht mehr als<br />
Basisklasse dienen!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 70
Objekte<br />
� Objekte werden immer dynamisch allokiert<br />
� <strong>new</strong> liefert einen Zeiger auf das neue Objekt<br />
� Klasse Objektreferenz = <strong>new</strong> Klasse (Parameter);<br />
� delete gibt es nicht<br />
� dynamisch allokierter Speicher wird automatisch vom Garbage<br />
Collector freigegeben, nachdem kein Zeiger mehr darauf zeigt<br />
� der Aufrufzeitpunkt des Garbage Collector ist undefiniert;<br />
das Laufzeitsystem macht das irgendwann<br />
� Destruktor gibt es nicht<br />
� stattdessen Methode protected void finalize();<br />
� Aufruf von dem Garbage Collector – d.h. unter Umständen nie !<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 71
Zur Lebensdauer von Objekten<br />
„Tricks“ im generierten Code<br />
� grundsätzlich existiert ein Objekt in Java so lange, wie eine Referenz<br />
darauf existiert !<br />
� manchmal auch ein bisschen länger,<br />
wie es dem Garbage Collector gerade gefällt<br />
� warum werden dann die Referenzen in Eclipse GUI-Applikationen nicht<br />
gespeichert ?<br />
� das Applikationsobjekt ist tatsächlich nur temporär und insofern<br />
ziemlich nutzlos – dort sollte man keine Attribute ansiedeln !<br />
• main ist auch sofort wieder zu Ende<br />
� die Klasse Frame verwaltet eine eigene Liste von Referenzen<br />
auf alle ihre Instanzen – dadurch bleiben diese am Leben<br />
• jede Instanz hat einen eigenen Thread – dadurch läuft die VM weiter<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 72
Datentypen<br />
� Primitive Typen<br />
plattformunabhängig definiert<br />
� byte (8 Bit), short (16 Bit), int (32 Bit), long (64 Bit),<br />
alle als vorzeichenbehaftete 2er-Komplementdarstellung<br />
� char (16 Bit vorzeichenlos, Unicode � Umlaute in Variablen erlaubt)<br />
� float (32 Bit), double (64 Bit); beide IEEE Standard 754<br />
� kein enum in Sinne von C++; stattdessen Klassen/Interfaces:<br />
enum TurtleT {LION, RABBIT, TURTLE, TIGER, MONKEY}<br />
�� Referenztypen<br />
� "Zeiger" für Klassen, Interfaces, Arrays<br />
� C++ macht keinen Unterschied zwischen primitiven Typen und Klassen!<br />
� neue primitive Typen werden in C++ als Klassen realisiert<br />
(CBruch, CComplex, CString)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 73
Initialisierung von Variablen<br />
� automatisch initialisiert werden<br />
� Klassenvariable ( = static) )<br />
� Instanzvariable ( = Attribute)<br />
� Array-Komponenten (wenn es sich um Grundtypen handelt)<br />
� Initialisierungswerte sind<br />
� 0 für Zahlentypen<br />
� false für boolean<br />
�� null für Objektreferenzen<br />
� lokale Variable werden nicht automatisch initialisiert!<br />
� Zugriff auf nicht initialisierte Variable bringt Fehler<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 74
Zeichenketten: String<br />
� Klasse String (ähnlich wie CString in MFC)<br />
� char* gibt es nicht !<br />
(Inhalts- und Addressoperator gibt es nicht)<br />
� Operand + zur Verkettung<br />
� akzeptiert Werte beliebiger Typen oder Objekte beliebiger<br />
Klassen als Operand – verwendet Methode toString()<br />
� Besonderheit: Operator + allokiert implizit einen neuen String!<br />
�� class Object hat die Methode toString()<br />
� liefert eine textliche Repräsentation des Objekts<br />
� jede abgeleitete Klasse sollte diese Methode sinnvoll<br />
überschreiben<br />
� nützlich auch zur Fehlersuche<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 75
Objektvariable: Zeiger versus Referenzen<br />
� Java Referenzen entsprechen C++ Zeigern:<br />
� Java Referenz kann null sein<br />
� man kann damit z.B. verkettete Listen schreiben<br />
� Zugriff auf Elemente des Objekts mit . statt -><br />
� ein Pendant zu C++ Referenzen gibt es nicht!<br />
� größere Sicherheit gegen Programmierfehler<br />
� es gibt keine Zeigerarithmetik<br />
(so kann man sich auch nicht verrechnen...)<br />
� man kann kein Objekt löschen, auf das noch Zeiger zeigen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 76
Arrays<br />
� sicher durch Indexprüfung zur Laufzeit<br />
� sind dynamisch allokierte Objekte<br />
� float[] vector = <strong>new</strong> float[3];<br />
� int punkt[] = {40, 50};<br />
� float[][] matrix = <strong>new</strong> float[3][3];<br />
� int[][] brett = <strong>new</strong> int[3][]; // Array mit 3 Referenzen<br />
brett[0][] = <strong>new</strong> int[10];<br />
brett[1][] = <strong>new</strong> int[8];<br />
brett[2][] = <strong>new</strong> int[4];<br />
�� int brett[3][3]; ist nicht möglich!<br />
� Array ist eigentlich 1-dimensional<br />
� array.clone()<br />
klont auch bei mehrdimensionalen Arrays nur eine Dimension<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 77
Beispiel Turtlegrafik<br />
� Die Bewegungen einer Schildkröte (Turtle) hinterlassen eine Spur.<br />
� Zunächst wird eine Linie gezogen von der letzten Position zur aktuellen<br />
Position.<br />
� Die Bewegungen nach links, rechts, oben oder unten werden mit Hilfe<br />
von Buttons gesteuert<br />
� Auf der Zeichenfläche ist der Punkt (0,0) links oben;<br />
die x-Werte nehmen nach rechts zu,<br />
die y-Werte wachsen nach unten<br />
� Machen Sie sich mit der Klassenbibliothek von Java und deren<br />
Dokumentation vertraut<br />
Betrachten Sie folgende Klassen: Graphics, ArrayList, Point, Color…<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 78
Verwenden Sie die Klasse Graphics<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 79
Überlegungen zur Turtlegrafik<br />
� Werden in der Anwendung keine Standarddialogbausteine verwendet,<br />
muss die Anwendung selber für sinnvollen Update sorgen - nur sie<br />
kann wissen, was wirklich geschehen soll -<br />
� Der Window-Manager kann Ausschnitte, die auf den Desktop (z.B.<br />
durch Verschieben, Verkleinern oder Iconifizieren anderer Fenster)<br />
sichtbar werden, nur sehr primitiv rekonstruieren:<br />
Bitmaps werden kopiert<br />
� die Anwendung muss den Inhalt verwalten und bei Bedarf aktualisieren<br />
– die betroffene Klasse muss die paint-Methode implementieren:<br />
public void paint (Graphics g)<br />
� Die Klasse ArrayList kann dabei sehr hilfreich sein:<br />
beliebige Objekte können bequem verwaltet werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 80
Die Klasse<br />
ArrayList<br />
Quelle:<br />
http://download.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 81
Die Klasse<br />
ArrayList<br />
Quelle:<br />
http://download.oracle.com/javase/1.4.2/docs/api/java/util/ArrayList.html<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 82
… und ein bisschen Kosmetik<br />
� Fenster zentrieren<br />
frame.setLocationRelativeTo(null); null<br />
� Handler für Fensterereignisse:<br />
protected void processWindowEvent(WindowEvent e) {<br />
}<br />
if (e.getID() == WindowEvent.WINDOW_CLOSING) {<br />
// … versuchen JOptionPane zu verwenden<br />
System.exit(0); // Java VM beenden<br />
}<br />
} else<br />
super.processWindowEvent(e); // und jetzt das<br />
Standardverhalten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 83
Java-Sprachelemente:<br />
�Abläufe/Workflow<br />
�exception – throws try catch finally –<br />
�Iterator �Iterator<br />
�Casting<br />
�Instanceof<br />
�Generizität<br />
�Zusicherungen (Assertions)<br />
�Aufzählungstypen: �Aufzählungstypen: enum<br />
�Property-Dateien<br />
�Java-Archivdateien: jar<br />
�strukturierte Kommentare: javadoc<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling
Exception Handling<br />
� wie in C++, aber:<br />
� throw-Deklaration -Deklaration müssen im Funktionskopf angegeben werden<br />
„public void search () throws NotFoundException … “<br />
• der Compiler erzwingt es!<br />
� alle möglichen Ausnahmen müssen auch eingefangen werden<br />
� nur für Objekte von Klassen, die von Throwable abgeleitet sind<br />
• hat als direkte Unterklassen: Error und Exception<br />
�� try … catch (Exception e) … [finally]<br />
Die Anweisungen im finally-Block werden grundsätzlich ausgeführt<br />
� Exception-Konstruktoren haben i. a. String-Objekt als Parameter<br />
� kann mit e.getMessage() zurück gewonnen werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 85
iterator<br />
Ein Iterator ermöglicht, dass alle Elemente eines Collection-Objekts kontrolliert<br />
(Element für Element) durchlaufen wird. Der Iterator ist ein interface, welches von<br />
allen Collections (Set, HashSet, SortedSet, List, ArrayList) implementiert ist und die<br />
folgende Schnittstelle zu Verfügung stellt:<br />
public boolean hasNext() true, wenn noch ein Element existiert<br />
public Object next () liefert jeweils das nächste Element<br />
public void remove() entfernt, das zuletzt mit next<br />
angesprochene Element<br />
Beispiel:<br />
for (Iterator x = menge.iterator(); i.hasNext())<br />
System.out.println (x);<br />
oder (vereinfachte Schleife)<br />
for (Object x : menge) System.out.println (x);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 86
Typumwandlung/Casting (I)<br />
� Typumwandlung zwischen primitiven Typen ist wohldefiniert<br />
� nicht einfach Uminterpretation des Bitmusters<br />
� keine beliebigen Casts zwischen irgendwelchen Datentypen (Java<br />
ist da sehr streng!)<br />
� Typumwandlung zwischen Objektreferenzen wird zur Laufzeit<br />
überprüft<br />
�� nur die Umwandlung zwischen Basisklasse und abgeleiteter<br />
Klasse ist zulässig<br />
� Umwandlung einer Objekt-Instanz in ein spezifisches Objekt geht<br />
– wenn es sich tatsächlich um ein entsprechendes Objekt handelt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 87
Casting<br />
class zahl<br />
{ int z;<br />
zahl ()<br />
{ z = 0;<br />
System.out.println<br />
("Wert von z ist "+ z);<br />
}<br />
}<br />
public class demo<br />
{ positive p;<br />
public void init (){<br />
}<br />
}<br />
zahl z = (zahl)<strong>new</strong> positive(30);<br />
class positive extends zahl<br />
{ positive (int i)<br />
{ z = i;<br />
System.out.println<br />
("Wert von z ist "+z);<br />
}<br />
}<br />
// Casting geht nur entlang der Klassenhierarchie<br />
// p = (positive) z;// geht nicht, wenn z ein zahl-Objekt ist!<br />
p = <strong>new</strong> positive (20);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 88
instanceof<br />
� Die ArrayList allMyTickets beinhaltet unterschiedliche Tickets:<br />
FatalError, Exception, Warning, Hint.<br />
Es sollen Merkmale geprüft werden. instanceof liefert eine Aussage<br />
darüber, welche Klasse ein Objekt instanziiert:<br />
public class FatalError<br />
{public String showCrashed (){return “Crashed“;} }<br />
public class Exception<br />
{public String showSystemDown (){return “Down“;} }<br />
public class Warning<br />
{... public String showWarning (){return myWarning;} }<br />
public class Hint<br />
{... public String showHint (){return myHint;} }<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 89
instanceof<br />
for (int i = 0; i < allMyTickets.size(); i++)<br />
{<br />
}<br />
Object x = allMyTickets.get(i);<br />
if (x instanceof FatalError)<br />
System.out.println(( (FatalError)x).showCrashed());<br />
if (x instanceof Exception)<br />
System.out.println(((Excpetion)x).showSystemDown());<br />
if (x instanceof Warning)<br />
System.out.println(((Warning)x).showWarning());<br />
if (x instanceof Hint)<br />
System.out.println(((Hint)x).showHint());<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 90
Generizität – Generische Klasse<br />
� Idee: allgemein nutzbare Klasse, die gleichzeitig Typsicherheit<br />
gewährleistet (siehe auch ArrayList):<br />
public class GenericObject<br />
{<br />
}<br />
private T t1, t2;<br />
public T gett1 ()<br />
{ return t1; }<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 91
assert<br />
� Seit Java 1.4 bietet Java eine elegante Lösung für die Überprüfung von<br />
Annahmen/Bedingungen - sogenannter Assertions (Zusicherungen):<br />
Beispiel:<br />
...<br />
boolean ok = list.isEmpty();<br />
Exception<br />
assert ok; (oder: assert expr1 : string_expr2 )<br />
� Java überprüft während der Ausführung den Zustand der Variablen ok.<br />
Wird der Wert der Variablen false, wird ein AssertionError (Error<br />
extends Throwable) geworfen. Dies verringert die<br />
Wahrscheinlichkeit, dass ein Programmierfehler unentdeckt bleibt.<br />
� Das Programm muss mit javac .source 1.4 asserttest.java compiliert<br />
und mit java -ea assertest (enable assertions) ausgeführt werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 92
assert - Beispiel<br />
class Asserttest<br />
{<br />
public static double kehrwert (double x)<br />
{<br />
assert x != 0 : ">>> Division durch 0
Aufzählungstypen – Enumeration<br />
� Syntaktisch ähnelt die Deklaration eines Aufzählungstyps der einer<br />
Klasse:<br />
public enum TicketCategory {<br />
}<br />
Software, Hardware, Bedienung, Betriebssystem,<br />
Netzwerk<br />
� Jedes durch die Deklaration eines Aufzählungstyps festgelegten enum-<br />
Objektes besitzt automatisch die Instanzmethoden:<br />
� String toString(), boolean equals (Object o), int ordinal() und values()<br />
...<br />
for (TicketCategory tc : TicketCategory.values())<br />
System.out.println(tc + “ hat den Wert “ + tc.ordinal());<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 94
Interface<br />
Spezialfall einer abstrakten Klasse<br />
� ein Interface ist eine abstrakte Basisklasse ohne Elementvariablen,<br />
besteht also ausschließlich ausschließlich aus<br />
� abstrakten Methoden (abstract = entspricht virtuell in C++)<br />
� Konstantendefinitionen (public final static …)<br />
� lokalen Klassen<br />
� spezielle Form der Vererbung<br />
class Klasse implements Interface<br />
�� die Klasse muss alle Methoden des Interface implementieren<br />
� ein Programm hat eine Interfacereferenz und ruft deren<br />
Methoden auf<br />
� die Interfacereferenz zeigt dann auf Objekte von Klassen,<br />
die dieses Interface implementieren<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 95
Interfaces am Beispiel Turtlegrafik<br />
� In der Grafik sollen verschiedene Symbole/Spuren möglich sein<br />
� Festgelegt wird einerseits das Verhalten<br />
� es muss eine spezielle paint-Methode geben interface<br />
� …<br />
� Objektmerkmale, die allen gemeinsam sind,<br />
werden identifiziert und zusammengestellt<br />
abstract class<br />
� Vorteil:<br />
Der Objektverwaltung ist es egal, um welches Objekt es sich in einem<br />
konkreten Fall handelt (jedes Objekt weis alleine, was es tun muss)<br />
+ Erweiterbarkeit<br />
+ Pflege und Wartung<br />
+ bei der Verwaltung der Objekte sind spezielle Merkmale nicht relevant<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 96
Turtle, Lion, Rabbit<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 97
Aufzählungstyp<br />
enum TraceType {<br />
};<br />
Lion, Monkey, Rabbit, Tiger, Turtle<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 98
interface Trace<br />
interface Trace<br />
{<br />
}<br />
public void paint (Graphics g);<br />
public int getX();<br />
public int getY();<br />
KEIN Konstruktor!<br />
Jedes Objekt<br />
muss sich im<br />
angegebenen<br />
Kontext selbst<br />
darstellen<br />
diese Methode müssen<br />
alle Objekte besitzen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 99
abstract class genericTrace<br />
abstract class genericTrace<br />
{<br />
}<br />
Point position;<br />
kann in allen<br />
Subklassen<br />
verwendet werden<br />
Muss aufgrund von<br />
getX(), getY()<br />
interface<br />
implementieren<br />
es gibt keine<br />
Objekte/Instanzen<br />
dieser Klasse!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 100
class Rabbit extends<br />
genericTrace implements Trace<br />
class Rabbit extends genericTrace implements Trace<br />
{<br />
int radius;<br />
Rabbit (int x, int y, int r)<br />
{<br />
position = <strong>new</strong> Point (x,y);<br />
radius = r;<br />
}<br />
spezifische<br />
Attribute<br />
klassenspezifischer<br />
Konstruktor<br />
public void paint (Graphics g)<br />
{<br />
g.drawOval( position.x-radius/2, position.y-radius/2,<br />
radius, radius);<br />
}<br />
} objektspezifisches<br />
Verhalten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 101
class Lion extends<br />
genericTrace implements Trace<br />
class Lion extends genericTrace implements Trace<br />
{<br />
int width, height;<br />
Lion (int x, int y, int w, int h)<br />
{<br />
position = <strong>new</strong> Point (x,y);<br />
width = w;<br />
height = h;<br />
}<br />
public void paint (Graphics g)<br />
spezifische<br />
Attribute<br />
klassenspezifischer<br />
Konstruktor<br />
{<br />
g.drawRect( position.x-width/2, position.y-height/2,<br />
width, height);<br />
}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 102
SingletonPattern zu Objektverwaltung (1/2)<br />
public class TraceContainer<br />
{<br />
/** Verwaltung aller Objekte */<br />
public static ArrayList allTraces;<br />
public static int x = 0, y = 0;<br />
private static TraceContainer instance = null;<br />
/* private Default-Konstruktor, der nicht außerhalb dieser Klasse */<br />
private TraceContainer () {}<br />
/* Methode, liefert die einzige Instanz dieser Klasse zurück */<br />
public static ArrayList getInstance() {<br />
}<br />
if (instance == null) instance = <strong>new</strong> TraceContainer ();<br />
return instance;<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 103
SingletonPattern zur Objektverwaltung (2/2)<br />
public void add (TraceType animal, int x, int y) {<br />
Trace trace;<br />
trace = TraceFactory (animal, x, y);<br />
allTraces.add(trace);<br />
} // add<br />
public void paint (Graphics g) {<br />
for (int i = 0; i < allTraces.size(); i++)<br />
(allTraces.elementAt(i)).paint(g);<br />
} // paint<br />
/* Bei Bedarf weitere Methoden<br />
... Z.B. ein Factory Pattern<br />
*/<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 104
FactoryPattern zum Erzeugen der Spuren<br />
private Trace TraceFactory(TraceType animal, int posx, int posy) {<br />
Trace aNewTrace;<br />
int width = 5, height = 8;<br />
String anId = "T";<br />
switch (animal) {<br />
case Lion: aNewTrace = <strong>new</strong> Lion(posx, posy, width, height);<br />
break;<br />
case Tiger: aNewTrace = <strong>new</strong> Tiger(posx, posy, anId);<br />
break;<br />
case Monkey: Image img =<br />
Toolkit.getDefaultToolkit().createImage("cross.gif");<br />
aNewTrace = <strong>new</strong> Monkey(posx, posy, img);<br />
break;<br />
case Turtle:<br />
case Rabbit:<br />
default: aNewTrace = <strong>new</strong> Rabbit(posx, posy, 8);<br />
}<br />
return aNewTrace;<br />
}<br />
} //TraceContainer<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 105
Dateihandling: übliche Vorgehensweise<br />
Lesen von Datei (Schreiben entsprechend):<br />
Verbindung zur Datei herstellen fin = fopen ("name.txt", "r");<br />
// Datei und Zugriffsmodus!<br />
Lesen<br />
� zeilenweise fgets (100, str, fin);<br />
� byteweise fread(fin, 100, feld);<br />
� formatiert fscanf (fin, "%d %d %d", &x, &y, &z);<br />
Datei schließen, Verbindung beenden fclose (fin);<br />
Weitere Formen sind möglich, z.B.<br />
� Eingabe puffern<br />
�� in Stream schreiben<br />
�<br />
oder<br />
über Netz auf anderen Daten zugreifen<br />
�<br />
ABER:<br />
aus einem String lesen: sscanf (fin, "%d %d %d", &x, &y, &z);<br />
Die Lesebefehle sind nicht unabhängig von dem Objekt (z.B. „lies etwas, egal woher, Methode von Object“)<br />
� Java handhabt dies streng(er) objektorientiert!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 106
Ein- und Ausgabeströme<br />
Pipe<br />
Pipe<br />
Datei<br />
Zeichenkette Bytefeld<br />
Format Puffer<br />
Eingabefilter<br />
Verarbeitung<br />
Format Puffer<br />
Ausgabefilter<br />
Datei<br />
Zeichenkette Bytefeld<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 107
I/O unter Java:Ein Beispiel für Kapselung<br />
Objekt<br />
Einzelne Zugriffsoperationen<br />
Zugriff (lesend,schreibend)<br />
� Objekt<br />
� File (lokal,via Netz)<br />
� Stream<br />
� String<br />
� Zugriff<br />
� lesend/schreibend<br />
� Gepuffert<br />
� Klartext/binär/…<br />
�� Zugriffsoperation<br />
� Grundtyp<br />
� Objekt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 108
Kommunikation zwischen Programmen:<br />
Streams<br />
� Streams<br />
� Transparente Operationen<br />
� Kontinuierlicher Zugriff<br />
Daten/Objekte<br />
Schreiben Lesen<br />
Stream<br />
� Objektorientiert<br />
� interface Serializable erlaubt bequemes Lesen und Schreiben von Objekten<br />
� Objekte werden dadurch in einem internen Format gespeichert und gelesen.<br />
� java.io.Serializable ist ein sogenanntes "flag interface„, d.h. es enthält keine einzige<br />
Deklaration einer Methode, die man implementieren muss.<br />
� Die <strong>beim</strong> Serialisieren benutzte Methode writeObject wird standardmäßig vom<br />
Runtimesystem bereitgestellt.<br />
� eignet sich sehr gut für das temporäre Speichern von Objekten zwischen<br />
Programmläufen (� persistente Objekte/Applikationen)<br />
� Weitere Möglichkeit: java.io Externalizable<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 109
Auswirkung auf die Anwendungsklassen<br />
im Beispiel Turtlegraphik<br />
� Die Ergänzungen in unseren Anwendungsklassen sind sehr gering:<br />
� abstract class genericTrace implements Serializable<br />
. . .<br />
� class Rabbit extends genericTrace implements Trace,<br />
Serializable<br />
. . .<br />
� class Turtle extends genericTrace implements Trace,<br />
Serializable<br />
. . .<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 110
Serialisiertes Speichern<br />
public void speichern()<br />
}<br />
{<br />
// “import java.io.*;“ angeben!<br />
try<br />
{<br />
}<br />
Aufruf erfolgt bei<br />
Programmende<br />
FileOutputStream fos = <strong>new</strong> FileOutputStream ("stream.tmp");<br />
ObjectOutputStream oos = <strong>new</strong> ObjectOutputStream (fos);<br />
oos.writeObject (spuren);<br />
System.out.println("schreiben: " + spuren.size());<br />
catch (Exception e)<br />
{System.out.println("Exception (schreiben):"+e.getMessage()); }<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 111
Serialisiertes Laden<br />
public void laden()<br />
{<br />
//import java.io.*;<br />
try<br />
{<br />
FileInputStream fis = <strong>new</strong> FileInputStream ("stream.tmp");<br />
ObjectInputStream ois = <strong>new</strong> ObjectInputStream (fis);<br />
spuren = (ArrayList)ois.readObject ();<br />
System.out.println("lesen: "+spuren.size());<br />
}<br />
catch (Exception e)<br />
{System.out.println("Exception (laden):"+e.getMessage()); }<br />
}// laden<br />
Aufruf erfolgt im<br />
Konstruktor<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 112
Dateien unter Java lesen<br />
// Datei zeilenweise lesen<br />
// import java.io.*;<br />
File eingabedatei = <strong>new</strong> File (“eingabe.dat“);<br />
FileReader fr = <strong>new</strong> FileReader(eingabedatei);<br />
BufferedReader br = <strong>new</strong> BufferedReader (fr);<br />
line = br.readLine();<br />
while (line != null)<br />
{<br />
...<br />
line = br.readLine();<br />
}// while<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 113
Lesen aus einem jar oder via Internet<br />
� Um das Laden aus einem jar zu ermöglichen, wird statt des direkten<br />
Dateinamens die folgende Konstruktion eingesetzt:<br />
� URL filename = getClass().getResource(„myFile.dat");<br />
� Beispiel:<br />
� try {<br />
URL url = this.getClass().getResource("nicelogo.gif");<br />
myicon = <strong>new</strong> ImageIcon(url);<br />
myLabel.setIcon(iicon);<br />
}<br />
catch (Exception e){ }<br />
� try {<br />
InputStream is;<br />
URL url = his.getClass().getResource("parameter.prop");<br />
is = url.openStream();<br />
Properties p = <strong>new</strong> Properties();<br />
p.load(is);<br />
}<br />
catch (Exception e){ }<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 114
Vereinfachte Eingabe (ab Java Version 5.0)<br />
import java.util.Scanner;<br />
import java.io.*;<br />
...<br />
File f = <strong>new</strong> File("numbers.dat" );<br />
Scanner sc = <strong>new</strong> Scanner( f );<br />
while (sc.hasNextLong())<br />
{<br />
}<br />
long aLong = sc.nextLong();<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 115
Datei schreiben<br />
// import java.io.*;<br />
// - in ASCII Datei schreiben --------<br />
FileWriter fw;<br />
String zeile = "Hello World";<br />
try<br />
{<br />
fw = <strong>new</strong> FileWriter (“strings.dat");<br />
fw.write (zeile);<br />
fw.write ("\n");<br />
fw.close();<br />
}<br />
catch (FileNotFoundException e) {}<br />
catch (IOException e) {}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 116
Property-Dateien<br />
� Um ein Programm einfacher konfigurieren bzw. (an sprachliche<br />
Anforderungen) anpassen zu können, bietet es sich an, Zeichenfolgen<br />
aus einer Konfigurationsdatei einzulesen. In Java wird dies mit der<br />
Klasse java.util.Properties unterstützt.<br />
� Dateien, oder allgemeiner Eingabe-Streams, in denen Properties<br />
definiert sind, können mit der Methode load() der Klasse<br />
java.util.Properties gelesen werden.<br />
�� In der Datei werden paarweise Property-Name und Property-Wert<br />
aufgeführt.<br />
� Kommentar beginnt mit dem Zeichen # oder ! Und steht in einer<br />
separaten Zeile.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 117
Property-Dateien<br />
# einfaches Beipiel<br />
bezeichner=H.-P. Wiedling, 2011<br />
// Properties lesen<br />
String copyright = ““;<br />
try<br />
{<br />
InputStream is;<br />
is = <strong>new</strong> URL<br />
(getDocumentBase(),"parameter.properties").openStream();<br />
// oder<br />
// InputStream is =<strong>new</strong> FileInputStream ("plan.prop");<br />
Properties p = <strong>new</strong> Properties();<br />
p.load( is );<br />
copyright = p.getProperty("bezeichner");<br />
}<br />
catch (Exception e )<br />
{<br />
System.out.println (e.getMessage());<br />
System.out.println ("plan.prop <strong>Fachbereich</strong> <strong>Informatik</strong>: nicht 3. gefunden?!");<br />
Semester Bachelor Studiengang<br />
}<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
...<br />
Property-Datei parameter.properties:<br />
Bezeichner, Trennzeichen (=, : oder Whitespace),<br />
Wert des Bezeichners<br />
Seite 118
... und als ResourceBundle ist die Datei<br />
einfach verfügbar<br />
import java.util.MissingResourceException;<br />
import java.util.ResourceBundle;<br />
public class Messages {<br />
private static final String BUNDLE_NAME = "parameter";<br />
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle<br />
.getBundle(BUNDLE_NAME);<br />
private Messages() { }<br />
public static String getString(String key) {<br />
try<br />
{ return RESOURCE_BUNDLE.getString(key); }<br />
catch (MissingResourceException e)<br />
{ return '!' + key + '!'; }<br />
}<br />
}<br />
Aufruf:<br />
Messages.getString(„bezeichner")<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 119
Java-Archive (I)<br />
� jar ist ein Werkzeug, mit dem Java-Archivdateien erzeugt und verändert<br />
werden können. Eine jar-Datei ist eine ZIP-Datei;<br />
sie enthält i. d. R. kompakt mehrere Dateien.<br />
C:>jar<br />
Syntax: jar {ctxu}[vfm0Mi] [JAR-Datei] [Manifest-Datei] [-C dir] Dateien ...<br />
Optionen:<br />
-c neues Archiv erstellen<br />
-t Inhaltsverzeichnis für Archiv auflisten<br />
-x benannte (oder alle) Dateien aus dem Archiv extrahieren<br />
-u vorhandenes Archiv aktualisieren<br />
-v ausführliche Ausgabe für Standardausgabe generieren<br />
-f Namen der Archivdatei angeben<br />
-m Manifestinformationen aus angegebener Manifest-Datei einbeziehen<br />
-0 nur speichern; keine ZIP-Komprimierung verwenden<br />
-M keine Manifest-Datei für die Einträge erstellen<br />
-i Indexinformationen für die angegebenen JAR-Dateien generieren<br />
-C ins angegebene Verzeichnis wechseln und folgende Datei einbeziehen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 120
Java Archive (II)<br />
Falls eine Datei ein Verzeichnis ist, wird sie rekursiv verarbeitet.<br />
Der Name der Manifest-Datei und der Name der Archivdatei müssen in der gleichen<br />
Reihenfolge wie die Flags 'm' und 'f‚ angegeben werden.<br />
Beispiel 1:<br />
Archivieren von zwei Klassendateien in einem Archiv mit dem Namen<br />
classes.jar:<br />
jar cvf turtle.jar helloworld.class frame.class<br />
Beispiel 2:<br />
Verwenden der vorhandenen Manifest-Datei ‘manf‘ und archivieren aller Dateien im<br />
Verzeichnis mygui/ in 'classes.jar':<br />
jar cvfm turtle.jar manf -C mygui/<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 121
Java Archive: Manifest<br />
manf<br />
Main-Class: mygui/Main<br />
Sealed: true<br />
Main-Class: class-Datei, die main-Methode enthält<br />
Sealed: benötigte Pakete sind Bestandteil der Archivdatei<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 122
Archivdateien<br />
Archiv anlegen<br />
� jar cvfm turtle.jar manf mygui/*.class<br />
� c: create<br />
� v: verbose (d.h. Meldungen anzeigen)<br />
� f: Archiv, welches erzeugt wird<br />
� m: Manifestdatei<br />
Archiv ausführen<br />
�� java -jar turtle.jar<br />
eclipse<br />
� Unter eclipse werde unter dem Menüpunkt "Export/Java.." .jar<br />
erstellt. Dort werden auch weitere Einstellungen (z.B. Main-<br />
Class) vorgenommen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 123
Archive (jar)<br />
� Classpath:<br />
set path=%; C:\JBuilder2007\jre\bin<br />
set CLASSPATH=%;.<br />
� Manifest (Datei manf):<br />
Main-Class: mygui/Main<br />
Sealed: true<br />
� Erstellen:<br />
jar cvfm turtle.jar manf *.class<br />
erzeugt eine jar-Datei mit allen *.class Dateien; manf ist eine Datei, die<br />
Informationen enthält über Klasse mit der main-Methode (sog. Manifest)<br />
� jar-Datei ansehen<br />
jar tvf turtle.jar<br />
� Starten:<br />
java -jar turtle.jar<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 124
Zugriffsrechte<br />
� public, protected, private wie in C++<br />
� jedes Element hat sein eigenes Zugriffsrecht<br />
� Definition gilt (im Gegensatz zu C++) nicht für die nachfolgenden<br />
Elemente<br />
� ohne Angabe bedeutet:<br />
� private für Klassen<br />
� public für Interfaces<br />
�� für Attribute und Methoden<br />
• protected innerhalb des eigenen Packages<br />
• private außerhalb des eigenen Packages<br />
� zur Sicherheit immer angeben<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 125
(Auswahl von) Modifier (I)<br />
� void, int, long, normaler Rückgabewert;<br />
float, double,<br />
boolean, char,...<br />
spez. Obj.<br />
� Konstruktoren haben KEINEN Rückgabewert<br />
� private Methoden/Komponenten können nur<br />
klassenintern verwendet werden<br />
� protected Das Element ist nur innerhalb des Paketes zu<br />
erreichen, in dem es definiert ist sowie über<br />
entsprechende Subklassen<br />
� public Methoden/Komponenten/Klasse/Interface<br />
stehen für Aufrufe von außen (=überall) zur<br />
Verfügung.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 126
(Auswahl von) Modifier (II)<br />
� ohne Zugriff ist innerhalb des Paketes möglich<br />
(oft als "friendly" oder "package private "<br />
bezeichnet).<br />
� final Komponenten: Konstanten, die<br />
unmittelbar mit einem Wert versehen werden<br />
Bei Klassen verhindert das Schlüsselwort die<br />
weitere Verfeinerung der Klasse.<br />
Bei Methode: die Methode kann nicht<br />
überschrieben werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 127
(Auswahl von) Modifier (III)<br />
� static klassenweite Methoden/Komponenten, sie<br />
sind nicht an best. Objekte gebunden<br />
(das dann auch nicht zur Verfügung steht);<br />
sie werden so auch mit dem Klassennamen<br />
aufgerufen und nur einmal initialisiert, wenn<br />
das Programm geladen/initialisiert wird<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 128
(Auswahl von) Modifier (IV)<br />
� abstract Klassen die eine abstract Methode<br />
beinhalten müssen als abstract deklariert<br />
werden. Abstrakte Klassen enthalten<br />
nicht implementierte Methoden und<br />
können nicht instanziiert werden.<br />
Abstracte Methoden müssen auch<br />
implementiert werden, sie werden allerdings<br />
in Subklassen spezifisch überschrieben<br />
(vgl. virtual in C++)<br />
Wenn es nur abstract Methoden gibt, dann<br />
kann man die Klasse auch als interface<br />
deklarieren. Bei interfaces ist der<br />
Modifikator optional<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 129
Sichtbarkeit<br />
Public Protected Package Private<br />
Gl. Klasse Ja Ja Ja ja<br />
Klasse im gl. Paket Ja Ja Ja Nein<br />
Subklasse in<br />
anderem Paket<br />
Nicht Subklasse,<br />
and. Paket<br />
Ja Ja Nein Nein<br />
Ja Nein Nein Nein<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 130
Vorgehensweise bei Entwurf und Doku<br />
� Analyse der Benutzergruppen<br />
� Anwendungsfälle (Use Case Diagramm, UML)<br />
� Workflow (Geschäftsprozess)<br />
� zeitliche Verkettung einzelner Use Cases<br />
(�Flussdiagramm, PAP)<br />
� abstraktes Screen-Diagramm<br />
� Bedien- und Anzeigeelemente nur aufgelistet<br />
�� konkretes Screen-Diagramm<br />
� Detailliierte Layout-Skizze<br />
� Sequenzdiagramm (UML)<br />
� jeder Screen wird Objekt einer eigenen Klasse<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 131
Benutzergruppen charakterisieren<br />
� welche Leute sollen mit dem System arbeiten?<br />
� was sind ihre eigentlichen Aufgaben und Ziele ?<br />
� in welchem Zusammenhang nutzen sie das System ?<br />
� wie kann man sie im Hinblick auf das System charakterisieren ?<br />
� seltene / häufige / ständige Nutzer,<br />
Anfänger / Fortgeschrittene / Profis<br />
• bezüglich der Anwendung<br />
• bezüglich Rechner und Betriebssystem<br />
� interessiert / widerwillig ? lernfähig / starr ?<br />
im Stress ?<br />
Der DAU ist nicht blöd !<br />
Er hat oft einfach nur<br />
Wichtigeres zu tun<br />
� problematisch:<br />
Wie viel Kontextwissen (� inhaltliche Tiefe und Terminologie) ist<br />
erforderlich?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 132
Benutzerzentriertes<br />
Requirement Engineering<br />
� Ausgangspunkt muss der/die Benutzer/-in sein mit den Aufgaben,<br />
die er/sie bewältigen muss:<br />
� Benutzer beschreibt Aufgabe (umgangssprachlich, informell)<br />
� Interviewsituationen (Frage-Antwort-Spiel) werden in Form von<br />
Protokollen festgehalten<br />
� Aus dem Text ergibt sich ein Modell, das die reale Situation auf die<br />
benötigten Merkmale vereinfacht:<br />
Klassen, Methoden, Attribute, …<br />
� Eine Orientierungshilfe kann die Methode von Abbott sein:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 133
Beispiel Fahrkartenautomat<br />
� kleine, große, alte, junge, mit Sehschwäche ...<br />
� wegfahren zu Termin / Besuch / Urlaub ...<br />
� ganz unterschiedliche Nutzungshäufigkeit<br />
� Einmal im Jahr, täglich; vertraute vs. Fremde Ziele<br />
� interessiert? Nein<br />
� Es geht nicht um den Fahrkartenautomat – es geht um die Reise!<br />
�� lernfähig? Manche<br />
� Das nächste Mal soll‘s besser klappen<br />
� Stress? aber sicher!<br />
� Die (Straßen-)Bahn droht abzufahren!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 134
Beispiel Stundenplanungssystem<br />
� Sekretärin: Eingabe von Wunschzetteln<br />
Ausdrucken von Plänen<br />
Beantworten von Anfragen<br />
� Prodekan: Lehrveranstaltungsplanung<br />
(wer macht was)<br />
� Stundenplaner: Stundenplanung<br />
(wann und wo)<br />
Anwendungswissen ist erforderlich!<br />
� charakterisieren Sie die Benutzergruppen !<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 135
Anwendungsbeispiel Ticketsystem (1/2)<br />
� Trouble-Ticket- bzw. Help-Desk-Systeme sind sehr gut geeignet, um<br />
den Fortgang der Bearbeitung gemeldeter Problembeschreibungen<br />
zu beobachten.<br />
� Kunden können die Bearbeitung direkt verfolgen und die<br />
Serviceorientierung eines Dienstleistungsunternehmens<br />
nachvollziehen. Außerdem kann eine Wissensbasis für die Bearbeiter<br />
aufgebaut werden.<br />
Quelle: http://de.wikipedia.org/wiki/Issue-Tracking-System (Stand:<br />
Mai 2010)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 136
Anwendungsbeispiel Ticketsystem (2/2)<br />
� Mit einem Ticketsystem werden<br />
�� also Problemsituationen erfasst und ein Vorschlag einer ersten<br />
Kategorisierung gemacht<br />
� anschließend erfolgt mit ihrer Hilfe eine Zuordnung zu einem<br />
Mitarbeiter<br />
� daneben auch festgehalten, in welchem Bearbeitungszustand des<br />
Tickets ist; Durch einen Kommentar werden nach Behebung des<br />
Fehlers die Ursache und der Test (kurz) erläutert und dieser<br />
ebenfalls vermerkt;<br />
� die Kategorisierung gegebenenfalls korrigiert<br />
� nach Test und Qualitätskontrolle (der Test wird von einer<br />
weiteren Person nachvollzogen – Stichwort „Vier-Augen-Prinzip“)<br />
wird das Ticket freigeben.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 137
Anwendungsfälle (Use Cases)<br />
� High-Level-Beschreibung eines Systems Wie findet man<br />
� skizziert die Benutzergruppen<br />
Use Cases?<br />
� skizziert, was diese mit dem System machen<br />
� das System wird als Black Box betrachtet<br />
� rückt den Menschen ins Blickfeld !<br />
� nicht Datenstrukturen und -flüsse<br />
� beschreibt nicht die Struktur des Systems !<br />
� Teil der Unified Modeling Language UML<br />
� wird durch andere Diagrammtypen verfeinert<br />
Man frage<br />
unvorbelastete<br />
Benutzer:<br />
"Was wollen Sie tun?"<br />
�siehe entsprechende<br />
Vorlesung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 138
Die Methode Abbott (1/3)<br />
� KISS – Keep it simple and stupid:<br />
Halte es einfach und leicht verständlich<br />
� Gehen Sie schrittweise vor und verfeinern Sie dabei Ihren Entwurf<br />
� Wenden Sie das Paradigma „code a little, test a little“ auf den<br />
gesamten Prozess an und setzen Sie „Peer-Review“ sein<br />
� Ausgangspunkt für eine umgangssprachliche Beschreibung der<br />
Aufgaben der Benutzer sein, die zu bewältigen sind:<br />
�� Benutzer beschreiben ihre Aufgabe (umgangssprachlich,<br />
informell)<br />
� Interviewsituationen (Frage-Antwort-Spiel) werden in Form von<br />
Protokollen festgehalten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 139
Die Methode Abbott (2/3)<br />
� Aus dem Text ergibt sich ein Modell, das die reale Situation auf die<br />
benötigten Merkmale vereinfacht:<br />
� Klassen<br />
� Methoden<br />
� Attribute<br />
� Instanzen, …<br />
�� Ein Einstieg, eine Orientierungshilfe kann die Methode von Abbott<br />
sein:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 140
Die Methode Abbott (3/3)<br />
� Abbott hat bereits 1983 gezeigt, dass sich eine verbale Spezifikation<br />
(� (� Erstellung von Use Cases) als Grundlage eines Entwurfs eignet.<br />
� Er empfiehlt ein Vorgehen, bei dem bestimmte Wortarten (Hauptund<br />
Zeitwörter) in der Spezifikation gesucht werden und aus ihnen<br />
der Entwurf abgeleitet wird.<br />
�� Abbott hat abstrakte Datenstrukturen und Operationen gebildet. Es<br />
hat sich gezeigt, dass dieses Verfahren auch als Grundlage für einen<br />
objektorientierten Entwurf verwendet werden kann.<br />
Man geht dabei etwa nach folgendem Schema vor:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 141
Vom Problem zur Problemlösung (1/3)<br />
� Herausfiltern von Hauptwörtern<br />
Die Relevanz eines Hauptwortes hängt von seiner Art ab<br />
� Gattungsnamen („Ticket, Kunde, Sachbearbeiter, …“) spielen eine<br />
zentrale Rolle; jeder dieser Begriffe ist ein Kandidat für eine Klasse<br />
� Eigennamen dienen als Bezeichner für bestimmte Objekte („mein<br />
Ticket, …“). Sie können indirekt auch zur Klassenbildung führen<br />
(„Kategorie, Administrator , …“)<br />
� Mengen- und Größenangaben („MByte, Liter…“) sowie<br />
Materialbezeichnungen („Holz, …“) eignen sich oft nicht zur Bildung<br />
von Klassen; entsprechendes gilt für abstrakte Begriffe („Arbeit,<br />
Leistung, Schönheit, …“)<br />
� Zeitwörter, die als Hauptwörter verwendet werden, deuten auf<br />
Aktionen hin und können Methoden werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 142
Vom Problem zur Problemlösung (2/3)<br />
� Dies kann nur eine erste Orientierung sein.<br />
Falsche Granularität des Entwurfs (zu fein - zu grob) zwingt i. d. R. den<br />
Entwurf zu verbessern!<br />
� Suchen von Gemeinsamkeiten<br />
Die Antwort auf die Frage „Gleich oder verschieden“ geht oft aus der<br />
Aufgabe hervor. Wenn für zwei verwandte Begriffe feststeht, dass sie<br />
verschiedene Dinge bezeichnen, sollte geklärt werden in welcher<br />
Beziehung sie stehen. So entstehen „Ist-ein-Beziehungen“ und damit<br />
Klassenhierarchien („Jeder schwerwiegender Fehler ist auch ein<br />
Ticket“) oder Attribute („Jedes Ticket hat einen Zustand und eine<br />
Beschreibung“).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 143
Vom Problem zur Problemlösung (3/3)<br />
� Auffinden von relevanten Zeitwörtern<br />
Zeitwörter bezeichnen Aktionen mit Objekten. Sie stehen immer in<br />
Verbindung mit Objekten bestimmter Klassen. Aus den Zeitwörtern<br />
können Methoden gebildet werden, die auf die entsprechenden<br />
Objekten angewendet werden:<br />
� „… Alle Tickets werden für den Administrator in einer Übersicht<br />
dargestellt; er ordnet Tickets einem Sachbearbeiter zu; wenn die<br />
Ticketbehandlung überprüft wurde, dann wird das Ticket<br />
freigegeben, …“<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 144
� Anwendungsbeispiel Ticketsystem (1/2)<br />
� Trouble-Ticket- bzw. Help-Desk-Systeme sind sehr gut geeignet, um<br />
den Fortgang der Bearbeitung gemeldeter Problembeschreibungen<br />
zu beobachten.<br />
� Kunden können die Bearbeitung direkt verfolgen und die<br />
Serviceorientierung eines Dienstleistungsunternehmens<br />
nachvollziehen. Außerdem kann eine Wissensbasis für die<br />
Bearbeiter (Sachbearbeiter, Administrator) aufgebaut werden.<br />
Quelle:<br />
http://de.wikipedia.org/wiki/Issue-Tracking-System (Stand: Mai 2010)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 145
� Anwendungsbeispiel Ticketsystem (2/2)<br />
� Mit Ticketsystemen werden also Problemsituationen erfasst und ein<br />
Vorschlag einer ersten Kategorisierung gemacht.<br />
� Mit Hilfe des Ticketsystems wird anschließend eine Zuordnung zum<br />
Mitarbeiter hergestellt. Daneben hält das Ticketsystem auch fest, in<br />
welchem Bearbeitungszustand des Tickets ist:<br />
• neu_erfasst, in_Bearbeitung, bearbeitet, getestet, freigegeben<br />
� Durch einen Kommentar werden nach Behebung des Fehlers die<br />
Ursache und der Test (kurz) erläutert und ebenfalls vermerkt; die<br />
Kategorie(n) werden gegebenenfalls korrigiert. Nach Test und<br />
Qualitätskontrolle (der Test wird von einer weiteren Person<br />
nachvollzogen – Stichwort „Vier-Augen-Prinzip“) wird das Ticket<br />
freigeben.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 146
Darstellung/Beschreibung eines Use Cases (1/2)<br />
� Die graphische Beschreibung eines<br />
Anwendungsfalls hält neben dem<br />
System die (Haupt-)Akteure<br />
und die von ihnen<br />
durch geführten<br />
Aktionen fest.<br />
Kunde/Client<br />
� Eine Aussage<br />
über die Struktur des Systems<br />
wird dabei nicht gemacht.<br />
erstellt<br />
neu<br />
sichtet<br />
Ergebnis<br />
prüft,<br />
gibt frei<br />
sichtet<br />
beschreibt<br />
Problem- Problemlösung<br />
korrigiert<br />
Kategorie<br />
ordnet<br />
Tickets<br />
zu<br />
Sachbearbeiter<br />
/ Consultant<br />
Administrator/Dispatcher<br />
� Neben einer einfachen graphischen Darstellung<br />
bietet sich eine tabellarische Beschreibung eines Anwendungsfalls an.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 147
Darstellung/Beschreibung eines Use Cases (2/3)<br />
� Name des Anwendungsfalles<br />
Wahl eines prägnanten, sinngebenden Namens (telling name)<br />
� Bereich<br />
Zu welchem Aufgabenteil gehört der Anwendungsfall<br />
� Ziele<br />
Was soll mit dem Anwendungsfall erreicht werden?<br />
� Beteiligte, Anwendungskontext<br />
Wer nutzt das System unter welchen Bedingungen/in welcher<br />
Umgebung für welches Ziel?<br />
�� Weitere Betroffene/Stakeholder<br />
Wer ist neben dem direkten Anwender betroffen? Welche Interessen<br />
gibt es?<br />
� Hauptakteur<br />
Wer ist der Hauptakteur? Was löst den Anwendungsfall aus?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 148
Darstellung/Beschreibung eines Use Cases (3/3)<br />
� Voraussetzung/Vorbedingung<br />
Welchen Ausgangszustand der Umgebung benötigt der<br />
Anwendungsfall?<br />
� Hauptablauf<br />
Wie sieht der wesentliche Ablauf in dem Anwendungsfall aus?<br />
� Nachbedingung im Erfolgsfall/im Fehlerfall<br />
Welchen Systemzustand garantiert der Anwendungsfall im<br />
Erfolgsfall und im Fehlerfall?<br />
� Ausnahmen, Fehlerfälle<br />
Welche Ausnahmen sind möglich?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 149
Ticketklassen unter Java (1/3)<br />
� Was macht ein Ticket aus?<br />
Festlegung von Getter und Setter-Methoden als Interface unter Java<br />
public interface TicketInterface {<br />
public String getClient ();<br />
public String getComment ();<br />
public String getEmail ();<br />
public String getDescription ();<br />
public String getConsultant ();<br />
public TicketState getTicketState ();<br />
public ArrayList<br />
getTicketCategory ();<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 150
Ticketklassen unter Java (2/3)<br />
}<br />
public void setClient (String client);<br />
public void setComment (String comment);<br />
public void setEmail (String email);<br />
public void setDescription ( String descript);<br />
public void setConsultant (String consult);<br />
public void setTicketState (TicketState ts);<br />
public void setTicketCategory<br />
(ArrayList categories);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 151
Ticketklassen unter Java (3/3)<br />
� TicketManagement: eine ArrayList zur Verwaltung der Tickets<br />
ArrayList allMyTickets;<br />
� Ticketkategorien<br />
public enum TicketCategory {<br />
Software, Hardware, Bedienung, Betriebssystem,<br />
Netzwerk<br />
}<br />
� Modellierung der Zustände<br />
public enum TicketState { neu_erfasst,<br />
in_Bearbeitung, bearbeitet, getestet,<br />
freigegeben }<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 152
class Ticket<br />
public class Ticket implements TicketInterface {<br />
private String<br />
client, comment, email, descript, consultant;<br />
private TicketState ts;<br />
private ArrayList categories;<br />
public Ticket (String client, String comment,<br />
String email,<br />
ArrayList categories)<br />
{ ... }<br />
public String toString () { return comment; }<br />
...<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 153
AWT – Swing – SWT: ein kurzer Vergleich<br />
� AWT implementiert eigene GUI-Elemente<br />
und Grafikoperationen in Java oder C<br />
� Swing setzt auf AWT auf mit weiteren<br />
reinen Javaimplementierungen<br />
Swing<br />
JFace<br />
SWT<br />
� SWT<br />
� plattformunabhängige Schnittstelle zu<br />
den GUI-Elementen des jeweiligen<br />
Windowing-Systems<br />
� reicht größtenteils einfach Funktionsjava.awt<br />
sun.awt<br />
operating<br />
system<br />
JNI *)<br />
� reicht größtenteils einfach Funktions-<br />
windowing<br />
system<br />
operating<br />
system<br />
aufrufe weiter *) JNI: Java Native Interface<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 154
Exkurs: Applets (I)<br />
� Bei Applets handelt es sich i. d. R. um unbekannten Code<br />
� Bei der Ausführung von Applets müssen aufgrund des verständlichen<br />
Sicherheitsbedürfnisses des Nutzers bzw. dessen Systems<br />
Sicherheitsbeschränkungen eingehalten werden.<br />
� Ein Applet darf<br />
� nicht auf das lokale Dateisystem zugreifen - es sei denn der Benutzer lässt<br />
es ausdrücklich zu<br />
� keine Verzeichnisse ansehen, Existenz von Dateien prüfen<br />
� keine Dateiattribute (Größe, Zugriffsrechte) prüfen<br />
� keine Dateien lesen, schreiben, löschen, umbenennen<br />
� keine Netzwerkverbindungen zu irgendeinem Computer aufbauen<br />
� die Ausführung nicht über exit() beenden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 155
Exkurs: Applet (II)<br />
� Geeignet zur Einbettung in eine HTML-Seite<br />
� (meist nur für "kleine" Aufgaben – Downloadzeit bedenken)<br />
� spezialisierte Fensterklasse JApplet<br />
� Größe wird in der HTML-Seite festgelegt<br />
� ansonsten Bestückung mit Komponenten wie bei JFrame<br />
� Steuerung durch den Browser<br />
� init Initialisierung <strong>beim</strong> ersten Aufruf der HTML-Seite<br />
�� start Applet wird sichtbar gemacht (z.B. Animation starten)<br />
� stop Applet wird verborgen (z.B. Animation stoppen)<br />
� destroy das Applet wird entladen (Wechsel der HTML-Seite)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 156
Dokumentieren mit Java<br />
� In Java wird es der Entwicklerin/dem Entwickler sehr leicht gemacht,<br />
eine (Online-)Programmdokumentation im Stil der Java-Online<br />
Dokumentation zu erstellen, wenn man sich an die folgenden<br />
Konventionen hält:<br />
� Spezieller Kommentar zur Erläuterung der Klasse bzw. der<br />
Methoden/Komponenten steht zwischen /** und */;<br />
� spezielle Markierungen beginnen mit dem @-Zeichen und stehen<br />
dann innerhalb dieser Kommentare.<br />
� Die Sichtbarkeitsmodifikatoren (public, private, protected)<br />
müssen angegeben werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 157
javadoc<br />
� Hier eine Auswahl:<br />
�� @see name Hyperlink auf eine Klasse<br />
� @see name#methode Hyperlink auf eine Methode<br />
� @version text steht (nur) vor Klassendefinition<br />
� @author text steht (nur) vor Klassendefinition<br />
� @param name beschr. Parameterbeschreibung vor Methoden<br />
� @return beschr. steht (nur) vor Methoden<br />
� @exception Klassenname Beschreibung steht vor Methode<br />
�� Erzeugt wird die Dokumentation mit dem Befehl<br />
javadoc datei.java –version –author –windowtitle bsp<br />
� Nutzen Sie diese Dokumentationsmöglichkeiten in Ihrem Programmcode für<br />
die von Ihnen (weiter-)entwickelten Klassen im Praktikum!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 158
javadoc Beispiel<br />
Klassenübersicht<br />
Dokumentation zur<br />
gesamten Klasse<br />
Version und Autor<br />
Erläuterung<br />
des Konstruktors/<br />
der Methode und<br />
Sprung zur Methode<br />
Titel<br />
(aus javadoc Aufruf)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 159
Die JNLP-Datei: Deployment von Java-Code<br />
� Mithilfe von JNLP-Dateien kann die plattform-übergreifende zu Verfügung<br />
Stellung und Verteilung (Deployment) von Java-Applikation sehr komfortabel<br />
genutzt werden.<br />
� Man sollte sich allerdings dabei sowohl als Anbieter als auch als möglicher<br />
Nutzer der Applikation darüber bewusst sein, dass man mit dem Laden und<br />
anschließendem Ausführen der Applikation sämtliche Zugriffsrechte auf den<br />
Client hat und man damit clientseitig ein Sicherheitsrisiko eingeht.<br />
� Die Beschreibungsdatei für eine Anwendung ist in XML-Notation geschrieben<br />
und wird auf dem Webserver abgelegt, damit kann eine entsprechende<br />
Internetseite auf diese verweisen und immer die aktuellste Version anbieten<br />
(es ist darauf zu achten, dass diese Datei auf dem Webserver mit dem MIME-<br />
Type application/x-java-jnlp-file assoziiert ist; diese XML-Dateien<br />
haben i. d. R. die Endung .jnlp).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 160
JNLP: Java Network Launch Protocol<br />
Zusätzlich zu der jar-Datei wird eine jnlp-Datei erstellt:<br />
<br />
<br />
<br />
Beisipiel einer JNLP-Datei in ENA<br />
Prof. Dr. H.-P. Wiedling<br />
<br />
Demonstration von JNLP für ENA<br />
<br />
<br />
<br />
<br />
<br />
JNLP-Sicherheitsaspekte<br />
� Wenn die Applikation signiert ist, können unter diesem Element die<br />
benötigten Sicherheitseinstellungen angefordert werden. Wenn dieses<br />
Element (und das entsprechende Unterelement) nicht angegeben ist, läuft<br />
die Applikation in der Applet-ähnlichen Sandbox, mit strengen<br />
Zugriffsrechten.<br />
� all-permissions<br />
� Wenn diese Option angegeben ist und die Applikation signiert ist, werden der<br />
Applikation alle Rechte eingeräumt.<br />
�� j2ee-application-client-permissions<br />
� Mit dieser Option möchte die Applikation die Zugriffsmöglichkeiten, die es als<br />
J2EE-Client benötigt. Damit darf die Applikation beispielsweise nicht auf<br />
lokale Ressourcen zugreifen, dafür aber auf alle Hosts auf allen Ports.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 162
JNLP erstellen<br />
� jar-Datei erstellen:<br />
jar cvfm turtle.jar manf *.java *.class<br />
� Verschlüsselung erstellen:<br />
keytool -genkey -keystore myKeys -alias turtle<br />
... es folgen Abfragen von Schlüsselinformationen<br />
(inkl Pw für Keystore und turtle) u.a. „keytool -list -keystore myKeys“<br />
� jar-Datei signieren:<br />
jarsigner -keystore myKeys turtle.jar turtle<br />
Quelle:<br />
http://java.sun.com/developer/technicalArticles/Programming/jnlp/ (überholt)<br />
http://download.oracle.com/javase/tutorial/deployment/webstart/deploying.html oder<br />
http://www.dpunkt.de/java/Programmieren_mit_Java/Deployment/9.html#id502<br />
auf pw für<br />
Keystore und<br />
Eintrag achten!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 163
Entwurf:<br />
�� Diagramme<br />
� Rapid Prototyping<br />
� Modelle und Metapher<br />
� Gestaltungskriterien<br />
� Screens (abstrakt, konkret)<br />
� Navigationsübersicht<br />
� Abläufe/Workflow<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 164
Ein kleines Beispiel<br />
� Überlegen Sie, wie ein Anwender den Dialog mit einem<br />
Geldautomaten wahrnimmt und auch beschreibt<br />
� Zugangsberechtigung kontrollieren<br />
(EC-Karte und Ihre 4stellige Geheimnummer)<br />
� Betrag angeben<br />
�� Betrag ausgeben<br />
� Automat wieder in den Ausgangszustand<br />
versetzen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 165
Notation des Sequenzdiagramms<br />
Objekt<br />
Methodenausführung<br />
Lebenslinie<br />
Meth.aufrufen<br />
eigene<br />
Methode<br />
aufrufen<br />
Bedingung<br />
siehe auch SWT-Skript<br />
Ablauf objektorientiert<br />
beschrieben<br />
Objekt<br />
erzeugen<br />
Objekt<br />
zerstören<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 166
Sequenzdiagramm "Geld holen"<br />
����<br />
���������<br />
���������<br />
����<br />
�����<br />
������������������<br />
������������<br />
������������<br />
E������� ��������<br />
��� ���� ������<br />
���������� ��������<br />
�� �����<br />
������ ������ ��������<br />
�������� ��������<br />
��������<br />
E������� ��������<br />
���� ���<br />
��� ������<br />
E������� ��������� ���������<br />
���� ��������<br />
���� ���������<br />
���������<br />
���������<br />
��������<br />
��������<br />
��������<br />
����������<br />
���������<br />
���������<br />
���<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 167
Sequenzdiagramm "Geld abheben"<br />
Ich:<br />
CBenutzer<br />
Geld<br />
holen<br />
EC-Karte einlesen<br />
Use Case wählen<br />
PIN-Nummer einlesen<br />
Betrag einlesen<br />
EC-Karte ausgeben<br />
EC-Karte entnehmen<br />
Geld entnehmen<br />
VolksbankAutomat1:<br />
CGeldautomat<br />
Geld ausgeben<br />
in diese<br />
Richtung<br />
kann man<br />
das innere<br />
Verhalten<br />
weitermodellieren<br />
Screens=<br />
Zustände<br />
Ruhestellung<br />
Hauptmenü<br />
PIN-Dialog<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 168
Geldautomat als "Assistent“ (üblich)<br />
� "Assistenten" serialisieren die Abfrage mehrerer Eingabewerte vom<br />
Benutzer<br />
� Vereinfachung: Benutzer muss zu einem Zeitpunkt nur<br />
über eine Frage nachdenken<br />
� sinnvoll für selten benutzte Anwendungsfälle oder<br />
für unerfahrene Benutzer<br />
� langsam und schwerfällig für Profis<br />
� zum Vergleich der bekannte Geldautomat<br />
nicht als Assistent:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 169
Szenario "Kontostand abfragen"<br />
Benutzer Automat<br />
führt EC-Karte ein<br />
wählt "Kontostand abfragen"<br />
gibt PIN-Nummer ein<br />
nimmt EC-Karte<br />
bietet Hauptmenü an<br />
erfragt PIN-Nummer<br />
gibt EC-Karte heraus<br />
zeigt Kontostand an<br />
geht in Ruhestellung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 170
Szenario "Geld holen"<br />
Benutzer Automat<br />
führt EC-Karte ein<br />
wählt "Auszahlung"<br />
gibt PIN-Nummer ein<br />
gibt Betrag ein<br />
nimmt EC-Karte<br />
nimmt Geld<br />
Sicht der Bank<br />
Sicht des Kunden<br />
bietet Hauptmenü an<br />
erfragt PIN-Nummer<br />
erfragt Betrag<br />
gibt EC-Karte heraus<br />
gibt Geld heraus<br />
geht in Ruhestellung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 171
Geldautomat: Use Case Diagramm<br />
Use Cases<br />
entsprechen<br />
oft der<br />
obersten<br />
Menüebene<br />
Kunde<br />
Geldautomat<br />
Kontostand<br />
abfragen<br />
Geld holen<br />
Schecks<br />
bestellen<br />
Geldvorrat<br />
prüfen<br />
Geld<br />
nachfüllen<br />
eingezogene<br />
Scheckkarten<br />
entnehmen<br />
eine Benutzergruppe sieht oft nicht die Funktionen der anderen<br />
Mitarbeiter<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 172
Sequenzdiagramme - Notation<br />
� stellen Objekte und deren Interaktion dar<br />
� Interaktion: eine Methode ruft eine andere Methode auf<br />
� Zeitachse von oben nach unten<br />
� Lebensdauer des Objekts durch "Lebenslinie" dargestellt<br />
� vgl. Flussdiagramm / Programmablaufplan<br />
� ältere Diagrammtypen, die nicht objektorientiert sind<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 173
Sequenzdiagramme - Bewertung<br />
� Diagramme für GUI-Entwurf in UML nur beschränkt geeignet:<br />
� UML konzentriert sich auf die Architektur von SW-Systemen<br />
� vernachlässigt den visuellen Aspekt<br />
� ein GUI wird zwar mit Klassen realisiert, anhand eines Klassen- oder<br />
Kollaborationsdiagramms kann man sich aber kein Bild von<br />
Aussehen und Benutzung machen !<br />
� Vorschlag: Screen-Diagramme<br />
� im Grunde abgewandelte Zustandsdiagramme<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 174
abstrakt und konkret<br />
Beispiel: Lehrangebote<br />
ansehen<br />
� abstrakte Elementliste<br />
� konkretes Layout<br />
(Stichwortliste, Halbsätze) (konkrete Anordnung, Festlegung<br />
auf Componenten)<br />
Sortierung wählen:<br />
Semester, Dozent, Import/Export<br />
<strong>Fachbereich</strong> wählen<br />
Vorschau<br />
Drucken<br />
Ausgabe in Datei<br />
Schließen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 175
Verbindung zum Sequenzdiagramm<br />
OnSortClick<br />
OnFbChange<br />
OnDiskClick<br />
OnPrintClick<br />
LvPlanungView:<br />
CLvPlanungAusgDlg<br />
OnPreviewClick<br />
OnExitClick<br />
SetSort(Sort)<br />
SetFb(Fb)<br />
Output(P)<br />
LvPlanungModel:<br />
CLvPlanungAusg<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 176
Komplexität beherrschen<br />
� Diagramme beanspruchen viel Platz<br />
� Problem <strong>beim</strong> Zeichnen<br />
� Problem <strong>beim</strong> Verstehen<br />
� sinnvolle Zerlegung in Teildiagramme ist wichtig<br />
� insbesondere auch hierarchische Gliederung<br />
� Abstraktion<br />
�� nicht einfach orientiert an der Papiergröße zerschneiden<br />
� aussagekräftige Bezeichnung für jedes Teildiagramm<br />
� analog zu sinnvollen Klassen- und Funktionsnamen<br />
gilt für alle,<br />
nicht nur für<br />
Zustandsdiagramme<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 177
Zustandsdiagramme: Idee und Notation<br />
� ein Objekt kann im Lauf der Zeit<br />
verschiedene Zustände annehmen<br />
� Haben einen Anfang und ein Ende<br />
� Zustandswechsel werden durch<br />
Ereignisse ausgelöst<br />
� unterschiedliche Folgezustände sind<br />
möglich abhängig von Bedingungen<br />
(Verzweigungen im Diagramm)<br />
�� Aktionen können ausgeführt werden<br />
� <strong>beim</strong> Übergang in den Folgezustand<br />
(notiert mit Ereignis/Aktion)<br />
� während des Verweilens in einem<br />
Zustand (notiert mit do/...)<br />
siehe auch OOAD-Skript!<br />
Objekt wird erzeugt<br />
durchläuft<br />
mehrere<br />
Zustände<br />
und wird vernichtet<br />
Zustand<br />
do/Aktion<br />
Ereignis[Bedingung]/Aktion<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 178
Beispiele: Tür und Lampe<br />
Tür<br />
Schließen(“rumms“)<br />
Übergangsaktion<br />
offen<br />
Öffnen<br />
geschlossen<br />
Einschalten<br />
Lampe<br />
aus<br />
an<br />
do/leuchten<br />
Ausschalten<br />
Zustandsaktion<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 179
Implementierung<br />
� Zustand: Kombination von Attributwerten des Objekts<br />
� Ereignis: empfangene Nachricht / Handler-Aufruf<br />
� Bedingung: wird im Handler ausgewertet<br />
� Zustandsübergang: Funktionskörper eines Handlers<br />
� Übergangsaktion: Methodenaufruf für anderes Objekt<br />
� Zustandsaktion: Methodenaufruf (in separatem Thread)<br />
speziell bei GUIs:<br />
� Screens / Dialoge sind Zustände des Objekts "Bedienoberfläche"<br />
� Hauptfenster hat Zeiger auf untergeordnete Fenster als Attribute<br />
� objektorientiert + ereignisorientiert<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 180
Diagramme – für wen?<br />
� Diagramme aus der Softwaretechnik sind nicht geeignet, um mit<br />
Auftraggebern zu kommunizieren<br />
� selbst konkrete Screen-Diagramme nicht !<br />
� allenfalls, wenn die Auftraggeber selbst <strong>Informatik</strong>er sind<br />
� zur Kommunikation mit Auftraggebern und Benutzern braucht man<br />
Prototypen<br />
�� visuell und funktional konkret, nicht erklärungsbedürftig<br />
� Diagramme helfen dem Entwickler <strong>beim</strong> Entwurf,<br />
dem Wartungsprogrammierer zum Verständnis<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 181
Manifest und Prinzipien der agilen<br />
Softwareentwicklung (kurzer Exkurs)<br />
� ...<br />
Durch die[se] Arbeit haben wir Folgendes schätzen gelernt:<br />
Individuen und Interaktionen mehr als Prozesse und Tools<br />
Funktionierende Software mehr als umfassende Dokumentation<br />
Zusammenarbeit mit Kunden mehr als Vertragsverhandlungen<br />
Reaktion auf Änderungen mehr als einen Plan zu befolgen<br />
...<br />
� We follow these principles:<br />
� Our highest priority is to satisfy the customer<br />
through early and continuous delivery of valuable software.<br />
� Welcome changing requirements, even late in development. Agile processes<br />
harness change for the customer's competitive advantage.<br />
� Deliver working software frequently, from a couple of weeks to a couple of<br />
months, with a preference to the shorter timescale.<br />
� Business people and developers must work together daily throughout the project.<br />
� http://www.agilemanifesto.org/ und<br />
http://www.agilemanifesto.org/principles.html<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 182
Einschub: Modelle eines Systems<br />
� Modelle sind vereinfachte Darstellungen<br />
einer Wirklichkeit<br />
� Paradebeispiel Atommodelle in der Chemie<br />
a) mentales Modell<br />
� Sicht des Benutzers;<br />
an der Anwendung orientiert<br />
b) augenscheinliches Modell<br />
hoffentlich identisch<br />
� wie sich das System nach außen darstellt<br />
c) Implementierungsmodell<br />
� Sicht des Entwicklers; technologisch orientiert<br />
kein kein Modell<br />
entspricht der<br />
„Realität"<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 183
Use Cases eines Buchs<br />
� der Leser? der gründliche Leser, der eilige Sucher, der Schenkende<br />
� Fachbuch = System zur Informationsspeicherung<br />
� von Anfang bis Ende lesen umblättern<br />
� Überblick bekommen Inhaltsverzeichnis<br />
� Information zu einem Thema suchen Inhaltsverzeichnis<br />
� Detailinformation / Stichwort suchen Index<br />
� Wieder Auffinden einer Stelle Lesezeichen<br />
�� weiterführende Information finden Literaturliste<br />
Literaturliste<br />
� Kaufentscheidung treffen Inhaltsverz., Klappentext, Leseprobe; Preis<br />
� vgl. Grundfunktionen eines Browsers<br />
� vgl. dagegen einen Roman<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 184
z.B. Dokument- statt Datei-Menü<br />
� das bekannte Datei-Menü ist nahe am<br />
Betriebssystem<br />
� für einige Funktionen muss man die Datei<br />
erst schließen<br />
� wie wollen Benutzer mit Dokumenten arbeiten ?<br />
� offenes Dokument umbenennen oder<br />
verschieben<br />
� Version orientiert: Meilensteine<br />
�� Änderungen vergessen statt<br />
Schließen und wieder Öffnen<br />
� ABER:<br />
das Beispiel ist problematisch, weil Benutzer<br />
Datei orientiertes Arbeiten gewohnt sind ...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 185
Entwurf der Grobstruktur des Dialogsystems<br />
Von Use Cases zu Bildschirmmasken<br />
eine Möglichkeit<br />
� jeder Use Case wird in eine Bildschirmmaske abgebildet<br />
� Benennung des Use Case wird Titel des Screens<br />
"Screen"<br />
� ggfs. weitere untergeordnete Dialoge bei komplexen Use Cases<br />
� keine Funktionen oder Daten in einen Screen,<br />
die nicht unmittelbar zu diesem Use Case gehören !<br />
� Gruppierung der Screens nach Benutzergruppen<br />
� besser: Identifikation des Benutzers durch Anmeldung und<br />
Ausblendung der Use Cases anderer Benutzergruppen;<br />
jeder Benutzer bekommt nur Screens "seiner" Gruppe zu sehen<br />
� Hauptfenster enthält Übersicht der Use Cases<br />
� und verzweigt dorthin<br />
im primitivsten Fall eine Liste<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 186
(Rapid) Prototyping<br />
� ob ein Entwurf "funktioniert", erkennt man nicht mit Hilfe von<br />
Diagrammen<br />
� Begriff "funktionieren" unter Designern: "seinen Zweck erfüllen"<br />
� frühzeitiger Test mit Benutzern ist notwendig<br />
� erfordert weitgehend arbeitsfähigen Prototyp<br />
� Benutzertest braucht eigentlich mehr als nur die Oberfläche ...<br />
� Benutzer fragen will gekonnt sein ...<br />
�� mit geeigneten Tools ist die Erstellung einer Bedienoberfläche nicht<br />
aufwendiger als mit einem Zeichenwerkzeug<br />
� vgl. Photoshop / Director � Visual Basic / Visual C++ / Eclipse<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 187
Der erste Eindruck zählt …<br />
� (Rapid) Prototyping<br />
�� Fake (Schwindel, Betrug, Fälschung, etwas vortäuschen)<br />
� Mock Up (Fälschung, Schein, Imitation)<br />
Diese drei Begriffe beschreiben eine Idee:<br />
Um als Entwickler bereits in der frühen Phase einer<br />
Programmentwicklung mit dem Anwender Effekte an der<br />
Bedienoberfläche diskutieren zu können, entstehen unvollständige<br />
Prototypen, anhand derer das Look&Feel der<br />
Applikation und deren Wirkung auf den Anwender erörtert<br />
werden können.<br />
Verschiedene Softwareprototypen vermitteln in frühen<br />
Planungsphasen einen brauchbaren Eindruck für die gestellte<br />
Aufgabe.<br />
Kommunikationsprobleme zwischen IT-Experten und Kunden<br />
lassen sich mit Prototypen verringern.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 188
Der erste Eindruck zählt: Prototyping<br />
� Grob lassen sich Prototypen unterteilen in Demonstrations-,<br />
Analyse-, Architektur- und Designprototypen<br />
� Prototyp als Kommunikationsbasis für Entwickler und Anwender<br />
� Proof-of-Concept (POC) im Sinne einer Machbarkeitsstudie<br />
� GUI-Prototyping zielt darauf ab, den Anwender frühzeitig in den<br />
Entwicklungsprozess einzubeziehen<br />
�� Bewusst/Unbewusst entstehen Systemgrenzen bzw. Prototyp gibt<br />
Hinweise auf Strukturen<br />
ABER: Anwender ändert seine Meinung!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 189
Prototypen - vertikal<br />
� Vertikale Prototypen sollen helfen, Aussagen über die Architektur<br />
machen zu können; es ist darauf zuachten, dass der Ausschnitt der<br />
realisiert wird, nicht zu trivial ist!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 190
Prototypen - horizontal<br />
� Horizontale Prototypen decken den kompletten Satz der Funktionen<br />
in einer Anwendungsebene ab; die technische Korrektheit spielt eine<br />
untergeordnete Rolle<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 191
Direkte Manipulation (1/2)<br />
� Einfach erlernbar: intuitiv<br />
� Leichte Ausnutzung aller Möglichkeiten des Systems<br />
� Hohe subjektive Befriedigung<br />
� Keine komplizierte Kommandosprache<br />
� Reduzierung des kognitiven Overheads<br />
� Point-and-Click �� Remember-and-Type<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 192
Direkte Manipulation (2/2)<br />
Dabei ist zu beachten, dass<br />
� Aktionen umständlich werden können,<br />
� eine adäquate graphische Darstellung unter Umständen<br />
schwierig ist,<br />
� die Bedienung des Zeigegerätes für Experten zu langsam ist und<br />
sogar zur Ausbremsung des Arbeitsflusses führen kann,<br />
� sie aufwändig zu programmieren ist<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 193
Bildliche Darstellung (Icons)<br />
Dabei ist zu beachten<br />
� Bild schneller zugänglich als Text<br />
� Grafisches Zeigeinstrument anstelle Kommandoeingabe<br />
� Einfache Operationen:<br />
� Move, Size, Scroll, Open, Close, Iconify, Highlight, Drag-and-<br />
Drop, …<br />
� Direkte Manipulation: unmittelbare Wirkung und sofortige<br />
Anzeige des neuen Zustandes<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 194
Gestaltungskriterien (1/2)<br />
� Performanz:<br />
�� Speicherkapazität, Rechnerleistung, Netzleistung, Datenmenge<br />
in der Anwendung, Antwortzeiten<br />
� Wiederverwendbarkeit:<br />
� Nutzen bereits implementierter Bausteine, parametrisierte<br />
Standarddialoge, Produktivität<br />
� Konsistenz/Konformität:<br />
�� Vertrautheit, gleiches Verhalten in ähnlichen Situationen,<br />
keine sinnlosen Aktionen<br />
(z.B. kein Delete anbieten, wenn kein Objekt existiert)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 195
Gestaltungskriterien (2/2)<br />
� Realitätsnähe:<br />
� Vertraute Objekte bedeuten Komfort �� Reduktion der<br />
Komplexität<br />
� Mentale Modell:<br />
� Vorstellung des Benutzers vom System muss mit dem<br />
Systemverhalten zusammen passen<br />
� Einsatz von Metapher<br />
�� Mediengerecht:<br />
� Interaktion, Dynamik, Kombinierbarkeit,<br />
Informationsaufbereitung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 196
Gestaltungskriterien<br />
Performanz<br />
Mentales Mentales<br />
Modell<br />
Medien<br />
gerecht<br />
Wieder- Wiederverwendbarkeit<br />
Realitätsnähe<br />
Konsistenz<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 197
Layoutüberlegungen 1/2<br />
� Layoutentscheidungen müssen nachvollziehbar und begründet sein;<br />
Entscheidungen nicht aus dem Bauch heraus treffen!<br />
� Geeignete Ansatzpunkte bieten die Anforderungen durch die<br />
Aufgabenstellungen und die Benutzerprofile<br />
� Beachten Sie kulturelle Eigenarten:<br />
Bedeutung von Farben, Informationswahrnehmung<br />
� Achten Sie auf kognitive Fähigkeiten:<br />
Was bzw. wie viel kann man sich merken?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 198
Layoutüberlegungen 2/2<br />
� Hilfreich kann sein, bekannte Begrifflichkeiten und Metapher aus der<br />
Anwendungsdomäne gezielt einzusetzen<br />
� Akten durchlaufen einen bestimmten Prozess,<br />
� es gibt eine Ablage, das Vier-Augen-Prinzip ist bekannt, …<br />
dadurch wird die Akzeptanz, das Vertrauen und das intuitive<br />
Verständnis und die Bereitschaft, das System zu erlernen erhöht und<br />
gefördert.<br />
�� Ein vertrautes Mentales Modell hilft dem Nutzer, sich zurecht zu<br />
finden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 199
Benutzerprofile - Ticketbeispiel<br />
� Kunde (Client):<br />
�� meldet/erfasst neues Ticket;<br />
� erhält Rückmeldung/Feedback<br />
(aus System und per Email nach erfolgreicher Bearbeitung)<br />
� Abteilungsleiter (Dispatcher)<br />
� verteilt/ordnet Ticket Sachbearbeiter zu und<br />
� überprüft/sichert Qualität/testet/erteilt Freigabe<br />
� Sachbearbeiter (Consultant)<br />
� bearbeitet (d.h. fügt Kommentar ein, ordnet Fehlerkategorie neu zu) und<br />
testet<br />
� Weitere Profile (Administrator, Hotline-Mitarbeiter oder 1st-,2nd und 3rd-Level-<br />
Supportmitarbeiter) lassen sich aus der Beschreibung nicht entnehmen<br />
� Es lassen sich auch keine Kontakte zwischen Kunden und Mitarbeiter oder<br />
Prioritäten erkennen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 200
Design/Layout: Use Case(s) beachten<br />
� Wie sind die Arbeitsabläufe? Sind alle Schritte/Aktionen klar ersichtlich?<br />
�� Was passiert vorher? Was passiert nachher?<br />
� Welche Benutzergruppe(n) nutzt/nutzen den Screen?<br />
� Welche Aufgaben sollen bearbeitet werden? Gibt es einen Standardablauf<br />
� Was geschieht bei dynamischen Veränderungen?<br />
� Die Größe des Screens wird verändert<br />
� Die Anzahl der Componenten verändert sich<br />
� Welches Feedback bekommt der Benutzer?<br />
� Wird der Benutzer geführt?<br />
� Gibt es Orientierungshilfe? Welche Schritte stehen noch an?<br />
� Können Entscheidungen/Interaktionen rückgängig gemacht werden?<br />
� Kann der Benutzer Fehler machen bzw. werden diese verhindert?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 201
Screens - Ticketbeispiel<br />
Screen „Anmeldung“ (login) als Kunde, Abteilungsleiter oder Sachbearbeiter:<br />
als Kunde/Client:<br />
1 Erfassung und Bearbeitungsfortgang<br />
• Ticket neu erfassen<br />
• (Bearbeitungszustand eigener Tickets betrachten/inspizieren)<br />
als Abteilungsleiter/Dispatcher:<br />
2 Monitoren (insgesamt) – Sachbearbeitern zuordnen<br />
• Bearbeitungszustand aller Tickets betrachten<br />
• (alle) neu erfassten Tickets anhand Beschreibung sichten und Mitarbeiter zu<br />
ordnen<br />
• Qualitätskontrolle und abschließende Freigabe<br />
als Sachbearbeiter/Consultant:<br />
3 Bearbeiten/Kommentieren und testen<br />
• zu gewiesene Tickets untersuchen/bearbeiten (Angabe d. Fehlerursache)<br />
Ticket mit Kommentar versehen<br />
• testen (Angabe des Testprotokolls) und damit Zustand ändern<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 202
Layout: Analyse � Design � Konstruktion<br />
� Analyse<br />
� Die fachlichen Anforderungen führen zu einem ersten groben<br />
Ablauf<br />
� abstrakte Screens<br />
� Use Cases geben eine Hinweis auf sinnvolle Begriffe/Bezeichner<br />
und Ablauffolgen/Workflows<br />
� Das Überlagern eines Screens mit Rasterlinien ist<br />
aufschlussreich und liefert wertvolle Hinweise zur Struktur und<br />
dem Aufbau des Screens<br />
� Die verschiedenen Bestandteile (Componenten, Container und<br />
LayoutManager) werden grafisch identifiziert<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 203
Layout: Analyse � Design � Konstruktion<br />
� Gestaltung<br />
�� Konkrete Auswahl der Container:<br />
Scrollen? Splitten? Was passiert <strong>beim</strong> Vergrößern/Verkleinern des Screens?<br />
� Auswahl und Festlegung des Farbklimas (� Style Guides entstehen)<br />
� Schrift-, Fenster- und Icongröße beeinflussen die Gesamtgröße<br />
� Was soll passieren, wenn sich die Componenten in Anzahl und Typ ändern?<br />
� Das User Interface führt den Nutzer … durch Zustandsanzeige, durch<br />
Feedback, durch Konsistenz, … durch Fokussteuerung, …<br />
� Das User Interface entlastet den Nutzer … durch Voreinstellung, durch<br />
Vorsorge zur Fehlervermeidung …<br />
� Das User Interface ist selbsterklärend … durch Tooltips, Statusbar, …<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 204
Layout: Analyse � Design � Konstruktion<br />
� Konstruktion<br />
� Konkretes Programmieren und Zusammenfügen von<br />
• Componenten (Dialogbausteine),<br />
• Container (hier: diverse Panel) und<br />
• LayoutManager<br />
� Anbindung an die Objekte in der Anwendung<br />
� MVC Architektur mit interface und/oder Adapterklassen<br />
�� Kodierung in Java/Swing<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 205
Navigationsübersicht: Screens und Abläufe<br />
Abteilungsleiter verteilt/ordnet zu, hat<br />
Termine und Auslastung im Auge (macht<br />
Qualitätssicherung)<br />
Anmeldung/ Login als<br />
Kunde, Mitarbeiter oder<br />
Abteilungsleiter<br />
Kunde macht<br />
Ersterfassung<br />
• Prozess vollständig<br />
und am Arbeitsablauf<br />
orientiert?<br />
Mitarbeiter • Screens voll-<br />
bearbeitet und testet ständig und nicht<br />
überfrachtet<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor (d.h. Studiengang<br />
aufgaben-<br />
Prof. Dr.-Ing. Hans-Peter angemessen)?<br />
Wiedling<br />
Seite 206
Navigationsübersicht<br />
Übersicht<br />
mit<br />
Workflow<br />
zurück<br />
Notation und Vereinfachungen:<br />
– Zustände als<br />
Skizzen/Screenshots<br />
– Übergänge i.a. mit Linksklick<br />
– R mit Rechtsklick<br />
– Rücksprung / Schließen<br />
Use<br />
Cases<br />
UML passt nur bedingt für GUI;<br />
Zustandsdiagramm weiterentwickelt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 207
Notation der Navigationsübersicht<br />
Anwendung<br />
• starten<br />
• beenden<br />
Aktionen<br />
• neues Hauptfenster<br />
• neuer Dialog/PopUp<br />
• Rücksprung<br />
Ereignisse<br />
• keine Angabe: linker Mausklick<br />
• rechter Mausklick R<br />
Zustände<br />
• Elementliste (abstrakter Screen) oder<br />
• Layout-Skizze (konkreter Screen) oder<br />
• Screenshot (konkret, Dokumentation)<br />
Bedingungen<br />
• mit Shift/Umschalttaste S<br />
• mit Ctrl/Strg-Taste C<br />
• mit Alt-Taste A<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 208
High Level: Workflow<br />
� ein Arbeitsablauf (Workflow) verkettet mehrere<br />
Anwendungsfälle verschiedener Benutzer (Mitarbeiter)<br />
� Beispiel:<br />
Bestellung verbuchen � Lieferung zusammenstellen<br />
� Lieferschein schreiben � Rechnung schreiben<br />
� Zahlungseingang verbuchen<br />
� Metapher: der Weg einer Akte durch eine Verwaltung<br />
� typischerweise wird der nächste Mitarbeiter vom System<br />
durch eine Botschaft informiert, wenn der vorige seine<br />
Teilaufgabe erledigt hat<br />
� kann mit Flussdiagramm / Programmablaufplan dargestellt werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 209
Low Level: Szenarien<br />
� Szenario: Ablauf hinter einem Anwendungsfall / Screen<br />
� Verfeinerung des Anwendungsfalls<br />
� verbale Beschreibung aus Sicht des Benutzers<br />
� jetzt unter Berücksichtigung wichtiger systeminterner Objekte<br />
� systeminterne Objekte sollten dem mentalen Modell des<br />
Benutzers entsprechen<br />
� formale Beschreibung mittels Sequenzdiagramm<br />
� Präzisierung der verbalen Beschreibung<br />
� Benutzerereignisse rufen Methoden der Fensterklasse auf<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 210
Fokussteuerung definieren<br />
2<br />
4<br />
6<br />
8<br />
� vollständiger Weg mit >>Tab
Focus unter Java verändern<br />
� Bezieht sich auf Instanzen der Klasse Component<br />
� Reihenfolge wird zunächst implizit durch das Erzeugen festgelegt<br />
� mit >>Tab>Shift>Tab
Layout/Fenstergestaltung<br />
• Anordnung<br />
• Gruppierung<br />
• Hervorheben<br />
• Größen/Sehwinkel<br />
• Ästhetik<br />
• Farbe<br />
• Physiologische Aspekte<br />
• Psychologische Aspekte<br />
• Schrift/Beschriftung/Text<br />
• Ausrichtung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 213
Gedanken zur Fenstergestaltung<br />
� Proportionen, Balance, (Symmetrie), Einfachheit<br />
�� nicht die ganze Fläche mit Komponenten pflastern;<br />
Freiflächen sind wichtige Gestaltungsmittel !<br />
� Führung der Augen von links oben nach rechts unten<br />
� Mehrspaltigkeit erleichtert das Lesen (vgl. Zeitung)<br />
� Fenster eher breit als hoch (analog zum Bildschirm und Sichtfeld)<br />
� Kanten der Komponenten bilden Fluchtlinien<br />
� Anzahl der Fluchtlinien minimieren, ohne jedoch Komponenten sinnlos<br />
zu vergrößern<br />
� einheitliche Schriftart, abgestimmte Farben (Farbklima)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 214
Prioritäten für Gruppierung<br />
� inhaltliche Gemeinsamkeiten (Funktionsgruppen)<br />
� aufgabenbezogene Folge von Arbeitsschritten<br />
� Benutzungshäufigkeit<br />
� aber nicht dynamisch verändern !<br />
�� alphabetische Anordnung, Nummerierung etc.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 215
Hinweise zur Gruppierung<br />
� Elemente im oberen Bereich einer Gruppe werden schneller<br />
entdeckt als im unteren<br />
� Komponenten in Gruppe besser spalten- als zeilenweise anordnen<br />
� Gruppenrahmen mit Überschriften erhöhen die Übersichtlichkeit<br />
� besser Freiflächen als Gruppenrahmen ohne Überschrift<br />
� 4-5 Gruppen, 4-5 Komponenten pro Gruppe<br />
� Gruppen sollten als solche erkennbar sein und sich von<br />
Nachbargruppen abgrenzen<br />
� Gruppen so ausrichten, dass nur wenige Fluchtlinien entstehen<br />
� Eigene Gestaltungsregeln in allen Gruppen konsistent anwenden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 216
Natürliche Anordnung<br />
bottom<br />
left<br />
right<br />
top<br />
Border<br />
Border<br />
natural mapping<br />
das Herdplattenproblem<br />
Cursortasten<br />
� Wichtig: (Um-)Denken vermeiden! � Haben Sie eine Idee?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 217
Hervorheben von Komponenten<br />
� Hervorhebungen trennen Informationen, gewichten, erleichtern<br />
Suchen und Finden, lenken Aufmerksamkeit<br />
� Größe der hervorzuhebenden Komponente<br />
� abweichende Orientierung oder Form<br />
� Isolierung, Einzelstellung, Umrandung<br />
� Farben (wenige !), Hell-Dunkel-Kontrast, Inversdarstellung<br />
� fetter Schriftfont oder Großbuchstaben<br />
�� Blinken (aber sparsam und nur an einer Stelle)<br />
� nicht mehr als 10-20% aller Informationen hervorheben<br />
� gewählte Darstellungsart der Hervorhebung durchgängig benutzen<br />
beliebter<br />
Fehler, dies<br />
nicht zu tun<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 218
Minimal- und Maximalgrößen<br />
� physiologische Gegebenheiten des durchschnittlichen menschlichen<br />
Auges berücksichtigen<br />
� empirisch ermittelt und in Normen festgehalten<br />
� der Entwickler darf nicht das eigene Auge als Maßstab nehmen !<br />
� begrenzte Sehschärfe erfordert Mindestgröße<br />
� für ermüdungsfreies Lesen<br />
�� Schriftgröße mindestens 0.3 Grad Sehwinkel, besser 0.5 Grad<br />
� schnelle Fixation empfiehlt Maximalgröße<br />
� für schnelles Erfassen "auf einen Blick"<br />
� Komponentengruppe maximal 5 Grad Sehwinkel<br />
unabhängig<br />
von Systemkonfiguration<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 219
eine Bemerkung zum Sehwinkel<br />
Abstand<br />
1pt = 1/72 inch<br />
1 inch = 2,54 cm<br />
Höhe<br />
Beispiel: 8pt = 0,282cm<br />
Abstand: a = 50cm<br />
Sehwinkel: α = 0,3°<br />
cos α = 50 / Hypotenuse<br />
sin α = Höhe / Hypotenuse<br />
� Höhe = 50 * sin .3/cos .3<br />
Höhe = 0,262 cm<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
H<br />
Seite 220
Abbildungsmaßstab<br />
� Angabe von Schriftgrößen<br />
traditionell in "Punkt"<br />
� 1 pt = 1/72 Zoll; 1 Zoll = 1 inch = 2,54 cm<br />
� korrekt auf Papier, problematisch am Bildschirm<br />
� Abbildungsmaßstab systemabhängig<br />
� MacIntosh 72 dpi, Unix GUIs (Motif, KDE, ...) ?,<br />
Windows 96 dpi (kleine) / 120 dpi (große Schriften)<br />
� plattformübergreifend: Director und Java 72 dpi<br />
�� gemischte Bemaßung ist problematisch<br />
� HTML: Schriften in pt, sonstige Maße in Pixel<br />
� Windows: Schriften und Controls in pt,<br />
Fenster in Pixel<br />
unterschiedliche<br />
Monitorgröße u.<br />
Grafikauflösung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 221
Ästhetik<br />
� Ästhetik ist nicht einfach Geschmackssache<br />
� unterliegt jedoch zeitbedingten Sehgewohnheiten<br />
� wichtiger Aspekt moderner Produkte<br />
kein ergonomisches Thema mehr<br />
� um so bedeutender, je ausgereifter und vergleichbarer<br />
die Grundfunktion konkurrierender Produkte ist<br />
� wird von Ingenieuren gerne wegdiskutiert<br />
bzw. nicht richtig eingeschätzt<br />
�� regelmäßiges Face Lifting <strong>beim</strong> SW-Upgrade<br />
� z.B. Windows und MS Office<br />
� suggeriert Wertigkeit und Modernität<br />
� läuft Kontinuität und Konsistenz zuwider<br />
vergleiche<br />
Autos,<br />
U-Elektronik,<br />
Parfume,<br />
Geschirr,<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 222
Farbe - Was ist Farbe ?<br />
� Physikalische Sicht<br />
�� Spektralfarben = "Regenbogenfarben"<br />
• eine Frequenz; Wellenlänge in nm<br />
� Rest: Überlagerung mehrerer Freq.<br />
� Physiologische Sicht<br />
520<br />
nicht<br />
darstellbare<br />
Farben<br />
500<br />
480<br />
Wellenlänge<br />
550 nm<br />
� dieselbe Farbempfindung kann durch 380<br />
verschiedene Mischungen von mind. 3 Farben erzeugt werden<br />
� Darstellung in der Farbtafel<br />
� Spektralfarben auf Bogen, Rot-Blau-Mischung auf Purpurgerade<br />
� Ordnungsprinzip: Mischfarben liegen auf Verbindungsgeraden<br />
� Dreieck umschließt mögliche Mischfarben aus 3 Primärvalenzen<br />
� berücksichtigt nicht die Luminanz (Helligkeit, Farbintensität)<br />
780<br />
"unbunt"<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 223
Farbmodell RGB<br />
� Mischung von farbigem Licht<br />
� Grundfarben Rot, Grün, Blau<br />
� additive Farbmischung<br />
� Projektion der Primärvalenzen auf dieselbe Fläche<br />
� Einsatzgebiete<br />
� Wiedergabe über Monitor<br />
• Primärvalenzen durch Leuchtstoffe bestimmt<br />
�� Aufnahme mit Scanner oder Kamera<br />
• Primärvalenzen durch Farbteiler/Farbfilter bestimmt<br />
� 3D-Farbraum mit kartesischen Koordinaten<br />
� Mischung entspricht vektorieller Addition<br />
Grün<br />
Blau<br />
Rot<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 224
Farbmodell CMYK<br />
� Mischung von Farbstoffen (Farbfiltern)<br />
�� Grundfarben Cyan, Magenta, Yellow, blacK<br />
� subtraktive Farbmischung<br />
� Beleuchtung mit weißem Licht<br />
• Cyan schluckt R transparent für B und G<br />
• Magenta schluckt G transparent für R und B<br />
• Yellow schluckt B transparent für R und G<br />
� Mischung von CMY ergibt (fast) Schwarz<br />
• Schwarz als 4. Grundfarbe wegen Unsauberkeit<br />
� Einsatzgebiet: Wiedergabe über Drucker<br />
Cyan<br />
� typische Probleme: geringere Farbsättigung als Bildschirm;<br />
schlechtere Dosierbarkeit = weniger Farbabstufungen;<br />
starke Abhängigkeit von Papierqualität<br />
weißes<br />
Licht<br />
Yellow<br />
Magenta<br />
Papier<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 225
Farbmodell HLS<br />
� anwendungsorientiert,<br />
zielgerichtet<br />
manipulierbar<br />
� Farbart Hue<br />
� Helligkeit Luminance<br />
� Sättigung Saturation<br />
H<br />
S L S<br />
L<br />
H<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
0.75<br />
0.5<br />
0.25<br />
Seite 226
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 227
Orange wirkt unterschiedlich hell/dunkel bzw. mehr/weniger gesättigt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 228
Physiologische Aspekte –<br />
Informationsverarbeitung durch das menschl.<br />
Auge<br />
� höhere Auflösung für Helligkeit als für Farbe<br />
� Kanten u. Formen werden besser anhand der Helligkeit erkannt<br />
(wird bei Videokompression ausgenutzt)<br />
� unterschiedliche Auflösung für verschiedene Farben<br />
� besonders schlecht: Blau<br />
� farbabhängige Helligkeitsempfindung<br />
�� grün wirkt heller, blau dunkler<br />
� kleine Flächen wirken stärker gesättigt als große<br />
� Farb- und Helligkeitsempfinden wird auch von der Umgebung<br />
beeinflusst, nicht nur vom Monitor!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 229
Psychologische Aspekte<br />
� im allgemeinen kulturspezifisch; bei uns:<br />
� weiß neutral<br />
� rot Anhalten, Gefahr, Fehler, Alarm, Hitze<br />
� orange Warnung, Achtung, Aufmerksamkeit<br />
� grün Losfahren, OK, Verfügbarkeit, Wachstum<br />
� blau Kälte, Ferne, Hintergrund<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 230
Farbkombinationen<br />
� Vordergrund- und Textfarben<br />
� Weiß, Schwarz, mittel- bis langwellige Farben (Rot, Gelb, Grün)<br />
� kein Blau<br />
� Hintergrundfarben<br />
� hell (Positivdarstellung), schwach gesättigt (Pastelltöne)<br />
� kurzwellige (Blau, Cyan) und unbunte Farben (helles Grau)<br />
� kein gesättigtes Rot oder Braun<br />
�� kritische Farbkombinationen<br />
� vermeiden: Rot/Grün, Gelb/Blau, Rot/Blau<br />
� Gelb/Weiß wird leicht verwechselt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 231
Heller oder dunkler Hintergrund ?<br />
� Dunkel auf Hell ? freundlich<br />
� Papiermetapher<br />
� Monitor-Flimmern unangenehm bei großen hellen Flächen<br />
� Hell auf Dunkel ? finster<br />
� Farben leuchten intensiver auf dunklem Untergrund<br />
� dunkler Hintergrund zur Hervorhebung von Bildern<br />
� weiß überstrahlt leicht, weil Iris weit geöffnet ist<br />
�� mittlere Hintergrundhelligkeit<br />
� angenehm für das Auge: entspricht der Umgebungshelligkeit<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 232
Farbschema / Farbklima<br />
� ±5 verschiedene Farben<br />
+ schwarz + weiß<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 233
Im Zweifelsfall<br />
� eher weniger Farbe als mehr<br />
� eher weniger Farbsättigung als mehr<br />
� Codierung und Unterscheidung eher<br />
mittels Layout und Form als mittels Farbe<br />
�� Farben visuell überprüfen, nicht "berechnen"<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 234
Farbcodierung<br />
� Farbe dient als "Skala" eines physikalischen Wertes<br />
� vgl. Landkarte, Wetterkarte<br />
� suggestive Zuordnung von Farbcode zu Bedeutung<br />
� unterschiedliche Farbarten wirken "ungeordnet"<br />
� besser: Abstufungen nur in Helligkeit und/oder Sättigung, nicht in<br />
Farbart (Hue)<br />
� Hervorhebung durch Intensivierung:<br />
"aktiv", "selektiert" � höhere Helligkeit oder Sättigung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 235
Schriftarten<br />
� mit Serifen Times<br />
� "Führungslinien" für das Auge<br />
� erfordern hohe Druck-Auflösung; am<br />
Bildschirm nur unvollkommen / unschön darstellbar<br />
� serifenlos Helvetica, Arial<br />
� schlechter lesbar; bei geringer Auflösung jedoch zu bevorzugen<br />
� Bildschirmschrift MS Sans Serif, Fixedsys<br />
�� serifenlos, auf Pixelraster optimiert<br />
(vorteilhaft für kleine Schrift)<br />
� nur in ausgewählten Größen verfügbar<br />
� Druckerschrift<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 236
Gut lesbare Bildschirm-Schrift<br />
� serifenlos für Bildschirm (Serifen nur für Druck)<br />
� Proportionalschrift, Groß-/Kleinschreibung<br />
Problem: niedrige Auflösung<br />
� nicht unterstrichen, nicht blinkend, keinesfalls kursiv<br />
� horizontal ausgerichtet, linksbündig, kein Blocksatz<br />
� begrenzte Spaltenbreite (vgl. Zeitungsspalten)<br />
�� Schrifthöhe mindestens 0.3° Sehwinkel<br />
� besser 0.5°: ca. 8 pt bei 17", 800x600, 50 cm Abstand<br />
� deutlicher Kontrast zum Hintergrund<br />
� Text- und Hintergrundfarbe beachten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 237
Beschriftung mittels Label<br />
� Label deutlich dem Steuerelement zuordnen<br />
� minimaler Abstand = 1 Zeichenbreite<br />
� aber kein Doppelpunkt zwischen Label und Steuerelement<br />
� Label-Text kurz, aussagekräftig, eindeutig, präzise, allgemein<br />
bekannt, informativ, aber keine Abkürzung<br />
� vorzugsweise nur ein Wort<br />
� Label-Text nicht breiter als 5° Sehwinkel (= 1 Fixation)<br />
� ca. 100 Pixel bei 17", 800x600, 50 cm Abstand<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 238
Ausrichtung von Beschriftungen<br />
� einzeilige Steuerelemente:<br />
Label links; horizontal zentriert<br />
� mehrzeilige Steuerelemente:<br />
Label links oberhalb<br />
einzeilig<br />
mehrzeilig<br />
� mehrere verschieden lange Labels:<br />
etwa gleich: linksbündig sehr unterschiedlich: rechtsbündig<br />
minimal<br />
mittel<br />
maximal<br />
Tabulator<br />
Makro<br />
Einblendezeit<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 239
Eingabe von Text<br />
� Kommandos<br />
� Auswahl aus Textliste<br />
� Freitexteingabe<br />
� generell: mit Enter abschließen<br />
� Kurzformen für Kommandos und Auswahlworte anbieten<br />
� Auto-Vervollständigen in Combo-Boxen<br />
�� mnemonisch günstiger als Tastaturkürzel optimal !<br />
� beliebige Groß-/Kleinschreibung zulassen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 240
Gestalten eines Eingabefensters<br />
Was ist hier<br />
schlecht ?<br />
Verbessern Sie den<br />
Entwurf !<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 241
Umsetzung der gestalterischen Anforderungen mit<br />
Java/Swing<br />
� Container<br />
� Dynamisches vs. Statisches Layout<br />
• Layout Manager<br />
� Dialogbausteine (Controls, Componenten)<br />
� (non-)modale Dialoge<br />
� Entwurfsmuster (MVC, ...)<br />
� Ereignisbehandlung/Eventhandling<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 242
Top Level Container<br />
� JFrame, JDialog, JApplet, JWindow<br />
� haben eine contentPane,<br />
die andere Panels oder<br />
Komponenten trägt<br />
� sind Wurzel eines<br />
Objektbaums<br />
�� können eine Menüleiste (JMenuBar) haben<br />
� wir arbeiten i.a. nur mit der contentPane und nutzen weitere<br />
Panels/Panes zur räumlichen Gliederung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 243
Fenster, Container, Dialoge: JFrame … (1/2)<br />
� eigene Hauptfenster-Klasse deklarieren<br />
� public class MainWindow extends JFrame {...}<br />
� Fensterobjekt erzeugen<br />
� MainWindow myFrame = <strong>new</strong> MainWindow();<br />
� Layout (im Konstruktor) neu berechnen<br />
� ohne Layout-Manager:<br />
myFrame.setSize(<strong>new</strong> Dimension (…));<br />
myFrame.validate();<br />
� mit Layout-Manager:<br />
myFrame.pack();<br />
� Fenster sichtbar machen<br />
myFrame.setVisible(true);<br />
Hauptfenster<br />
von Applikationen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 244
Fenster, Container, Dialoge: JFrame … (2/2)<br />
� Fenstertitel und –icon (z.B. im Konstruktor ) einsetzen:<br />
�� this.setTitle("Fenstername");<br />
� Image desktopIcon =<br />
Toolkit.getDefaultToolkit().getImage("C:\\..\\aIcon.gif");<br />
this.setIconImage(desktopIcon);<br />
� Fenster im Desktop zentrieren:<br />
� frame.setLocationRelativeTo(null); oder<br />
� Dimension screenSize =<br />
Toolkit.getDefaultToolkit().getScreenSize();<br />
Dimension frameSize = myFrame.getSize();<br />
if (frameSize.height > screenSize.height)<br />
{ frameSize.height = screenSize.height; }<br />
if (frameSize.width > screenSize.width)<br />
{ frameSize.width = screenSize.width; }<br />
frame.setLocation((screenSize.width - frameSize.width) / 2,<br />
(screenSize.height - frameSize.height) / 2);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 245
Modale und non-modale Dialoge<br />
� Ein Dialog ist modal, wenn er die ganze Aufmerksamkeit des<br />
Benutzer auf sich zieht. Die geschieht dadurch, dass die<br />
Interaktionen mit den anderen Teilen verhindert/blockiert werden.<br />
Die anderen Interaktionen werden erst wieder erlaubt wenn, der<br />
modale Dialog vollständig bearbeitet und abgeschlossen ist.<br />
� Ein non-modaler Dialog fügt sich in den Gesamtdialog ein und kann<br />
gleichberechtigt wie jeder andere benutzt werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 246
Dialoge<br />
� ein Dialog ist ein separates Fenster, das über dem Hauptfenster<br />
(oder einem anderen Dialog) schwebt/liegt<br />
� wird oft zur Ein-/Ausgabe von Parametergruppen verwendet<br />
� frei positionierbar, nicht bildschirmfüllend<br />
� wird von seinem Hauptfenster minimiert<br />
� modale Dialoge blockieren das Hauptfenster, solange sie aktiv sind<br />
� Moduslose/non-modale Dialoge erlauben die Aktivierung des<br />
Hauptfensters<br />
� Beispiel: Editieren während "Suchdialog" in Textverarbeitung<br />
� MessageBox ist einfache Form eines modalen Dialogs<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 247
JDialog<br />
� für beide Arten: modal und non-modal<br />
�� JDialog (Frame owner, boolean modal)<br />
� Als owner sowohl JDialog als auch JFrame möglich<br />
� show() macht den Dialog sichtbar<br />
� blockiert in modalen Dialogen<br />
� terminiert sofort in moduslosen Dialogen<br />
(� Wie greifen Sie auf Werte zu?!)<br />
� validate() oder pack() notwendig um Layout neu zu<br />
berechnen<br />
� hide()/dispose() macht den Dialog unsichtbar<br />
� hebt die Blockierung von show() in modalen Dialogen auf<br />
� zerstört nicht das Dialogobjekt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 248
JOptionPane: Standard-Dialoge<br />
� gängige modale Einfach-Dialoge<br />
� Aufruf durch verschiedene static Methoden von JOptionPane:<br />
showMessageDialog, showInputDialog, showConfirmDialog<br />
� diverse Icons zur Anreicherung per Konstante wählbar<br />
� Button-Kombinationen sind ebenfalls per Konstante wählbar<br />
� Auswahl des Benutzers wird Ergebnis der Methodenaufrufe<br />
� vergleichbar mit MessageBox unter Windows<br />
�� Bemerkung: etwas vergleichbares fehlt in AWT<br />
� weitestgehende Konfigurationsmöglichkeit<br />
mit Hilfe von showOptionDialog<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 249
Spezielle Dialoge<br />
� JFileChooser<br />
� zur Auswahl einer Datei (vollständiger Pfad)<br />
� Varianten "Öffnen" und "Speichern unter"<br />
� gewählter Pfad als Ergebnis von getSelectedFile()<br />
� OK oder Cancel als Ergebnis von showOpenDialog(...)<br />
� JColorChooser<br />
�� zur Auswahl einer Farbe<br />
� static Methode showDialog (parent, title, color) liefert als<br />
Ergebnis ein Color-Objekt<br />
� Color-Objekt ist null bei Cancel<br />
leider uneinheitlich!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 250
Räumliche Gliederung<br />
� Komponenten werden gruppiert und plaziert<br />
durch Zuordnung zu Panels und Panes<br />
� Panes haben spezifische Sonderfunktionen<br />
� komplexe Layouts sind möglich durch<br />
Schachtelung von Panels und Panes (� Objektbaum)<br />
� jedes Panel/Pane kann einen anderen Layout-Manager haben<br />
� keine spezielle Ereignisbehandlung nötig<br />
Panel<br />
Tafel, Platte,<br />
(vertieftes) Feld<br />
Pane<br />
(Fenster)Scheibe<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 251
Ein Beispiel zum<br />
Objektbaum<br />
...<br />
JPanel p1 = <strong>new</strong> JPanel ();<br />
JPanel p2 = <strong>new</strong> JPanel (<strong>new</strong> BorderLayout() );<br />
JButton b1 = <strong>new</strong> JButton ("Flip");<br />
JButton b2 = <strong>new</strong> JButton ("Flop");<br />
JButton b3 = <strong>new</strong> JButton ("Toggle");<br />
p1.setBackground(Color.cyan);<br />
p2.setBackground(Color.blue);<br />
p2.add (b1, BorderLayout.NORTH);<br />
p2.add (b2, BorderLayout.SOUTH);<br />
p1.add (p2);<br />
...<br />
p2.add (b3);<br />
contentPane.add (p1);<br />
...<br />
JButton<br />
JPanel<br />
JFrame<br />
JPanel<br />
JPanel<br />
JButton JButton<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 252
JPanel: einfache Fläche<br />
// ein Panel ist ein Container:<br />
JPanel p = getJContentPane();<br />
JButton jb;<br />
for (int i = 0; i < p.getComponentCount(); i++)<br />
{<br />
if ( p.getComponent(i) instanceof JButton )<br />
{<br />
jb = (JButton)p.getComponent(i);<br />
� Fläche, die andere Komponenten trägt<br />
// jb manipulieren<br />
�� bekanntes Beispiel: contentPane<br />
}// if<br />
� JPanel meinPanel =<br />
}// for<br />
<strong>new</strong> JPanel();<br />
...<br />
� Layout-Manager zuordnen oder weglassen<br />
� default ist FlowLayout<br />
� meinPanel.setLayout(<strong>new</strong> BorderLayout());// oder null<br />
� Komponenten zuordnen<br />
��<br />
meinPanel.add(aComponent);<br />
� Umrandung (Border) definieren<br />
� auch Freiflächen und Abstände sind als EmptyBorder realisierbar<br />
� Erstellung durch Eclipse komfortabel unterstützt �<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 253
Rand und Abstand mit Border<br />
� Diverse Klassen abgeleitet von AbstractBorder<br />
Interface<br />
� LineBorder, EtchedBorder, BevelBorder, EmptyBorder,<br />
MatteBorder, TitledBorder, CompoundBorder<br />
� Implementierung als<br />
� benanntes Objekt<br />
• EtchedBorder meinBorder = <strong>new</strong> EtchedBorder();<br />
meinPanel.setBorder(meinBorder);<br />
� anonymes Objekt<br />
• meinPanel.setBorder(<strong>new</strong> EtchedBorder());<br />
� gemeinsam verwendetes anonymes Objekt<br />
• meinPanel.setBorder(BorderFactory.createEtchedBorder());<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 254
1-aus-n Auswahl<br />
Anzeige und Interaktion mit dem Ticketzustand<br />
�� in einem modalen Dialog<br />
� Ergebnis wird vom Fensterobjekt (JDialog) erfragt<br />
� Entscheidung für eine Darstellungsart<br />
� ComboBox, Menue, RadioButtonGroup, … oder ganz anders (wie)!?<br />
� Entscheidungsgrundlage<br />
� Gewohnheit der Nutzer (vertraut mit best. Controls), Einbettung in<br />
Gesamtablauf, Anzahl Klicks, ...<br />
�Anzeige aller Alternativen, freie Auswahl, kein Platzproblem, ein Klick<br />
�Control Control mit Anwendungsobjekt(en) verbinden,<br />
� gegenseitigen Ausschluss sicherstellen<br />
� Interaktion mit entsprechenden Events realisieren<br />
� Wertänderungen könnten auch direkt am Objekt ausgeführt werden � wie?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 255
JRadioButton, ButtonGroup (1/3)<br />
JPanel radioButtonPanel;<br />
radioButtonPanel = <strong>new</strong> JPanel();<br />
radioButtonPanel.setBackground(<strong>new</strong> Color(250, 250, 0));<br />
Border border = <strong>new</strong> TitledBorder ("TicketStates");<br />
radioButtonPanel.setBorder(border);<br />
radioButtonPanel.setLayout(<strong>new</strong> GridLayout(0, 1));<br />
JRadioButton rb;<br />
int actionCommand = 0;<br />
…<br />
Separates Panel mit<br />
• Hintergrundfarbe,<br />
• Rahmen und<br />
• GridLayout<br />
erstellen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 256
JRadioButton, ButtonGroup (2/3)<br />
int actionCommend = 0;<br />
for (TicketState t : TicketState.values()) {<br />
rb = <strong>new</strong> JRadioButton(t.name());<br />
rb.addActionListener(this);<br />
rb.setActionCommand(Integer.toString(actionCommand));<br />
actionCommand++;<br />
rb.setOpaque(false);<br />
group.add(rb);<br />
if (t.equals(TicketState.neu_erfasst))<br />
rb.setSelected(true);<br />
radioButtonPanel.add(rb);<br />
}<br />
return radioButtonPanel;<br />
•Listener registrieren<br />
•Index mitgeben<br />
•Damit die Farbe des<br />
Panels sichtbar wird<br />
•In die Gruppe einfügen<br />
•Default setzen<br />
•Im Layout einfügen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 257
JRadioButton, ButtonGroup (3/3)<br />
...<br />
private TicketState selectedTicketState // Objektattribut<br />
...<br />
public void actionPerformed(ActionEvent arg0) {<br />
// so möglichst variabel<br />
String actionCommand = arg0.getActionCommand();<br />
selectedTicketState =<br />
TicketState.values()[Integer.valueOf(actionCommand)];<br />
}<br />
Eventhandling: letzte<br />
Zustandsänderung wird festgehalten<br />
bzw. könnte auch direkt im<br />
Ticketobjekt verändert werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 258
JScrollPane: verschiebbare Sicht<br />
� verschiebbare Sicht auf eine (größere) Komponente<br />
� JScrollPane zwischen Panel und Komponente schalten<br />
� textArea = <strong>new</strong> JTextArea(5, 30);<br />
JScrollPane scrollPane = <strong>new</strong> JScrollPane(textArea);<br />
contentPane.add(scrollPane);<br />
� JList, JTextComponent, JTree, JTable sind dafür vorbereitet<br />
� implementieren Interface Scrollable; damit wird die "Skalierung"<br />
der ScrollBars definiert:<br />
getScrollableBlockIncrement,<br />
getScrollableUnitIncrement,<br />
getPreferredScrollableViewportSize, ...<br />
� andere Klassen können dieses ebenfalls implementieren<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 259
JSplitPane: zweigeteilt<br />
� zwei Panes durch verschiebbare Trennlinie geteilt<br />
� Erzeugen<br />
� JSplitPane splitPane = <strong>new</strong> JSplitPane(<br />
JSplitPane.HORIZONTAL_SPLIT, pane1, pane2);<br />
� Verschiebung durch Mausklick aktivieren<br />
� splitPane.setOneTouchExpandable(true);<br />
� Trennlinie positionieren<br />
�� splitPane.setDividerLocation(150); // 150 Pixel<br />
splitPane.setDividerLocation(0.25); // 25%<br />
� Mindestgröße für den Inhalt festlegen<br />
� pane1.setMinimumSize(<strong>new</strong> Dimension(100, 50));<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 260
JTabbedPane: Karteikarten<br />
� organisiert mehrere Panes "hintereinander" und<br />
mittels Karteikartenreiter umschaltbar<br />
� sehr gut: Reiter in der 2. Reihe behalten ihre Position<br />
(wechseln nicht die Reihe wie unter Windows)<br />
� Erzeugen<br />
� JTabbedPane tabbedPane = <strong>new</strong> JTabbedPane();<br />
� Karteikarte einfügen und beschriften<br />
�� tabbedPane.addTab("Titel", icon, pane1, "Tooltip");<br />
� Karteikarte aktivieren<br />
� tabbedPane.setSelectedIndex(int)<br />
tabbedPane.setSelectedComponent(Component)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 261
eigentlich keine Pane, sondern<br />
ein Layout-Manager<br />
CardLayout: reiterlose Karteikarten<br />
� Anwendung ähnlich wie JTabbedPane, aber Umschaltung kann/muss selbst<br />
programmiert werden<br />
� Erzeugen<br />
� CardLayout cardLayout = <strong>new</strong> CardLayout();<br />
JPanel cardPanel = <strong>new</strong> JPanel();<br />
cardPanel.setLayout(cardLayout );<br />
� Karteikarte einfügen<br />
� cardPanel.add(pane1, "Text1");// Text muss eindeutig sein<br />
�� Karteikarte aktivieren<br />
� cardLayout.show(cardPanel, "Text1");// oder sequentiell:<br />
cardLayout.first(cardPanel);<br />
cardLayout.next(cardPanel);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 262
Dynamische und statische Layouts<br />
� statisches Layout: ���� Definition von Koordinaten<br />
� die Größe und Position der einzelnen Komponenten ist in einem<br />
absoluten Koordinatensystem (z.B. Pixel) festgelegt<br />
� Bildschirmmaske ist für eine bestimmte Gesamtgröße gemacht<br />
� unter Windows gewisse Anpassung über Bildschirmschriftgröße<br />
� dynamisches Layout: ���� Definition von Regeln<br />
� die Größe und Position der einzelnen Komponenten kann von der<br />
Größe bzw. Auflösung des Bildschirms und von der Fenstergröße<br />
abhängen<br />
� kann plattform- bzw. bildschirmunabhängig gemacht werden<br />
� aber: schwieriger zu entwickeln<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 263
Vorgehensweise <strong>beim</strong> Entwurf<br />
� Java unterstützt dynamische Layout: Layout-Managern<br />
� Eclipse setzt von vornherein einen solchen ein<br />
� wir bauen als Vorstufe zunächst statische Layouts<br />
� Vorteile:<br />
� man entwirft visuell und konzentriert sich auf die Oberfläche;<br />
Gestaltung wird nicht durch Realisierungsprobleme eingeengt<br />
�� man bekommt mit wenig Aufwand einen Prototypen und hat<br />
weniger Hemmungen, diesen mehrfach zu ändern<br />
� wenn der Entwurf schließlich steht, dann wird ein dynamisches<br />
Layout konstruiert<br />
Wir haben diesen<br />
bisher<br />
ausgeschaltet!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 264
Vorgehensweise mit und ohne Layout<br />
� bisher:<br />
Größe und Position von Komponenten in der Entwicklungsphase<br />
festgelegt<br />
� jetzt:<br />
Position (und/oder Größe) der Komponenten ändert sich zur Laufzeit<br />
� a) abhängig von der Fenstergröße<br />
� kann sich an der Grafikkartenauflösung<br />
orientieren<br />
zweckmäßiger Einsatz<br />
ist nicht trivial<br />
� b) abhängig von der Größe der Komponente<br />
� jede Komponente hat eine Wunschgröße (preferred size)<br />
� z.B. abhängig von der Schriftgröße<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 265
Wo macht es Sinn ?<br />
� abhängig von Fenstergröße:<br />
alle Komponenten mit Scrollbalken<br />
� z.B. JList, JTree, JTable; evtl. auch JTextArea<br />
� Scrollbalken können verschwinden<br />
� mehr Inhalt wird sichtbar<br />
� allenfalls abhängig von Schriftgröße:<br />
Buttons, Checkboxen, Labels, Ränder<br />
�� Größenverhältnis visueller Objekte<br />
ist wesentlich für den Gesamteindruck !<br />
(Schrift/Komponente, Komponente/Freifläche)<br />
sorgfältig überlegen,<br />
welche Komponenten<br />
dynamisch werden sollen<br />
sofern man<br />
die Schriftgröße<br />
überhaupt<br />
variabel gestaltet<br />
� Buttons abhängig von Fenstergröße belegen nur sinnlos Fläche<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 266
Parameter dynamischer Layouts<br />
� Fenstergröße<br />
� großes Fenster ermöglicht Darstellung von mehr Information<br />
und bessere Gestaltung mit Hilfe von Freiflächen<br />
� begrenzt durch Bildschirmgröße und -auflösung<br />
� Schriftgröße<br />
� idealerweise vom Benutzer wählbar entsprechend individueller<br />
Sehkraft (vgl. Browserschriftgröße und Windows Grafiktreiber)<br />
�� sollte bei hochauflösenden Bildschirmen vergrößert werden<br />
� Extremfall Touchscreen: dicker Finger statt spitzer Maus<br />
� Textlänge<br />
� abhängig von der Sprache<br />
“Speichern unter“<br />
“Save as“<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 267
Layout-Manager in Swing<br />
� Java unterstützt dynamisches Layout durch<br />
verschiedene Layout-Manager-Klassen<br />
� gibt es nicht unter Windows / MFC;<br />
könnte man sich aber selbst schreiben<br />
� weil einfach einsetzbar, werden sie in Java eher zu oft verwendet<br />
� ein Layout-Manager-Objekt wird einem Fenster / Panel / Pane<br />
zugeordnet und verwaltet dessen Komponenten<br />
�� Layout wird neu berechnet, wenn sich<br />
a) die Fenstergröße ändert oder<br />
b) die Wunschgröße (preferred size) einer Komponente ändert<br />
� Layout-Manager können geschachtelt werden<br />
� Freiflächen mittels leerem Rand oder unsichtbaren Komponenten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 268
Überblick<br />
� Nutzen Sie die Layout-Manager für das von Ihnen entwickelte User<br />
Interface im Praktikum!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 269
"Fließtext": FlowLayout<br />
� für einfache Reihe von Komponenten<br />
� Standard bei JPanel<br />
� Komponenten behalten eigene Größe (PreferredSize)<br />
� Panel zu schmal � Zeilenumbruch<br />
� Panel zu groß � Gruppe oben zentriert (oder links-<br />
/rechtsbündig)<br />
� wichtige Attribute:<br />
�� setAlignment: CENTER, LEFT, RIGHT<br />
� setHgap, setVgap: Lücke zwischen Komponenten<br />
• Hinweis: auch vor/über erster und hinter/unter letzter Komponente<br />
(wirkt wie Rand, allerdings nicht bei Zeilenumbruch)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 270
FlowLayout Programmfragment<br />
JPanel panel = <strong>new</strong> JPanel();<br />
FlowLayout fl = <strong>new</strong> FlowLayout();<br />
fl.setAlignment(FlowLayout.LEFT); // Ausrichtung<br />
fl.setHgap(9); // horizontale Lücke<br />
fl.setVgap(12); // vertikale Lücke<br />
panel.setLayout(fl);<br />
// oder gleich:<br />
panel.setLayout(<strong>new</strong> FlowLayout (FlowLayout.LEFT, 9, 12));<br />
// (Alignment, Hgap, Vgap)<br />
panel.add(jButton1); // usw.: Komponenten hinzufügen<br />
Window.pack(); // bewirkt Berechnung des Layouts<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 271
Zeile oder Spalte: BoxLayout<br />
� senkrechte oder waagrechte Reihe setAlignmentX<br />
� Ausrichtung jeder Komponente individuell wählbar<br />
setAlignmentX/Y (1.0=linksbündig ... 0.0=rechtsbündig)<br />
� Achtung: Default-Alignment ist unterschiedlich je nach Klasse !<br />
� leere Komponenten als Platzhalter für Freiflächen<br />
� RigidArea: Freifläche fester Größe (eine Dimension kann 0 sein)<br />
ohne: mit:<br />
�� Glue: Freifläche, die den "Rest" füllt<br />
ohne: mit:<br />
� Filler: Freifläche mit Minimum-, Preferred- und MaximumSize<br />
(ähnlich wie RigidArea, aber variabler)<br />
� Strut: wird nicht empfohlen; besser RigidArea verwenden<br />
setAlignmentX<br />
(0.5)<br />
Glue hält nicht<br />
zusammen, sondern<br />
drückt auseinander<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 272
BoxLayout Programmfragment<br />
JPanel panel = <strong>new</strong> JPanel();<br />
BoxLayout bl = <strong>new</strong> BoxLayout(panel, BoxLayout.Y_AXIS);<br />
panel.setLayout(bl); // oder gleich:<br />
panel.setLayout(<strong>new</strong> BoxLayout(panel, BoxLayout.X_AXIS));<br />
// (Container, Alignment)<br />
// Alignment der Komponente definieren (wichtig!):<br />
jButton1.setAlignmentX(Component.CENTER_ALIGNMENT);<br />
panel.add(jButton1); // Komponenten + Abstände hinzufügen<br />
panel.add(Box.createRigidArea(<strong>new</strong> Dimension(5,0)))<br />
panel.add(jButton2);<br />
panel.add(Box.createHorizontalGlue());<br />
panel.add(jButton3);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 273
Mitte maximal: BorderLayout<br />
� maximiert mittlere Kompo-<br />
nente fensterabhängig;<br />
reiht andere Komponenten am Rand<br />
� Layout-Strategie: CENTER maximal<br />
WEST / EAST möglichst schmal<br />
NORTH / SOUTH möglichst niedrig<br />
� häufig ist außer CENTER nur ein weiteres Feld belegt<br />
� Felder enthalten oft andere Layout-Manager<br />
� optional mit Hgap / Vgap: Lücken zwischen den Feldern<br />
� Standard-Layout von JFrame.contentPane<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 274
BorderLayout Programmfragment<br />
JPanel panel = <strong>new</strong> JPanel();<br />
BorderLayout bl = <strong>new</strong> BorderLayout(); // Hgap=Vgap=0<br />
panel.setLayout(bl); // oder gleich:<br />
panel.setLayout(<strong>new</strong> BorderLayout(9, 12)); // (Hgap, Vgap)<br />
panel.add(jButton1, BorderLayout.NORTH);<br />
panel.add(jButton2, BorderLayout.CENTER);<br />
panel.add(jButton3, BorderLayout.WEST);<br />
panel.add(jButton4, BorderLayout.SOUTH);<br />
panel.add(jButton5, BorderLayout.EAST);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 275
Gleiche Tabellenzellen: GridLayout<br />
� 2-dim. Raster für Komponenten<br />
� Komponenten werden auf<br />
Rastermaß gestreckt<br />
� Anzahl der Zeilen und/oder Anzahl der Spalten<br />
muss festgelegt werden<br />
� Konstruktorparameter oder setRows / setColumns<br />
� 0 definiert variable Anzahl<br />
(entweder für Zeilen oder für Spalten)<br />
� optional mit Hgap / Vgap: Lücken zwischen den Feldern<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 276
GridLayout Programmfragment<br />
JPanel panel = <strong>new</strong> JPanel();<br />
GridLayout gl = <strong>new</strong> GridLayout (3,2); // Hgap=Vgap=0<br />
panel.setLayout(gl); // oder gleich:<br />
panel.setLayout(<strong>new</strong> GridLayout (0, 2, 9, 12));<br />
// (Rows, Columns, Hgap, Vgap)<br />
0: variable Zeilenzahl<br />
panel.add(jButton1); // Komponenten zeilenweise ...<br />
panel.add(jButton2); // von links oben ...<br />
panel.add(jButton3); // ... nach rechts unten ...<br />
panel.add(jButton4); // hinzufügen<br />
panel.add(jButton5);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 277
Universell: GridBagLayout<br />
� sehr flexibles Raster-Layout<br />
� freie Adressierung der Rasterposition<br />
� Komponenten können gestreckt werden<br />
� Komp. können sich über mehrere Zeilen<br />
und/oder Spalten erstrecken<br />
� Andockkante in größerem Rasterfeld wählbar<br />
� rasterfeldbezogene Füllattribute<br />
�� x- und y-"Gewichte" bestimmen Verteilung von Restplatz<br />
� parameterloser Konstruktor, keine wichtigen Attribute<br />
0<br />
1<br />
2<br />
0 1 2<br />
� aber jede Komponente bekommt ein eigenes<br />
GridBagConstraints-Objekt (reine Datenstruktur) zugeordnet<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 278
GridBagLayout Programmfragment<br />
JPanel panel = <strong>new</strong> JPanel();<br />
GridBagLayout gbl = <strong>new</strong> GridBagLayout();<br />
panel.setLayout(gbl);<br />
GridBagConstraints gc = <strong>new</strong> GridBagConstraints();<br />
gc.fill = GridBagConstraints.HORIZONTAL;<br />
gc.gridx = 0; gc.gridy = 0;<br />
gbl.setConstraints(jButton1, gc);<br />
panel.add(jButton1);<br />
gc.weightx = 0.5;<br />
gc.gridx = 1; gc.gridy = 2;<br />
gbl.setConstraints(jButton2, gc);<br />
panel.add(jButton2);<br />
wird darin geklont (=kopiert) !<br />
! nicht dokumentiert; muß<br />
man im Quellcode nachlesen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 279
GridBagConstraints (1)<br />
� int gridx, int gridy<br />
werden immer einer<br />
Komponente zugeordnet<br />
� addressiert Spalte und Zeile für die Komponente<br />
(Zelle oben links angeben, wenn mehrere Zellen belegt werden)<br />
� int gridwidth, int gridheight (default 1)<br />
� Anzahl der von der Komponente belegten Spalten und Zeilen<br />
� Sonderfall REMAINDER belegt den Rest einer Spalte bzw. Zeile<br />
� fill = NONE (default), HORIZONTAL, VERTICAL, BOTH<br />
�� gibt an, ob und wie die Komponente gestreckt werden soll,<br />
um die ganze Zelle zu füllen<br />
� int ipadx, int ipady (default=0)<br />
� vergrößert die Minimalgröße der Komponente um 2*ipad<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 280
GridBagConstraints (2)<br />
� Insets insets (default <strong>new</strong> Insets (0,0,0,0))<br />
� definiert einen Mindestrand um die Komponente für T, L, B, R<br />
� anchor = CENTER (default), NORTH, NORTHEAST, EAST,<br />
SOUTHEAST, SOUTH, SOUTHWEST, WEST, NORTHWEST<br />
� definiert den Andockpunkt, falls Komponente kleiner als Zelle ist<br />
� double weightx, double weighty<br />
(default=0.0; Wertebereich 0.0 ... 1.0)<br />
�� prozentuale Verteilung von freiem Platz auf Spalten bzw. Zeilen<br />
(max. weightx innerhalb Spalte bzw. max. weighty innerhalb Zeile<br />
gilt bei Konflikt zwischen mehreren Zellen)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 281
Layout-Raster skizzieren<br />
Fenstergröße<br />
S<br />
Fehler<br />
Icongröße<br />
S F(Rest) S F(Rest)<br />
F(0.5)<br />
F<br />
Abstände/Ränder<br />
=f(Schriftgröße)<br />
max(I,S)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
F(0.5) Prof. Dr.-Ing. Hans-Peter Wiedling<br />
klicken Sie um die Skizze aufzubauen<br />
S<br />
F<br />
Schriftgröße<br />
+Textlänge<br />
S<br />
Seite 282
Beispiel mit geschachtelten Layouts<br />
WEST:<br />
entfällt<br />
kaum einzuhalten<br />
NORTH: 1 horizontale Box<br />
CENTER:<br />
GridLayout<br />
1 Zeile, 2 Spalten<br />
SOUTH: 3 horizontale Boxen in 1 vertikalen Box<br />
erfordert Feinjustage mittels preferredSize<br />
Grid- und Box- in BorderLayout<br />
offenes Problem:<br />
variable Breite<br />
EAST:<br />
vertikale<br />
Box<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 283
esser mit GridBagLayout<br />
alle Zellen in Zeilen 0,2,3,4: fill=HORIZONTAL<br />
gridwidth=2<br />
fill=BOTH<br />
horizontale Box; gridwidth=3<br />
gridwidth=2<br />
fill=BOTH<br />
Grid;<br />
fill=<br />
HOR.<br />
Spalte: 0 1 2 3 4<br />
größte preferredSize setzt sich durch<br />
Zeile<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
0<br />
1<br />
3<br />
4<br />
2<br />
Seite 284
Vorgehensweise <strong>beim</strong> Layout<br />
� notwendige Komponenten aus Use Cases ermitteln<br />
� Komponenten freihändig gruppieren und positionieren<br />
� Flucht- und Symmetrielinien identifizieren / definieren<br />
� Anzahl der Fluchtlinien klein halten<br />
� Fluchtlinien können gezeichnete Linien<br />
ersetzen: "gutes Design braucht keine (gezeichneten) Linien"<br />
� Rasterzeilen und -spalten bemaßen<br />
das Auge ist da<br />
sehr empfindlich !<br />
�� dyn. Layout: abhängig von Schrift-, Fenster- und Icongröße<br />
• bei mehrsprachigen Anwendungen auch abhängig von Textlänge<br />
• im allgemeinsten Fall sind alle Maße variabel!<br />
� (statisches Layout: absolute Zahlen in Pixel)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 285<br />
Analyse - Gestaltung - Konstruktion
Auswahl anwendungsfallorientiert<br />
� möglichst viel Platz für eine Komponente<br />
� BorderLayout: im CENTER<br />
� GridBagLayout: constraint.fill = GridBagConstraints.BOTH<br />
� ein paar Komponenten kompakt in einer Zeile oder Spalte<br />
in deren jeweils eigener Standardgröße:<br />
� auf JPanel mit FlowLayout (nur Zeile) oder BoxLayout<br />
� ein paar Komponenten gleicher Größe:<br />
�� GridLayout (evtl. nur 1 Zeile oder 1 Spalte)<br />
� komplexes Layout mit vielen Komponenten<br />
� GridBagLayout oder mehrere geschachtelte Panels<br />
� feste und variable Zellengrößen frei kombinierbar<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 286
Komponentengröße beeinflussen<br />
Achtung: Abhängigkeit von Schriftgröße wird durch explizites Setzen zerstört !<br />
� setMinimumSize, setPreferredSize, setMaximumSize<br />
� nach Änderung revalidate und repaint aufrufen<br />
Führungselement<br />
� gleiche Größe für mehrere Komponenten:<br />
jComp2.setPreferredSize (jComp1.getPreferredSize());<br />
� manche Layout-Manager respektieren manche Attribute:<br />
BorderLayout<br />
Minimum Preferred Maximum<br />
BoxLayout X X<br />
FlowLayout X<br />
GridBagLayout X<br />
GridLayout<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 287
Bemerkung zur Schriftgröße<br />
� Änderung der Schriftgröße<br />
erfordert neues Font-Objekt<br />
� Methode setFontSize fehlt<br />
� Zuordnung des Font-Objekts zu<br />
allen betroffenen Komponenten<br />
mit setFont<br />
oder<br />
�� setFont(null) für alle<br />
� dann erben sie vom Parent<br />
� nur contentPane bekommt<br />
gewünschtes Font-Objekt<br />
zugeordnet<br />
� Problem bei Optimierung der<br />
Größe von Buttons mittels<br />
setPreferredSize:<br />
� die Größe ist damit festgelegt<br />
und orientiert sich nicht mehr<br />
an Schriftgröße und Textinhalt<br />
�� Bug <strong>beim</strong> Erben des Font:<br />
� JComboBox bestimmt ihre<br />
preferredSize nicht neu<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 288
Screen zur Erfassung einer Problembeschreibung<br />
... für unser<br />
Ticketsystem<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 289
Screen zur Erfassung einer Problembeschreibung<br />
Ziel zunächst:<br />
•Aufbau des<br />
Screens<br />
identifizieren<br />
•Container<br />
benennen<br />
•LayoutManager<br />
auswählen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 290
Layout – Analyse: Rasterlinien einzeichnen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 291
Layout – Analyse: Bestandteile identifizieren<br />
Im WEST-<br />
Bereich:<br />
JPanel<br />
(clientPanel)<br />
mitGridLayout<br />
mit JLabel und<br />
JTextField<br />
ContentPane<br />
mit<br />
BoderLayout<br />
Im EAST-<br />
Bereich:<br />
JPanel<br />
(catPanel) mit<br />
GridLayout mit<br />
JLabel,<br />
5 CheckBoxen<br />
und 2 JButton<br />
Im CENTER-Bereich: JPanel (descrPanel)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
mit FlowLayout mit JLabel und<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
JScrollPane und TextArea<br />
Seite 292
Layout–Kodierung: Programmcode in Java<br />
// Panel:<br />
private JPanel jContentPane // steht zu Verfügung<br />
private JPanel clientPanel;<br />
private JPanel descrPanel;<br />
private JPanel catPanel;<br />
// CheckBox:<br />
private JCheckBox software = <strong>new</strong> JCheckBox("Software");<br />
private JCheckBox hardware= <strong>new</strong> JCheckBox("Hardware");<br />
private JCheckBox bedienung= <strong>new</strong> JCheckBox("Bedienung");<br />
private JCheckBox betriebssystem= <strong>new</strong><br />
JCheckBox("Betriebssystem");<br />
private JCheckBox netzwerk= <strong>new</strong> JCheckBox("Netzwerk");<br />
// text. Beschreibung<br />
private JTextArea description;;<br />
// Button:<br />
private JButton abbrechen = <strong>new</strong> JButton ("Abbruch");<br />
private JButton erfassen = <strong>new</strong> JButton ("Erfassen");<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 293
clientPanel und descrPanel erstellen<br />
clientPanel = <strong>new</strong> JPanel (<strong>new</strong> GridLayout (0,1));<br />
clientPanel.add(<strong>new</strong> JLabel ("Kunde"));<br />
clientPanel.add(<strong>new</strong> JTextField ("Kunde"));<br />
clientPanel.add(<strong>new</strong> JLabel ("Email"));<br />
clientPanel.add(<strong>new</strong> JTextField ("@kunde.com"));<br />
this.jContentPane.add(clientPanel, BorderLayout.WEST);<br />
descrPanel = <strong>new</strong> JPanel ();<br />
descrPanel.setLayout (<strong>new</strong><br />
BoxLayout(descrPanel,BoxLayout.Y_AXIS));<br />
JLabel describLbl = <strong>new</strong> JLabel ("Beschreibung");<br />
describLbl.setAlignmentX(Component.LEFT_ALIGNMENT);<br />
descrPanel.add(describLbl);<br />
description = <strong>new</strong> JTextArea (5, 8);<br />
descrPanel.add(<strong>new</strong> JScrollPane( description ));<br />
this.jContentPane.add(descrPanel, BorderLayout.CENTER);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 294
catPanel erstellen<br />
catPanel = <strong>new</strong> JPanel (<strong>new</strong> GridLayout (0,1));<br />
software.setSelected(true);<br />
catPanel.add(<strong>new</strong> JLabel("Kategorie(n)"));<br />
catPanel.add(software);<br />
catPanel.add(hardware);<br />
catPanel.add(bedienung);<br />
catPanel.add(betriebssystem);<br />
catPanel.add(netzwerk);<br />
catPanel.add(Box.createRigidArea(<strong>new</strong> Dimension(0, 10)));<br />
erfassen = <strong>new</strong> JButton ("Erfassen");<br />
catPanel.add(erfassen);<br />
abbrechen = <strong>new</strong> JButton ("Abbruch");<br />
catPanel.add(abbrechen);<br />
this.jContentPane.add(catPanel, BorderLayout.EAST);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 295
Aufgabe<br />
Skizzieren Sie das Layout-Raster und wählen Sie geeignete Layout-Manager !<br />
� Notepad Editor:Datei -> Seite einrichten � Windows Taschenrechner<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 296
Dialogbausteine<br />
� Ein Dialog besteht aus 2 Komponenten:<br />
� Layout/Präsentation<br />
Dialogelement und Dialogablauf (grafische Darstellung von Dialogelemente,<br />
Einbettung in das Gesamtsystem)<br />
� Logik/Semantik<br />
anwendungsabhängige Bearbeitung der Eingabe (Methode, die wir angeben,<br />
um ein von Benutzer initiiertes Ereignis zu bearbeiten)<br />
� Komplexe Dialoge werden anhand der Dialogbausteine wie in einem<br />
Baukasten zusammengesetzt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 297
Logische Eingabeklasse<br />
� Ein wichtiges Element grafischer Oberflächen zur Generalisierung eines<br />
Ansatzes ist die Modellierung einer Schnittstelle nach log. Gesichtspunkten<br />
(mit dem Ziel der Wiederverwendbarkeit, Entlastung der<br />
Applikationsentwicklung, Konsistenz, …)<br />
� Man kann dabei im Wesentlichen zwei Arten von Interaktionsgruppen<br />
unterscheiden:<br />
� Aufgaben zur diskreten Eingabe<br />
�� Aufgabe zur dynamischen Steuerung<br />
� Typischerweise kann man bei einer eingabeorientierten Ausgabe die<br />
folgenden elementaren Dialoge unterscheiden:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 298
Klassifikation diskrete Eingabe<br />
Logischer Dialog Kommentar Realisierungbeispiel<br />
�� 1-aus-n Auswahl diskrete sehr begrenzte JMenu, JComboBox,<br />
Auswahl (z.B. Kommando) JButtonGroup (JRadioButtons),<br />
JButton<br />
� n-aus-m Auswahl diskrete (sehr) begrenzte JToggleButton, JCheckbox,<br />
Auswahl (z.B. Parameter) JList, JButtons<br />
� Punkteingabe i. A. Punkt in Problem- JTextField,<br />
koordinaten Mausklick (anwendungsspez.)<br />
� Obj. Auswahl Identifikation JTextField,<br />
Mausklick (anwendungsspez.)<br />
� Text Name, Kommentar, ... JOptionPane, JTextField,<br />
Kommando JTextArea<br />
� Wert Skalar,<br />
(z.B. Temperatur) …<br />
JTextField, JSlider, JScrollbar<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 299
Klassifikation dynamische Steuerung (I)<br />
� Hier steuert der Benutzer das Verhalten von sichtbaren Elementen in einer<br />
dynamischen und direkt gekoppelten Art und Weise.<br />
� Charakteristisch für die dynamische Steuerung ist eine sehr enge Kopplung<br />
zwischen Eingabe und Ausgabe, um dem Benutzer eine kontinuierliches<br />
Feedback zu geben:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 300
Klassifikation dynamische Steuerung (II)<br />
Logischer Dialog Kommentar Realisierungsbeispiel<br />
�� Dehnen Objekt skalieren Gummiband, Rechteck<br />
� Zeichnen Freiformkurven Stift, Pinsel<br />
� Manipulieren Drehen, Verschieben, “Drag&Drop“<br />
Ablegen, Löschen,<br />
Papierkorb, Scrollbar<br />
� Formen Kurven Stützstellen, Kurve<br />
(z.B. Beziér, NURBS)<br />
Viele dieser Techniken werden weitgehend durch standardisierte<br />
Interaktionselemente realisiert. Sie spiegeln die Schnittstellenmetapher<br />
direkt-manipulativer Anwendungen etwa aus dem Bürobereich wider und<br />
werden in vielen unterschiedlichen Anwendungen eingesetzt.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 301
GUI- und Anwendungsobjekte<br />
Wichtig in allen Fällen ist die Rückkopplung aller benutzergesteuerten Aktionen:<br />
�� anwendungsunabhängig<br />
durch aktuelle Position des (Text-/Maus-)Cursors und<br />
� anwendungsabhängig<br />
durch Zugriff auf die Modelldaten<br />
� Einerseits wird die konsequente Trennung zwischen Applikation und grafischer<br />
Oberfläche angestrebt<br />
�� Andererseits muss die Kontrolle zwischen Dialogteilen und<br />
Anwendungsprogrammteilen gegeben sein<br />
� Neben der Übersicht über die Dialogbausteine werden wir sowohl die Kopplung<br />
zwischen Anwendung und GO als auch die Ereignisbehandlung betrachten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 302
Bausteine grafischer Bedienoberflächen<br />
� Begriffe uneinheitlich<br />
�� Windows: Control/Steuerelement<br />
� Java: Component<br />
� Motif: Widget<br />
Window Gadget:<br />
Gadget: Ding(s), Teilchen, Vorrichtung, Dingsbums<br />
� Widget: Fensterobjekt<br />
� WIMP-System := { Window, Icon, Menu, Pointing Device }<br />
� visuelle Klassen<br />
�� Objekte aktualisieren/zeichnen sich selbst auf den Bildschirm<br />
� Erscheinungsbild und Verhalten über Attribute einstellbar<br />
� Ereignisbehandlung<br />
• teilweise im Zusammenspiel mit übergeordnetem Fenster<br />
� große Auswahl in Bibliotheken, Eigenkreation möglich<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 303
Swing Components<br />
Schaltflächen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Textfelder Auswahl 1 aus n<br />
Seite 304
Klassenhierarchie<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 305
Schaltflächen: Charakterisierung<br />
� Buttons dienen dem<br />
Auslösen einer Aktion<br />
� meist beschriftet,<br />
manchmal mit Bild<br />
� können zu Buttonleisten<br />
aneinandergereiht werden<br />
� Gruppen von RadioButtons<br />
� Toolbars<br />
�� können inaktiv (disabled) sein<br />
� haben Boole'schen Zustand<br />
� temporär (d.h. nur Feedback) bei JButton<br />
AbstractButton<br />
JButton JToggleButton<br />
Aktion<br />
JCheckBox JRadioButton<br />
� permanent bei den anderen (durch Gruppierung auch 1-aus-n)<br />
Zustand<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 306
JButton löst nur Aktion aus<br />
� Schaltfläche mit Icon und/oder Text<br />
high level event<br />
� Ereignisse: actionPerformed(ActionEvent) // <strong>beim</strong> Anklicken<br />
� I/O: keine<br />
� Methoden:<br />
� setEnabled(boolean);<br />
� setVisible(boolean);<br />
�� setActionCommand(String);<br />
// wird Attribut von ActionEvent<br />
� getRootPane().setDefaultButton(JButtonX);<br />
// übergeordnete Pane: JButtonX erhält Event<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 307
ImageIcon: statische Bilder<br />
auch für großes Hintergrundbild<br />
� Buttons, Labels, Listen etc. können Icons darstellen<br />
� Bilddateiformat GIF oder JPEG<br />
� am einfachsten mit Bildbearbeitungsprogramm erstellen<br />
und in Datei ablegen<br />
� GIF auch mit transparentem Hintergrund ("freigestellt")<br />
ImageIcon Bild = <strong>new</strong> ImageIcon("Verzeichnis/Bild.gif");<br />
JLabel Label = <strong>new</strong> JLabel();<br />
Label.setIcon(Bild);<br />
nicht nur in Buttons!<br />
ImageIcon Bilder[] = { <strong>new</strong> ImageIcon("Verzeichnis/Bild0.gif"),<br />
<strong>new</strong> ImageIcon("Verzeichnis/Bild1.gif")};<br />
JComboBox ComboBox = <strong>new</strong> JComboBox(Bilder);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 308
Buttons und Bilder: Icons<br />
JButton jButton1 = <strong>new</strong> JButton();<br />
JButton jButton2 = <strong>new</strong> JButton();<br />
...<br />
ImageIcon ii = <strong>new</strong> ImageIcon ("contact.gif");<br />
jButton1.setPreferredSize(<br />
<strong>new</strong> Dimension(ii.getIconWidth(), ii.getIconHeight() ));<br />
jButton1.setIcon (ii);<br />
...<br />
jButton2.setText("Kontakt");<br />
contentPane.add (jButton1, ...);<br />
contentPane.add (jButton2, ...)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 309
JToggleButton: Zustand + Aktion<br />
� wie JButton, aber mit Zustandsanzeige "gedrückt"<br />
� Ereignisse: actionPerformed(ActionEvent) // <strong>beim</strong> Anklicken<br />
itemStateChanged(ItemEvent)// bei Zustandswechsel<br />
� I/O: isSelected() // boolean<br />
ItemEvent.getStateChange() // SELECTED / DESELECTED<br />
� Methoden:<br />
� setSelected(boolean);<br />
� setEnabled(boolean);<br />
� setVisible(boolean);<br />
� setActionCommand(String); //wird Attribut von ActionEvent<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 310
JCheckBox: Wahrheitswert<br />
� wie JToggleButton, aber mit Zustandsanzeige "Häkchen"<br />
� Ereignisse: actionPerformed(ActionEvent) // <strong>beim</strong> Anklicken<br />
itemStateChanged(ItemEvent) // bei Zustandswechsel<br />
� I/O: isSelected() // boolean<br />
ItemEvent.getStateChange() // SELECTED / DESELECTED<br />
� Methoden:<br />
� setSelected(boolean);<br />
� setEnabled(boolean);<br />
� setVisible(boolean);<br />
� setActionCommand(String);// wird Attribut von ActionEvent<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 311
JRadioButton<br />
� wie JCheckBox, tritt aber typischerweise in Gruppen auf<br />
�� Gruppe mit gegenseitiger Auslösung:<br />
ButtonGroup grp = <strong>new</strong> ButtonGroup();<br />
grp.add(jRadioButton1);<br />
grp.add(jRadioButton2);<br />
ButtonModel bm = grp.getSelection();<br />
� Ereignisse: actionPerformed(ActionEvent) // <strong>beim</strong> Anklicken<br />
� Merkmal: ActionEvent.getActionCommand() // String<br />
� Methoden bei JRadioButton:<br />
�� setActionCommand(String); // wird Attribut von ActionEvent<br />
� setSelected(boolean);<br />
� setMnemonic(KeyEvent.VK_B); // virt. Key Code (hier für „B“)<br />
� setSelected(true);<br />
� etc.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 312
JMenuBar, JMenu: Hauptmenü<br />
� Platzsparende Form der Gruppierung mehrerer Buttons<br />
� normale Schaltflächen, aber auch Checkboxen und Radiobuttons<br />
� vorzugsweise für "globale" Funktionen<br />
� ermöglicht hierarchische Gliederung durch Kaskadierung<br />
• durch Überstreichen gut geeignet zum Erforschen einer unbekannten<br />
Anwendung<br />
� u. U. umständlich zu bedienen, besonders bei Kaskadierung<br />
�� am oberen Rand von JFrame, JDialog, JApplet<br />
JMenuBar meinMenu = <strong>new</strong> JMenuBar();<br />
this.setJMenuBar(meinMenu);<br />
� Ereignisbehandlung über ActionListener der MenuItems wie bei Buttons<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 313
Aufbau eines Menüs<br />
� Objekte erzeugen<br />
JMenu jMenu2 = <strong>new</strong> JMenu();<br />
JMenuItem jMenuItem21 = <strong>new</strong> JMenuItem();<br />
in Eclipse durch eigene Variante<br />
des Visual Editors unterstützt<br />
� Attribute setzen // weitere siehe Buttons<br />
jMenuItem21.setText ("Ausschneiden");<br />
jMenuItem21.setEnabled (false);<br />
� Objekte verknüpfen<br />
jMenuBar1.add (jMenu2);<br />
jMenu2.add (jMenuItem21);<br />
jMenuBar1.add (Box.createHorizontalGlue());//nächstes rechts<br />
jMenu2.addSeparator (); // Trennlinie<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 314
JPopupMenu: Kontextmenü<br />
� verborgenes Menü<br />
� belegt keine Bildschirmfläche, aber Benutzer muß suchen!<br />
� typischerweise für objektbezogene Funktionen<br />
� verschiedene Objekttypen haben verschiedene Kontextmenüs<br />
� Menüaufbau wie <strong>beim</strong> Hauptmenü:<br />
JPopupMenu jPopupMenu1 = <strong>new</strong> JPopupMenu();<br />
JMenuItem jMenuItemP1 = <strong>new</strong> JMenuItem();<br />
jMenuItemP1.setText ("Ausschneiden");<br />
jPopupMenu1.add (jMenuItemP1);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 315
Kontextmenü-Ereignisbehandlung<br />
� Aufruf aus MouseListener des<br />
sensitiven Objekts<br />
void mouseReleased(MouseEvent e)<br />
{<br />
}<br />
unter Windows und Motif<br />
mit rechtem Mausklick;<br />
für andere OS zusätzlich<br />
mousePressed<br />
if (e.isPopupTrigger())<br />
jPopupMenu1.show(e.getComponent(), e.getX(), e.getY());<br />
� Zugriff auf zugehöriges Objekt und MenuItem<br />
void actionPerformed(ActionEvent e) {<br />
JMenuItem aktItem = (JMenuItem)e.getSource();<br />
JPopupMenu aktPopup = (JPopupMenu)aktItem.getParent();<br />
JObject geklicktesObjekt = aktPopup.getInvoker();<br />
// irgendetwas wird damit gemacht ...<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 316
Toolbars<br />
� Menüs werden häufig ergänzt durch Toolbars<br />
� schnellerer Zugriff für Fortgeschrittene<br />
� der Toolbar enthält eine häufig verwendete Teilmenge der Menü-<br />
Funktionen<br />
� als Gruppe von Buttons, meist mit Icons gekennzeichnet<br />
� kann vom Rand des Fensters "abgerissen" werden (hoch/quer)<br />
� oft vom Benutzer selbst konfigurierbar<br />
�� Icons sind fast nie selbsterklärend: sie müssen erlernt werden!<br />
� eine gute Hilfe dazu sind Tooltips (d.h. Texte, die nur erscheinen,<br />
wenn die Maus auf dem Button verweilt)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 317
JToolBar<br />
� Objekte erzeugen<br />
JToolBar jToolBar1 = <strong>new</strong> JToolBar();<br />
JButton jButton1 = <strong>new</strong> JButton();<br />
� Attribute setzen<br />
jButton1.setIcon (<strong>new</strong> ImageIcon("Icons/img_cd.gif"));<br />
jButton1.setToolTipText ("CD abspielen");<br />
� Objekte verknüpfen<br />
(die contentPane muß ein BorderLayout haben)<br />
contentPane.setLayout(<strong>new</strong> BorderLayout());// i.d.R. default<br />
contentPane.add(jToolBar1, BorderLayout.NORTH);<br />
jToolBar1.add (jButton1, null);<br />
jToolBar1.addSeparator (); // Abstand einfügen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 318
Textfelder: Charakterisierung<br />
� Textfelder dienen der Ein-<br />
und Ausgabe von Text<br />
� sie integrieren einfache oder<br />
komplexe Editorfunktionen<br />
� Cursor<br />
� Selektion<br />
JTextComponent<br />
JTextfield JTextArea<br />
JEditorPane<br />
� Kopieren, Einfügen<br />
JPasswordField JTextPane<br />
� mehrzeilige Textfelder<br />
können Scrollen, wenn die<br />
einzeilig mehrzeilig Editor für<br />
Fläche nicht ausreicht<br />
Text, HTML<br />
� können inaktiv (disabled) sein behandeln wir nicht<br />
und RTF mit<br />
Formatierung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 319
JTextField: einzeilige I/O + Aktion<br />
� für Ein- oder Ausgabe von kurzen Texten oder Zahlenwerten, oft mit<br />
anschließender Aktion<br />
� Ereignis: actionPerformed(ActionEvent) // bei Return<br />
� Methoden:<br />
� getText(), setText(String) // Zugriff auf gesamten Inhalt<br />
� select(int, int), selectAll() // markiert (selektiert) Text<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 320
JTextArea: mehrzeilige I/O<br />
� für Ein- oder Ausgabe von mehrzeiligen Texten<br />
beliebiger, aber<br />
einheitlicher Font<br />
� kann scrollen, wenn innerhalb einer JScrollPane plaziert:<br />
contentPane.add(jScrollPane, null);<br />
jScrollPane.getViewport().add(jTextArea, null);<br />
� Ereignis: actionPerformed(ActionEvent) // bei Return<br />
� Methoden:<br />
�� getText(), setText(String); // Zugriff auf gesamten Inhalt<br />
� append(String); // hängt Text am Ende an<br />
� insert(String, int); // fügt Text an Position ein<br />
� replaceRange(String, int, int); // ersetzt einen Textbereich<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 321
Wertebereichsüberprüfung<br />
� "action validated"<br />
� Überprüfung des eingegebenen Werts, nachdem "Return"<br />
gedrückt wurde<br />
• Zwischenzustände bei der Eingabe spielen keine Rolle<br />
• bequem zu Editieren<br />
� im actionPerformed-Handler vor der Weiterverarbeitung<br />
- So machen Sie es im Rahmen des Praktikums! -<br />
� Weiter Möglichkeiten werden wir im Rahmen der<br />
Ereignisbehandlung betrachten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 322
Auswahllisten: JComboBox, JList<br />
� Lineare, ungegliederte Liste<br />
� oft besser als Textfeld mit Gültigkeitsüberprüfung<br />
� Einfachauswahl oder Mehrfachauswahl<br />
� Vorteile gegenüber Gruppe aus Radiobuttons:<br />
� große Zahl von Listenelementen ist möglich<br />
ABER: Überschaubarkeit und Suchaufwand für den Benutzer sind<br />
zu bedenken<br />
�� Listenelemente können zur Laufzeit geändert bzw.<br />
datenabhängig geladen werden<br />
� JComboBox als platzsparende Variante<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 323
JList: sichtbare Liste<br />
� Einfach- oder Mehrfachauswahl<br />
� Strings oder Icons als Elemente<br />
(� ListCellRenderer für anwendungsspezifische Darstellung)<br />
� Listenelemente aus Object[] oder DefaultListModel<br />
• Konstantenliste am besten über String Werte[]={...};<br />
� kann scrollen, wenn innerhalb einer JScrollPane plaziert<br />
� Ereignis:<br />
(dynamisch)<br />
�� boolean valueChanged(ListSelectionEvent)// Auswahländerung<br />
� I/O: int, Object oder Array // Index oder ausgewähltes Objekt<br />
� Methoden:<br />
String<br />
� boolean getValueIsAdjusting()// wird Auswahl noch geändert?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 324
JList: Auswahlmodus und Selektion<br />
� Auswahl des Auswahlmodus<br />
jL.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);<br />
� SINGLE_SELECTION<br />
� int getSelectedIndex()<br />
� Object getSelectedValue()<br />
� SINGLE_INTERVAL_SELECTION<br />
� int getMinSelectionIndex()<br />
� int getMaxSelectionIndex()<br />
� MULTIPLE_INTERVAL_SELECTION<br />
� int[] getSelectedIndices()<br />
� Object[] getSelectedValues()<br />
Auswahl mit Festhalten<br />
der Umschalt-Taste<br />
Auswahl mit Festhalten<br />
der Strg-Taste<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 325
JComboBox: ausklappbare Liste<br />
� nicht editierbar: Auswahl 1-aus-n, auch Icons statt Text oder<br />
� editierbar: wie Textfeld mit Vorgaben<br />
� ComboBox.setEditable(true); // false ist Standard<br />
� statische oder dynamische Liste wie bei JList<br />
� Ereignis: actionPerformed(ActionEvent) // Auswahl oder Return<br />
� I/O: int oder Object (� String, ImageIcon oder ... )<br />
� Methoden:<br />
�� setSelectedIndex(int), int getSelectedIndex() // Index<br />
� ComboBox.getSelectedItem().toString() // Text<br />
� (ImageIcon)(ComboBox.getSelectedItem()) // Bild<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 326
Dynamische Listen (I)<br />
� Änderung der Listenelemente zur Laufzeit<br />
erfordert Objekt der Klasse DefaultListModel<br />
fast identisch für<br />
JList und JComboBox<br />
� dieses enthält die Daten und informiert JList bzw. JComboBox<br />
über Änderungen<br />
DefaultListModel Daten = <strong>new</strong> DefaultListModel();<br />
JList Listbox = <strong>new</strong> JList(Daten);<br />
JScrollPane ScrollPane = <strong>new</strong> JScrollPane();<br />
ScrollPane.getViewport().add(Listbox, null);<br />
contentPane.add(ScrollPane, null);<br />
Daten.addElement("neuer Eintrag");<br />
bzw. DefaultComboBoxModel<br />
Daten.removeElementAt(0); // oder removeElement(Object)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 327
Dynamische Listen (II)<br />
1.: Registrieren<br />
DefaultListModel List3 = <strong>new</strong><br />
DefaultListModel();<br />
JList jList3 = <strong>new</strong><br />
JList(List3);<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 328
Dynamische Listen (III)<br />
2.: Neues Element zur<br />
Liste hinzufügen<br />
//(z.B. in der Ereignisbehandlung eines Textfeldes):<br />
List3.addElement(jTextField1.getText());<br />
// das neue (letzte) Element selektieren:<br />
jList3.setSelectedIndex(List3.size()-1);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 329
Dynamische Listen - Prinzip<br />
View<br />
JList Objekt<br />
Registrierung<br />
( <strong>new</strong> JList(...) )<br />
...<br />
Benachrichtigung<br />
( addElement ... )<br />
Model<br />
DefaultListModel Objekt<br />
„2“<br />
„Beispiel“<br />
„Dienstag<br />
“<br />
...<br />
Durch Model- und View- Objekte<br />
wird die Applikation weitgehend<br />
entlastet!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 330
JComboBox<br />
private JComboBox comboSelect = <strong>new</strong> JComboBox( );<br />
...<br />
comboPanel.setBackground(<strong>new</strong> Color(250, 250, 0));<br />
• Objekte werden der<br />
for (TicketState t : TicketState.values())<br />
ComboBox per<br />
addItem hinzugefügt<br />
comboSelect.addItem(t);<br />
oder mit<br />
comboPanel.add(comboSelect);<br />
• removeItemAt (i)<br />
entfernt<br />
comboSelect.addActionListener(<strong>new</strong> • ActionListener wird<br />
java.awt.event.ActionListener() { registriert<br />
public void actionPerformed(ActionEvent e) {<br />
comboBox_actionPerformed(e);<br />
}<br />
});<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 331
JComboBox mit DefaultComboBoxModel<br />
private DefaultComboBoxModel daten = <strong>new</strong> DefaultComboBoxModel();<br />
private JComboBox comboSelect = <strong>new</strong> JComboBox(daten);<br />
...<br />
comboPanel.setBackground (<strong>new</strong> Color(250, 250, 0));<br />
for (TicketState t : TicketState.values())<br />
daten.addElement(t);<br />
comboPanel.add(comboSelect);<br />
comboSelect.addActionListener( <strong>new</strong><br />
java.awt.event.ActionListener() {<br />
public void actionPerformed(ActionEvent e) {<br />
comboBox_actionPerformed(e);<br />
}<br />
});<br />
• Objekte werden einer<br />
Modelklasseninstanz<br />
per addElement<br />
zugeordnet<br />
(Vorteil:<br />
Daten sind veränderbar)<br />
• ActionListener wird<br />
registriert<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 332
JList mit DefaultListModel<br />
DefaultListModel daten = <strong>new</strong> DefaultListModel();<br />
JList listSelect = <strong>new</strong> JList(daten);<br />
listPanel.setBackground(<strong>new</strong> Color(250, 250, 0));<br />
for (TicketState t : TicketState.values()) daten.addElement(t);<br />
listPanel.add(listSelect);<br />
listSelect.addListSelectionListener(<strong>new</strong> ListSelectionListener() {<br />
public void valueChanged(ListSelectionEvent evt) {<br />
// When the user release the mouse button and completes the<br />
// selection getValueIsAdjusting() becomes false<br />
if (!evt.getValueIsAdjusting()) {<br />
JList list = (JList) evt.getSource();<br />
Object[] selected = list.getSelectedValues();<br />
// Iterate all selected items<br />
for (int i = 0; i < selected.length; i++) {<br />
Object sel = selected[i];<br />
System.out.println(sel);<br />
}// for<br />
}// if<br />
}// valueChanged<br />
});<br />
• Objekte werden einer<br />
Modelklasseninstanz<br />
per addElement<br />
zugeordnet (Vorteil:<br />
Daten sind veränderbar)<br />
• ListSelectionListener<br />
wird registriert<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 333
Interface ListCellRenderer:<br />
� … und für das Darstellen gibt es auch Interfaces:<br />
Das Interface ListCellRenderer besitzt nur die folgende Methode:<br />
� public Component getListCellRendererComponent<br />
(<br />
JList list, Componente/Liste<br />
Object value, darzustellendes Objekt aus dem Model;<br />
entspricht: list.getModel().getElementAt(index)<br />
int index, Position in der Liste<br />
boolean isSelected, Element ausgewählt<br />
boolean cellHasFocus Element hat Focus<br />
)<br />
� Der Rückgabewert ist eine Componente (JLabel), die dargestellt wird.<br />
� Wird mit der Methode list.setCellRenderer(<strong>new</strong> MyRenderer());<br />
JList-Instanz gesetzt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 334
JSlider: diskrete Werte mit Einrasten<br />
� nur grobe Einstellmöglichkeit per Maus<br />
� wahlweise mit "Einrasten" bei Ticks<br />
� spezielle Beschriftung mittels Hashtable (Assoziativtabelle,<br />
Schlüssel/Wert-Paare)<br />
� Ereignis: stateChanged(ChangeEvent)<br />
� I/O: void setValue(int); int getValue()<br />
�� Eigenschaften:<br />
setMinimum(-20); setMaximum(80);<br />
setMinorTickSpacing(5); setMajorTickSpacing(20);<br />
setPaintLabels(true); setPaintTicks(true);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 335
JProgressBar: reine Anzeige<br />
� zur Anzeige länger dauernder Abläufe<br />
� beruhigt den Benutzer<br />
� Alternative: Klasse ProgressMonitor macht Dialog auf<br />
� Ereignis: keines (darstellungsorientiert)<br />
� Output: void setValue(int)<br />
� Eigenschaften:<br />
setMinimum(-20); setMaximum(80);<br />
setOrientation(JProgressBar.VERTICAL);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 336
JScrollBar: meist für Fenster<br />
� grobe Einstellmöglichkeit per Maus<br />
� Feineinstellung mit<br />
� Unit Increment (Klicken auf Buttons) und<br />
� Block Increment (Klicken auf Leiste)<br />
� Ereignis: adjustmentValueChanged(AdjustmentEvent)<br />
� I/O: void setValue(int); int getValue()<br />
�� Eigenschaften:<br />
setMaximum(90); setMinimum(-20);<br />
setBlockIncrement(20); setUnitIncrement(2);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 337
Architektur: Model-View-Control<br />
� Data Model:<br />
zugrunde liegende Anwendungsfunktionen und -datenstrukturen<br />
„WAS wird angezeigt“<br />
� View:<br />
Präsentation der Daten – GUI Componente<br />
„WIE wird etwas angezeigt“<br />
� Control:<br />
Reaktion (Prüfung und Weiterleitung) auf Eingaben oder Modelländerungen<br />
� Das Ziel ist, jede Komponente getrennt zu entwickeln, testen und<br />
u.U. auch im Gesamtsystem auszutauschen (lose Kopplung der Objekte)<br />
� Manchmal findet ein Observer-Pattern (oder das Publisher-Subscriber-<br />
Framework) Anwendung: Beim Start meldet sich Observer <strong>beim</strong><br />
beobachtenden Objekt an; beobachtenden Objekt informiert Beobachter.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 338
MVC – Model View Control<br />
Model/Document<br />
MyModel/<br />
MyDocument<br />
Applikation<br />
Object<br />
View Control<br />
MyView MyControl<br />
GO Objekte<br />
Ereignisbehandlung<br />
(Callbacks)<br />
Klassenhierarchie<br />
Anwendung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 339
Arbeitsweise von MVC<br />
(1)<br />
(2)<br />
View<br />
Control<br />
Model<br />
(3)<br />
(4)<br />
(1) View empfängt ein Dialogereignis vom Benutzer und ruft<br />
eine entsprechende Funktion von Control zur Umsetzung<br />
des Ereignisses auf.<br />
(2) Control manipuliert das Model entsprechend der<br />
Operation mit passenden Funktionen, die das Model<br />
anbietet.<br />
(3) Control löst Änderungen in der Darstellung von<br />
View aus, die sich als Folge der abgewickelten<br />
Operation ergeben haben.<br />
(4) View holt sich nach Bedarf weitere Daten von Model,<br />
um sie zu präsentieren.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 340
Umsetzung: Model-View-Control<br />
� View (als Buttons, Checkboxen, …) und<br />
Control (als Listener) sind in den Komponenten festgelegt<br />
� Konsequenz für die Realisierung:<br />
� Anwendungsfunktionalität und Graphische Oberfläche sind getrennt!<br />
� Anwendungsfunktionen sind nicht unmittelbar als Code in den Methoden<br />
zur Ereignisbehandlung eingebaut und<br />
� die Anwendungsfunktionen können vollständig separat in eigenen<br />
Klassen formuliert werden; Zugriff erfolgt über definierte Schnittstellen<br />
�� Vorschlag: Modell als Interface vereinbaren<br />
Modell oder View kann variiert werden!<br />
� Es bieten sich Default-Klassen (Container) für die Anwendung an (z.B.<br />
ArrayList, …)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 341
Beispiel: JTable<br />
� Verwenden Sie JTable oder JTree in<br />
Ihrem Programmcode im Praktikum!<br />
Statische<br />
Tabelle<br />
Dynamische<br />
Tabelle<br />
(sollte Ihr<br />
Favorit sein)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 342
Model-View-Control Architektur<br />
� konsequente Trennung zwischen<br />
Datenhaltung und Sicht auf die Daten<br />
� z.B. Datenhaltung: ArrayList von Arrays<br />
� z.B. Sicht: 2-dim. Tabelle mit Spaltenüberschriften<br />
� aufwendiger zu handhaben, aber flexibler<br />
� Standard-Datenmodell für einfache Fälle<br />
� View-Klasse erwartet von der Model-Klasse,<br />
dass sie bestimmte Methoden implementieren/bereitstellen<br />
ArrayList<br />
Arrays<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 343
DynamischeTabelle<br />
extends AbstractTableModel (I)<br />
class DynamischeTabelle extends AbstractTableModel<br />
{<br />
final int AnzahlSpalten; // feste Breite<br />
ArrayList tabelle = <strong>new</strong> ArrayList(); // Menge mit Anwendungsobjekten<br />
public DynamischeTabelle (int AnzahlSpalten, ArrayList tabelle ) {<br />
}<br />
this.AnzahlSpalten = AnzahlSpalten;<br />
this.tablle = tabelle;<br />
public Class getColumnClass (int columnIndex) {<br />
}<br />
try { // Spalte 5 wird als Boolean interpretiert:<br />
}<br />
if (columnIndex==4) return Class.forName("java.lang.Boolean");<br />
else return Class.forName("java.lang.Object");<br />
catch (ClassNotFoundException ce) {<br />
}<br />
System.out.println(ce.getMessage()); return null;<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 344
DynamischeTabelle<br />
extends AbstractTableModel(II)<br />
public boolean isCellEditable (int rowIndex, int columnIndex)<br />
{<br />
// nur Spalte 5 soll editierbar sein:<br />
return (columnIndex == 4);<br />
}<br />
public int getRowCount ()<br />
{<br />
return tabelle.size();<br />
}<br />
public int getColumnCount ()<br />
{<br />
return anzahlSpalten;<br />
}<br />
public Object getValueAt (int row, int column)<br />
{<br />
Object[] tabellenzeile = (Object[])tabelle.get(row);<br />
return tabellenzeile[column];<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 345
DynamischeTabelle<br />
extends AbstractTableModel(III)<br />
public void setValueAt (Object aValue, int rowIndex, int columnIndex)<br />
{<br />
Object[] tabellenzeile;<br />
if (rowIndex < tabelle.size())<br />
tabellenzeile = (Object[])tabelle.get(rowIndex); // Zeile existiert schon<br />
else if (rowIndex == tabelle.size()) {<br />
tabellenzeile = <strong>new</strong> Object[AnzahlSpalten]; // neue Zeile allokieren ...<br />
tabelle.add(tabellenzeile); // und an DisplayList hängen<br />
fireTableRowsInserted(rowIndex, rowIndex); // über Änderung informieren<br />
}<br />
else<br />
throw <strong>new</strong> ArrayIndexOutOfBoundsException(<br />
"DynamischeTabelle erlaubt nur anhängen");<br />
tabellenzeile[columnIndex] = aValue; // neuen Wert eintragen<br />
fireTableCellUpdated(rowIndex, columnIndex); // über Änderung informieren<br />
}<br />
public String getColumnName (int i) // liefert Spaltenüberschrift<br />
{<br />
return “Entity";<br />
}<br />
} // DynamischeTabelle<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 346
JTable<br />
� Details siehe auch:<br />
http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#renderer<br />
bzw.<br />
http://download.oracle.com/javase/tutorial/uiswing/components/table.html#renderer<br />
� Swing Tutorial:<br />
http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html#create<br />
bzw.<br />
http://download.oracle.com/javase/tutorial/uiswing/components/index.html<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 347
Tabellen<br />
� Schneller Überblick auf viele Merkmale gleichartiger Objekte<br />
� Neben dem reinen Markieren/Auswählen gibt es noch weitere<br />
nützliche Eigenschaften:<br />
Typprüfungen/-einhaltungen <strong>beim</strong> Editieren<br />
� für String, Integer, Float/Double, Boolean<br />
� aber auch für 1-aus-n und n-aus-m Auswahl bei den einzelnen<br />
Merkmalen in den Tabellenzellen bieten sich sehr geeignete<br />
Konstrukte an:<br />
• In TableCellRenderer werden Darstellungsmerkmale ausgedrückt<br />
• Im AbstractCellEditor wird die Übergabe/Empfang der Merkmale an<br />
das Model beschrieben<br />
� Die Objekte in der Tabelle können sortiert und/oder gefiltert werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 348
Sichere Typen in Tabellenzellen<br />
� Allgemein kann die Methode getValueAt(rowIndex, columnIndex).getClass();<br />
die spezifische Klasse liefern<br />
� String (Class.forName("java.lang.String")) und Integer<br />
(Class.forName("java.lang.Integer"))<br />
erfordern keine weiteren Einstellungen<br />
� Für Class.forName("java.lang.Boolean")<br />
sollte eine JCheckBox als CellRenderer eingesetzt werden:<br />
jTable2.setDefaultEditor(Class.forName("java.lang.Boolean"),<br />
<strong>new</strong> DefaultCellEditor(<strong>new</strong> JCheckBox()));<br />
� Für Class.forName("java.lang.JComboCox")<br />
sollte ein JComboBox –Objekt eingerichtet werde<br />
� Class.forName("java.lang.JList")<br />
benötigt einen CellRenderer und einen CellTableEditor<br />
� Der geschickte Einsatz macht Tabellen sicherer, flexibel und reduziert letztendlich den<br />
Programmieraufwand<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 349
JTable: Model und View für 1-aus-n Auswahl<br />
TicketState<br />
anzeigen<br />
TicketState<br />
ändern<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 350
Klasse, Editor und Renderer bereit stellen<br />
public Class getColumnClass(int columnIndex) {<br />
return getValueAt(0, columnIndex).getClass(); }<br />
� Editor für TicketState erstellen und einfügen:<br />
TableColumn col =<br />
jTable.getColumnModel().getColumn(3);<br />
JComboBox comboBox = <strong>new</strong> JComboBox();<br />
for (TicketState ts : TicketState.values())<br />
comboBox.addItem(ts);<br />
Weder für Renderer<br />
noch für CellEditor<br />
sind spez. Klassen<br />
erforderlich<br />
stateColumn.setCellEditor(<strong>new</strong> DefaultCellEditor(comboBox));<br />
�� Tool Tips für TicketState setzen:<br />
DefaultTableCellRenderer renderer = <strong>new</strong> DefaultTableCellRenderer();<br />
renderer.setToolTipText(„Anklicken, um Zustand zu ändern");<br />
stateColumn.setCellRenderer(renderer);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 351
1-aus-n Auswahl: JComboBox in JTable<br />
� Setter-Abschnitt in der Ableitung vom DefaultTableModel:<br />
...<br />
TicketState state = (TicketState)aValue;<br />
Tabellenzeile.setTicketState(state);<br />
...<br />
� Getter-Abschnitt in der Ableitung vom DefaultTableModel:<br />
...<br />
obj = Tabellenzeile.getTicketState();<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 352
JTable: Model und View für n-aus-m Auswahl<br />
TicketCategory<br />
anzeigen<br />
TicketCategory ändern (hier:<br />
MULTIPLE_INTERVAL_SELECTION)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 353
CellEditor, Renderer<br />
� Spezifischen CellEditor<br />
class MeinListEditor extends AbstractCellEditor<br />
implements TableCellEditor<br />
� realisieren:<br />
Übernahme der Werte ins Model beschreiben<br />
� Spezifischen Renderer<br />
class MeinCellRenderer extends JList /* z.B. */<br />
implements TableCellRenderer<br />
� realisieren:<br />
Aussehen der Componente (Größe, Hervorheben <strong>beim</strong> Selektieren,<br />
…) beschreiben<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 354
n-aus-m Auswahl: JList in JTable<br />
Auch hier wird ein spez. Editor und CellRenderer zugeordnet und in die<br />
Tabelle reingefügt:<br />
...<br />
TableColumn col =<br />
jTable.getColumnModel().getColumn(5);<br />
col.setCellEditor(<strong>new</strong> MeinListEditor());<br />
col.setCellRenderer(<strong>new</strong> MeinCellRenderer());<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 355
ListEditor (1/2)<br />
class MeinListEditor extends AbstractCellEditor implements<br />
TableCellEditor {<br />
}<br />
JList mlist;<br />
public MeinListEditor() { mlist = <strong>new</strong> JList(); }<br />
public Object[] getCellEditorValue() {<br />
int j = 0;<br />
Object werte[] = mlist.getSelectedValues();<br />
for (Integer i : mlist.getSelectedIndices())<br />
System.out.println(" (MeinListCellEditor) ausgewählt:<br />
" + i + " " + werte[j++]);<br />
return mlist.getSelectedValues();<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 356
ListEditor (2/2)<br />
// Zelle wird editiert<br />
public Component getTableCellEditorComponent<br />
(JTable table, Object value, boolean isSelected,<br />
int row, int column) {<br />
mlist.setListData((Object[]) value);<br />
return mlist;<br />
} // getTableCellEditorComponent<br />
}// MeinListEditor<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 357
CellRenderer (1/2)<br />
class MeinCellRenderer extends JList implements<br />
TableCellRenderer {<br />
public MeinCellRenderer() { super(); }<br />
public Component getTableCellRendererComponent<br />
(JTable mtable, Object value,<br />
boolean isSelected, boolean hasFocus,<br />
int rowIndex, int vColIndex) {<br />
// Hervorheben bei Auswahl<br />
if (isSelected)<br />
setBackground(mtable.getSelectionBackground());<br />
else<br />
setBackground(Color.white);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 358
CellRenderer (2/2)<br />
// Höhe der Liste für die Tabellenzeile berechnen<br />
int rowHight =<br />
mtable.getRowHeight()+mtable.getRowMargin()+1;<br />
String[] mlist = (String[]) value;<br />
int fold = mlist.length;<br />
if (mtable.getRowHeight(rowIndex)!= fold*rowHight)<br />
mtable.setRowHeight(rowIndex, fold * rowHight);<br />
setListData((String[]) value);<br />
return this;<br />
}<br />
}// MeinCellRenderer<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 359
n-aus-m Auswahl: JList in JTable<br />
� Getter-Abschnitt in der Ableitung vom DefaultTableModel:<br />
String[] sArray;<br />
sArray = <strong>new</strong> String[TicketCategory.values().length];<br />
int i = 0;<br />
for (TicketCategory tc : TicketCategory.values())<br />
sArray[i++] = tc.name();<br />
obj = sArray;<br />
return obj;<br />
� Setter-Abschnitt in der Ableitung vom DefaultTableModel:<br />
Object[] selCategroies = (Object[]) aValue;<br />
for (Object aCategory : selCategroies)<br />
System.out.println(" " + aCategory);<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 360
Sortieren und Filtern in Tabellen (1/2)<br />
� Tabellenzeilen können in Java elegant sortiert werden.<br />
� Ein Instanz der Klasse TableRowSorter sowie deren<br />
Identifikation als Sortierer der Tabelle sorgt für entsprechende<br />
Sortierungen<br />
� TableRowSorter sorter =<br />
<strong>new</strong> TableRowSorter(table.getModel());<br />
table.setRowSorter(sorter);<br />
Exkurs<br />
� TableRowSorter benutzt java.util.Comparator Objekt zum Sortieren<br />
der Zeilen. Die Klass, die das Interface implementiert, muss die<br />
Methode compare zum Vergleich von zwei Objekten anbieten.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 361
Sortieren und Filtern in Tabellen (2/2)<br />
� Durch das Sortieren oder Filtern wird die Reihenfolge<br />
der Zeilen verändert!<br />
Exkurs<br />
� Die „View-Koordinaten“ müssen auf die „Model“-Koordinaten transformiert<br />
werden.<br />
� JTable bietet Methoden an, um von „Model“-Koordinaten auf die „View“-<br />
Koordinaten zu transformieren:<br />
� convertColumnIndexToView und convertRowIndexToView und<br />
� Methoden die von „View“-Koordinaten nach „Model“-Koordinates konvertieren:<br />
�� convertColumnIndexToModel und convertRowIndexToModel.<br />
Hinweis: Achten Sie bei der Verwendung eines Sorters/Filters also darauf, dass<br />
die Tabellenzeilen verschoben sind und auf die tatsächlichen Indices vor<br />
Änderungen transformiert werden müssen..<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 362
Beispiele - MVC<br />
� TurtleGrafik: Objekte verwalten und darstellen<br />
(interface und abstract class)<br />
� JComboBox/JList: DefaultListModel verwenden<br />
� JTextField: extends PlainDocument<br />
�� JTable: extends AbstractTableModel<br />
� JTree: DefaultMutableTreeNode und DefaultTreeModel<br />
verwenden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 363
JTree<br />
� für hierarchische Gliederung von Einträgen<br />
�� Kapitelstruktur in einem Buch<br />
� Organisationsformen<br />
(Unternehmen, Institutionen)<br />
� Produktbeschreibungen<br />
� Klassenhierarchien<br />
� contentPane im GUI<br />
� HTML/XML Dokumente<br />
weisen diese Struktur auf<br />
� statisch (fester Inhalt) oder<br />
dynamisch (änderbar zur Laufzeit)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 364
JTree<br />
� Ereignis: valueChanged(TreeSelectionEvent e)<br />
// aus TreeSelectionListener<br />
� Zugriff auf selektierten Eintrag:<br />
e.getPath().getLastPathComponent().toString() // Text<br />
TreePath<br />
Object<br />
� TreePath jTree.getSelectionPath() // TreePath � Object[]<br />
� � (DefaultMutableTreeNode) // cast von Object<br />
(jTree.getSelectionPath().getLastPathComponent())<br />
� boolean isSelectionEmpty()<br />
� Siehe Klasse TreePath!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 365
DefaultMutableTreeNode<br />
� Standard-Knotentyp von JTree<br />
� für statische und dynamische JTrees<br />
� hat 1 übergeordneten Knoten (parent)<br />
� Ausnahme: Wurzelknoten hat keinen parent<br />
� hat ein Array von untergeordneten Knoten (childs)<br />
� werden senkrecht unter ihrem parent dargestellt<br />
� jedem Knoten kann ein beliebiges Object zugeordnet werden<br />
(im einfachsten Fall auch ein String)<br />
� bietet Enumerations (einfache Iteratoren) zum Durchwandern des<br />
Unterbaums<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 366
DefaultTreeModel<br />
� notwendig für dynamische JTrees<br />
�� einfügen, löschen, verschieben von Einträgen<br />
� informiert JTree über Änderung an seinen Einträgen<br />
� Einträge auch editierbar<br />
DefaultMutableTreeNode root = <strong>new</strong> DefaultMutableTreeNode ("Text");<br />
DefaultTreeModel treemodel = <strong>new</strong> DefaultTreeModel( root );<br />
JTree jDynTree = <strong>new</strong> JTree( treemodel );<br />
...<br />
treemodel.insertNodeInto(<strong>new</strong>Node, parent, parent.getChildCount());<br />
treemodel.removeNodeFromParent(selected);<br />
...<br />
void jDynTree_valueChanged(TreeSelectionEvent e) {<br />
jTextField1.setText(e.getPath().getLastPathComponent().toString());<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 367
DefaultTreeModel und<br />
DefaultMutableTreeNode (1/2)<br />
Einfügen:<br />
void jButtonInsert_actionPerformed(ActionEvent e)<br />
{<br />
if (jDynTree.isSelectionEmpty())<br />
JOptionPane.showMessageDialog<br />
(this, "Bitte selektieren Sie zuerst einen Knoten!");<br />
else<br />
{<br />
DefaultMutableTreeNode <strong>new</strong>Node = <strong>new</strong><br />
DefaultMutableTreeNode(jTextField1.getText());<br />
DefaultMutableTreeNode parent = (DefaultMutableTreeNode)<br />
(jDynTree.getSelectionPath().getLastPathComponent());<br />
// neuen Knoten am Ende der Child-Liste anhängen:<br />
treeModel.insertNodeInto(<strong>new</strong>Node, parent,parent.getChildCount());<br />
}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 368
DefaultTreeModel und<br />
DefaultMutableTreeNode (2/2)<br />
Löschen:<br />
void jButtonDelete_actionPerformed(ActionEvent e)<br />
{<br />
if (jDynTree.isSelectionEmpty())<br />
JOptionPane.showMessageDialog<br />
(this, "Bitte selektieren Sie zuerst einen Knoten!");<br />
else<br />
{<br />
DefaultMutableTreeNode selected = (DefaultMutableTreeNode)<br />
(jDynTree.getSelectionPath().getLastPathComponent());<br />
if (selected==treeModel.getRoot())<br />
JOptionPane.showMessageDialog<br />
(this, "Der Wurzelknoten kann nicht gelöscht werden.");<br />
else<br />
treeModel.removeNodeFromParent(selected);<br />
}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 369
Editierbare Bäume<br />
DefaultMutableTreeNode dynRoot;<br />
DefaultTreeModel treeModel;<br />
JTree jTree1;<br />
Treeview ()<br />
{<br />
dynRoot = <strong>new</strong> DefaultMutableTreeNode ("Spline"); // Wurzel<br />
treeModel = <strong>new</strong> DefaultTreeModel(dynRoot);<br />
jTree1 = <strong>new</strong> JTree(treeModel);<br />
jTree1.setEditable(true);<br />
TreeIcons tcr; // eigene Klasse<br />
tcr = <strong>new</strong> TreeIcons ();<br />
jTree1.setCellRenderer(tcr);<br />
}<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 370
TreeIcon reagiert auf Veränderungen<br />
class TreeIcons implements TreeCellRenderer<br />
{<br />
TreeIcons ()<br />
{}<br />
public Component getTreeCellRendererComponent<br />
(JTree tree, Object value, boolean selected, boolean<br />
expanded, boolean leaf, int row, boolean hasFocus)<br />
{<br />
System.out.println<br />
("getTreeCellRendererComponent " + value.toString());<br />
return <strong>new</strong> JLabel(value.toString());<br />
}<br />
}<br />
anwendungs-<br />
spez.<br />
Verhalten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 371
Klassenhierarchie zu JMenu<br />
Flächen<br />
Knoten<br />
alle MenuItems<br />
sind Buttons<br />
Blätter<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 372
„Konsoledialoge“<br />
� Das Programm durchläuft nacheinander verschiedene Zustände.<br />
Jede Eingabe wird mit der Return-Taste bestätigt oder<br />
mit der Escape-Taste abgebrochen.<br />
� Der Programmablauf gleicht einem Frage-Anwort-Spiel, in dem der<br />
Computer die führende Rolle übernimmt. Der Benutzer kann nur die<br />
Frage des Computers beantworten oder den Programmablauf ganz<br />
abbrechen und im Fehlerfall wieder komplett von vorne beginnen.<br />
� Man kann sich leicht vorstellen, dass diese Vorgehensweise in<br />
komplexeren Programmen für den Benutzer sehr problematisch wird:<br />
� der Benutzer reagiert auf die Fragen des Computers;<br />
� der Benutzer wird eine ablehnende Haltung einnehmen, wenn er das<br />
Programm nicht als Arbeitserleichterung empfindet!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 373
Ereignisgesteuerte Programmierung<br />
� Bei Programmen mit grafisch-interaktiven Benutzungsoberflächen<br />
kann die Reihenfolge der Eingabe beliebig variiert und Werte auch<br />
nachträglich geändert werden;<br />
Neuberechnungen oder Berechnungsvariationen sind einfach<br />
möglich.<br />
� Aus der Sicht der Entwicklerin/des Entwicklers bedeutet diese Art<br />
des Benutzerdialogs zusätzliche Überlegungen.<br />
� Der Benutzer entscheidet, was er als nächstes tut.<br />
Die Aufgabe des Programms besteht nun darin, Benutzereingaben<br />
wahrzunehmen und zu interpretieren.<br />
Für das Programm sind Benutzereingaben Ereignisse, auf die es in<br />
geeigneter Weise reagieren muss.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 374
Ereignisbegriff<br />
Events := Ereignisse,<br />
die i. d. R. vom Benutzer direkt oder indirekt ausgelöst werden und<br />
eine Eingabe darstellen, auf die das Programm auf eine bestimmte<br />
Art und Weise reagieren muss (Berechnung neu durchführen,<br />
Darstellung aktualisieren, Fenster verschieben ...)<br />
� Ereignisse sind weder Klassen, noch Objekte, noch Methoden !<br />
� Objekte von Event-Klassen sind Parametersätze, die zur<br />
Behandlung von Ereignissen als Zusatzinformation übergeben<br />
werden (nicht zu verwechseln mit den Ereignissen selbst)<br />
� Ereignisse müssen vom Programm behandelt werden<br />
� die Behandlung erfolgt durch Ausführung eines "Handlers"<br />
(= Funktion/Methode)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 375
Eventhandling<br />
Beispiele:<br />
�� Eingabe über Tastatur (� (� KeyEvent)<br />
� Mausklick (� MouseEvent, MouseMotionEvent)<br />
� Menueauswahl, Scrollbalken bewegen, Buttons anklicken<br />
(� ActionEvent)<br />
� Fenster verschieben, vergrößern, verkleinern, schließen, iconifizieren (�<br />
WindowEvent)<br />
� Dateiauswahl (�komplexer, zusammengesetzter Dialog)<br />
� ...<br />
�� Der Benutzer erwartet bestimmtes (Standard-)Verhalten!<br />
� Das Fenstersystem (Windowmanager, Betriebssystem) verteilt die Eingabe dazu<br />
an die betreffende Anwendung<br />
� die Anwendung reagiert anwendungsspezifisch (unterschiedlich Anwendungen<br />
reagieren unterschiedlich z. B. auf einen Mausklick)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 376
Eventhandling<br />
Events<br />
Fenstersystem,<br />
Windowmanager<br />
Prüfung der<br />
Events und<br />
Verteilung an<br />
Anwendung<br />
Reaktion/Behandlung<br />
von Eventtyp 1<br />
Reaktion/Behandlung<br />
von Eventtyp i<br />
Reaktion/Behandlung<br />
von Eventtyp n<br />
Anwendung 2<br />
Anwendung 1<br />
� In diesem Zusammenhang spricht man auch davon, dass der<br />
Programmablauf benutzergesteuert (user driven) ist.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 377
Zuordnung von Handlern<br />
� Ereignisse werden vom Betriebssystem erkannt oder erzeugt und an<br />
die Anwendung weitergeleitet<br />
� Maus/Tastatur � Betriebssystem � Anwendung<br />
� Basisklassen aus Bibliothek � eigene abgeleitete Klassen<br />
� letztlich sollen Methoden in der Anwendung aufgerufen werden<br />
� dabei werden i. a. ereignisspezifische Parameter übergeben<br />
(Mauskoordinaten, Tastencode, ButtonID, ...)<br />
�� Zuordnung: Systemereignis �� Handler<br />
� vom Wesen her: Tabelle mit Funktionszeigern<br />
(siehe Eventliste in der Design-Ansicht von Eclipse)<br />
� bisher kein Standard; jede Bibliothek macht es anders<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 378
ei Komponenten<br />
� "normale" Programmierung<br />
�� Zuordnung Ereignis �� Handler wird zur Compile-Zeit festgelegt<br />
� erlaubt konstante Arrays von Funktionszeigern oder<br />
virtuelle Funktionen (basieren ebenfalls auf konstanter vtable)<br />
� Komponententechnik (Java Beans, ActiveX Controls)<br />
� Komponente ist visuelles Steuerelement<br />
� stellt Eigenschaften, Methoden und Ereignisse bereit<br />
�� kann mit der umgebenden Anwendung kommunizieren<br />
� liegt als fertig kompilierte jar- vor<br />
� Zuordnung Ereignis � Handler wird zur Laufzeit festgelegt<br />
� erfordert dynamische Liste von Funktionszeigern oder Objekten;<br />
in Java: mit Methode add...Listener(Listenerobjekt)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 379
Listener<br />
� benötigt werden eigentlich Zeiger auf Funktionen<br />
� Dies gibt es nicht in Java (rein objektorientiert)!<br />
streng OO,<br />
flexibel und<br />
unübersichtlich<br />
� Stattdessen:<br />
Objekte von Klassen, die eine passende (Handler-) Methode haben<br />
� Methoden werden spezifiziert als interface "...Listener"<br />
� beliebige Klassen können dieses Interface implementieren,<br />
d.h. sich um die (Handler-)Methode ergänzen<br />
�� Referenzen auf Objekte dieser Klassen werden anstelle von<br />
Zeigern auf Funktionen übergeben ("als Listener registriert")<br />
� manche Listener-Interfaces definieren nur eine einzige Methode<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 380
Delegation<br />
� die Ereignisbehandlung wird abgeordnet/übertragen<br />
Ereignisquelle<br />
Benachrichtigung (2) Registrierung (1)<br />
Eventlistener<br />
Verweis auf<br />
Eventlistener<br />
implements XXXListener<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 381
Delegation<br />
� Bei dieser Technik registrieren sich Objekte direkt bei der Quelle eines<br />
bestimmten Ereignisses. Daraufhin werden diese Objekte „automatisch“ über das<br />
Auftreten dieses Ereignisses informiert.<br />
� Damit ein Objekt über den Eintritt eines Ereignisses unterrichtet werden kann,<br />
muss eine Verbindung zwischen der Quelle des Ereignisses und den<br />
Komponenten , die auf das Ereignis reagieren, geschaffen werden (Registrierung).<br />
Die Quelle speichert einen Verweis auf die Komponente, die informiert werden<br />
möchte.<br />
� Tritt das Ereignis ein, wird die Komponente über den Eintritt unterrichtet<br />
(Benachrichtigung). Da die Reaktion auf das Ereignis nicht direkt in der<br />
Komponente stattfindet, in der es eingetreten ist, spricht man von einem<br />
Delegatiosmodell.<br />
Bemerkung:<br />
� Nur ein Objekt, das das zu einem Ereignis zugehörigen Interface implementiert,<br />
kann über das Delegationsmodell auf ein Ereignis reagieren!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 382
Ereignisklassen – ein Ausschnitt<br />
ActionEvent<br />
EventObject<br />
AWTEvent<br />
AdjustmentEvent ComponentEvent ItemEvent<br />
ContainerEvent FocusEvent InputEvent WindowEvent<br />
MouseEvent<br />
...<br />
KeyEvent<br />
PaintEvent<br />
TextEvent<br />
ListSelectionEvent<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 383
Ereignisklassen (I)<br />
� ActionEvent:<br />
Ein ActionEvent definiert die Auslösung eines bestimmten Ereignisses,<br />
durch das eine andere Aktion angestoßen wird (z.B. Druck eines<br />
Buttons).<br />
� Adjustment Event:<br />
Ein AdjustmentEvent zeigt an, dass in einer Komponente ein<br />
Einstellvorgang vorgenommen wurde. Das ist der Fall, bei denen ein<br />
Wert zwischen zwei vorgegebenen Werten eingestellt werden kann (z.B.<br />
Scrollbar).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 384
Ereignisklassen (II)<br />
� ComponentEvent:<br />
Dieses Event wird ausgelöst, wenn in einer Komponente eine<br />
Operation ausgeführt wird. Darunter fallen das Verändern der Größe,<br />
das Anzeigen, Entfernen von Komponenten am Bildschirm und<br />
Eingabeereignisse (z.B. Maus, Key)<br />
� ListSelectionEvent:<br />
Ein ListSelectionEvent wird in Komponenten ausgelöst, bei denen<br />
aus einer bestimmten Menge ausgewählt werden kann (z.B. JList,<br />
JTable).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 385
Aktivitäten und Eventklassen<br />
Aktivität des Benutzers Swing-Eventklasse<br />
Klick auf Button, Return in Textfeld, Menüauswahl ActionEvent<br />
Tabellen- oder Listenauswahl wird geändert ListSelectionEvent<br />
Benutzer schließt das Hauptfenster WindowEvent<br />
Benutzer drückt Maustaste über Komponente MouseEvent<br />
Benutzer bewegt Maus über Komponente MouseEvent<br />
(MouseMotionListener)<br />
Komponente wird sichtbar ComponentEvent<br />
Komponente bekommt den Tastaturfokus FocusEvent<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
semantic<br />
low level<br />
Seite 386
Eventhandling – <strong>beim</strong> Ticketsystem<br />
class TicketJDialog extends JDialog implements ActionListener<br />
{<br />
JLabel zustand = <strong>new</strong> JLabel ();<br />
JTextArea ta = <strong>new</strong> JTextArea(10,10);<br />
JComboBox cb;<br />
Ticket t;<br />
TicketJDialog (JFrame aJFrame, Ticket aTicket, String[] consultant)<br />
{<br />
this.setSize(300, 200);<br />
this.setTitle("ConsultantAssign");<br />
this.getContentPane().setLayout(<strong>new</strong> GridLayout (1,3));<br />
this.t = aTicket;<br />
cb = <strong>new</strong> JComboBox (consultant);<br />
cb.addActionListener(this);<br />
this.getContentPane().add(cb);<br />
ta.setText(“Endloschleife");<br />
this.getContentPane().add(ta);<br />
zustand.setText(aTicket.state.toString());<br />
this.getContentPane().add(zustand);<br />
} // Konstruktor<br />
public void actionPerformed (ActionEvent ae)<br />
{<br />
t.state = TicketState.in_Bearbeitung;<br />
zustand.setText ("in Bearbeitung");<br />
}<br />
} // TicketDialog<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 387
Beispiel: ActionEvent<br />
Methoden<br />
� public String getActionCommand()<br />
� int getModifiers() // CTRL, ALT, Shift<br />
� String paramString()<br />
� public Object getSource()//ererbt von der Klasse EventObject<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 388
Beispiel: ListSelectionEvent<br />
Methoden<br />
� int getFirstIndex()<br />
� int getLastIndex()<br />
� boolean getValueIsAdjusting() // true, wenn mehrere<br />
Änderungen gemacht werden,<br />
d.h. Maus wird über Liste<br />
gezogen<br />
� String toString()<br />
�� public Object getSource()//ererbt von der Klasse EventObject<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 389
Beispiel: MouseEvent<br />
Methoden<br />
� int getClickCount()<br />
� Point getPoint()<br />
� int getX()<br />
� int getY()<br />
� boolean isPopupTrigger()<br />
� String paramString()<br />
� void translatePoint (int x, int y)<br />
� public Object getSource()//ererbt von der Klasse EventObject<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 390
� Anonyme innere Klasse<br />
� eine ganze Klasse zu schreiben, wenn man eigentlich nur eine<br />
Methode braucht, wäre ebenfalls unpraktisch<br />
� Lösung:<br />
eine anonyme Klasse, von der nur ein einziges, ebenfalls anonymes<br />
Objekt erzeugt wird<br />
� ergibt eine zusätzliche Datei Klasse$n.class<br />
jButton1.addActionListener(<strong>new</strong> ActionListener() {<br />
public void actionPerformed(ActionEvent e) {<br />
// entsprechende Aktionen ausführen<br />
}<br />
});<br />
� hat vollen Zugriff auf alle Variablen der umschließenden Klasse<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 391
(Anonyme) innere Klassen<br />
� Problem: keine Mehrfachvererbung, keine Freunde<br />
�� MeinFrame abgeleitet von JFrame<br />
� MeinListener abgeleitet von irgendeinem Adapter (=<br />
Standardimplementierung eines Interfaces)<br />
� Listener soll Zugriff auf die Elemente von MeinFrame haben<br />
� in C++ würde<br />
• MeinListener von MeinFrame und von Adapter abgeleitet werden<br />
oder<br />
• MeinFrame würde MeinListener zum Freund erklären<br />
� Ausweg: Listener als innere Klasse von MeinFrame<br />
� Listener oft als anonyme (namenlose) Klassen definiert;<br />
� sie können dann nur eine einzige Instanz haben<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 392
Aufgabe: Zuordnung einer Methode zum<br />
Ereignis ActionEvent des Buttons<br />
Ereignisbehandlung (1/2): anonyme Klasse<br />
private void jbInit() throws Exception {<br />
entfällt<br />
jButton1.setActionCommand("Hallo");<br />
jButton1.addActionListener(<strong>new</strong><br />
anonymeKlasse implements<br />
java.awt.event.ActionListener() {<br />
public void actionPerformed(ActionEvent e) {<br />
jButton1_actionPerformed(e);<br />
}<br />
});<br />
ActionListener ist ein Interface, das nur die<br />
}<br />
Methode actionPerformed definiert<br />
void jButton1_actionPerformed(ActionEvent e) {<br />
// Nutzinhalt; hier: Messagebox zeigt "Hallo"<br />
JOptionPane.showMessageDialog(this, e.getActionCommand());<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 393
Ereignisbehandlung (2/2): implements Interface<br />
import java.awt.event.*;<br />
class jButton1_Listener implements ActionListener<br />
{<br />
public void actionPerformed(ActionEvent e) {<br />
jButton1_actionPerformed(e);<br />
}<br />
}<br />
public class MainWindow extends JFrame {<br />
private void jbInit() throws Exception {<br />
jButton1_Listener B1L = <strong>new</strong> jButton1_Listener();<br />
jButton1.addActionListener(B1L);<br />
}<br />
}<br />
so ist es, wenn die Listener-<br />
Klasse nicht anonym ist ...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 394
Event-Adapter<br />
Ereignisquelle<br />
Benachrichtigung (2) Registrierung (1)<br />
Benachrichtigung (3)<br />
Verweis auf Adapter<br />
EventAdapter<br />
r<br />
Objekt<br />
implements XXXListener<br />
Verweis auf Objekt<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 395
Listener und Adapter<br />
� manche Listener-Interfaces definieren mehrere Methoden<br />
� oft braucht man aber nur eine davon<br />
� alle notgedrungen zum implementieren wäre unpraktisch<br />
� hilfsweise abstrakte Adapter-Klasse mit lauter leeren Methoden<br />
public abstract class MouseAdapter implements<br />
MouseListener {<br />
public void mouseClicked(MouseEvent e) {}<br />
public void mousePressed(MouseEvent e) {}<br />
}<br />
public void mouseReleased(MouseEvent e) {}<br />
public void mouseEntered(MouseEvent e) {}<br />
public void mouseExited(MouseEvent e) {}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 396
Erweiterte Adapterklasse<br />
class mymouse extends MouseAdapter<br />
{<br />
mymouse () {}<br />
public void mouseClicked (MouseEvent e)<br />
{<br />
System.out.println("Maus clickt!");<br />
}<br />
public void mousePressed (MouseEvent e)<br />
{<br />
System.out.println("Maus presst: "+e.getX()+" "+e.getY());<br />
}<br />
}<br />
public class listenerbeispiel extends JFrame<br />
...<br />
mymouse maus = <strong>new</strong> mymouse();<br />
addMouseListener (maus);<br />
...<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 397
Eventhandling mit Eclipse<br />
� Die Realisierung im IDE ist einfach:<br />
� Die Methodennamen und Parameter sind vorgegeben und werden<br />
durch Anklicken ausgewählt;<br />
� dann können anwendungsspezfische Aktionen eingefügt werden.<br />
� Mit setActionCommand() und getActionCommand()<br />
können Componenten spezifische Informationen übergeben<br />
werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 398
Fenster als Listener seiner Komponente<br />
import java.awt.event.*;<br />
public class Fenster extends JFrame<br />
implements ActionListener<br />
{<br />
private void jbInit() throws Exception {<br />
jButton1.addActionListener(this);<br />
}<br />
public void actionPerformed(ActionEvent e) {<br />
if (e.getSource()==jButton1)<br />
// Handler für jButton1<br />
else<br />
// Handler für andere Komponenten<br />
}<br />
}<br />
ein Handler pro<br />
Ereignis für alle<br />
Komponenten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 399
Beschreibung der Componenten mit Ressourcen<br />
� Konfigurieren statt Codieren<br />
�� Steigerungen der Produktivität bei entsprechender<br />
Werkzeugunterstützung<br />
� Deskriptiver Ansatz - GUI- Elemente werden generiert:<br />
� zur Beschreibung des Layouts und<br />
� der Componenten<br />
wird XML verwendet<br />
� Bei strikter Einhaltung führt Ansatz führt zu deutlichen Trennung<br />
zwischen GUI und Applikation:<br />
� Mehrsprachigkeit<br />
� Rapid Prototyping<br />
� Beispiel: GUI-Entwicklung unter Android ( )<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 400
Beschreibung des User Interfaces mithilfe von<br />
XML-Ressourcen (am Beispiel von Android) 1/4<br />
package BMI.calc;<br />
import android.app.Activity;<br />
import android.os.Bundle;<br />
public class calcBMI extends Activity<br />
{<br />
/** Called when the activity is first created. */<br />
@Override<br />
public void onCreate(Bundle savedInstanceState)<br />
{<br />
super.onCreate(savedInstanceState);<br />
setContentView(R.layout.main);<br />
}// onCreate<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 401
Beschreibung des User Interfaces mithilfe von<br />
XML-Ressourcen (am Beispiel von Android) 2/4<br />
strings.xml:<br />
<br />
<br />
App zur Berechnung des BMI<br />
Body Mass Index<br />
Masse in kg<br />
70<br />
Größe in cm<br />
170<br />
Ergebnis<br />
calculate<br />
#ffff00<br />
18px<br />
<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 402
Beschreibung des User Interfaces mithilfe von<br />
XML-Ressourcen (am Beispiel von Android) 3/4<br />
main.xml:<br />
<br />
<br />
Beschreibung des User Interfaces mithilfe von<br />
XML-Ressourcen (am Beispiel von Android) 4/4<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 404
Usability - Gebrauchstauglichkeit<br />
�Usability �Usability Engineering:<br />
� Benutzer (Sinus-Mileu-Studie)<br />
� Benutzerzentrierte Analyse und Design<br />
� Softwareergonomieaspekte<br />
�Usability Inspection/Usability Test:<br />
� Evaluationskriterien<br />
� Voraussetzung und Durchführung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 405
Usability<br />
� Es nützt wenig, ein funktional einwandfreies Produkt zu erstellen,<br />
wenn es von der Mehrheit der potentiellen Nutzer nicht akzeptiert<br />
wird!<br />
� Usability ist ein sehr entscheidender Faktor,<br />
um den wirtschaftlichen Erfolg eines Produktes am Markt zu<br />
bewerten.<br />
� Vorgehensweise:<br />
�� Anforderungen zusammentragen (Requirement Engineering)<br />
� Benutzerprofile erstellen (Stereotypen, Lebenslagen, Milieus)<br />
� Modellbildung (Modelle und Metapher)<br />
� Rapid Prototyping als Vorgehensweise involviert frühzeitig Betroffene<br />
� Einsatz von Bibliotheken, Frameworks<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 406
Usability-Engineering<br />
� Usability Engineering bezieht den Benutzer des Programms bei der<br />
Entwicklung mit ein:<br />
� Dinge, die für den Entwickler einfach und klar sind, können dem<br />
Benutzer Schwierigkeiten bereiten und ihm nicht zugänglich sein<br />
� Relevante Überlegungen können sehr plakativ formuliert werden:<br />
Quelle: Nielsen, Jakob: Usability Engineering, 1993<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 407
„Your best guess is not good enough“<br />
� Was einem zuerst als Problemlösung einfällt, muss nicht immer das<br />
Beste sein. Man sollte noch einmal genau überlegen, ob der<br />
Benutzer damit Probleme haben könnte.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 408
„The user is always right“<br />
� Die Benutzungsoberfläche soll so entwickelt werden, dass sie dem<br />
Benutzer gefällt, die gute Bedienbarkeit muss im Mittelpunkt der<br />
Überlegungen stehen.<br />
� Dies gilt insbesondere auch dann, wenn die Umsetzung aufwendiger<br />
ist oder man es selber gerne anders machen würde.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 409
„Less is more“<br />
� Man darf eine Benutzungsoberfläche nicht mit Funktionen<br />
überfrachten.<br />
Viele Programm weisen zwar einen großen Funktionsumfang auf; in<br />
der Regel führt dies aber zu Unsicherheiten und dazu, das eigentlich<br />
nur eine relativ kleine Untermenge von den einzelnen Benutzern<br />
beherrscht wird.<br />
� Klare, kompakte Oberflächen, die auf die Bedürfnisse der Benutzer<br />
und ihrer Aufgabenstellungen zugeschnitten sind, sollten angestrebt<br />
werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 410
„Designers are not users“<br />
� Für einen Designer kann es schwer sein, sich in die Lage des<br />
Benutzers zu versetzen, da er mehr Erfahrung im Umgang mit dem<br />
Computer hat und er dadurch möglicherweise Probleme aus Sicht<br />
des Benutzer zu übersehen.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 411
Kein mentaler Overhead -<br />
kein "menschliches RAM"<br />
� „Gestalte die Bedienung so einfach wie möglich“<br />
Dialoge sollten für den Benutzer so einfach und „direkt“ wie möglich<br />
sein und so gut wie möglich die konkrete Aufgabe des Benutzers<br />
treffen, damit die Belastung des Benutzer zur Realisierung einer<br />
anwendungsspezifischen Aufgabe durch spezifische Dinge der<br />
Benutzungsoberfläche so wenig wie möglich überlagert wird (z.B.<br />
erlernen der Syntax und Semantik einer Kommandosprache).<br />
� Stichworte hierfür sind<br />
� direkte Manipulation, Point-and-Click und Drag&Drop<br />
� Die menschliche Informationsverarbeitung im Kurzzeitgedächtnis ist<br />
begrenzt; der Anwender sollte bei einem Fensterwechsel keine Werte<br />
behalten müssen. Faustregel: „Man kann sich an 7 +|- 2 Informationen<br />
erinnern“<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 412
„Die Sprache des Benutzers sprechen“<br />
� In der Benutzungsoberfläche sollten anwendungsspezifische Begriffe<br />
und nicht systemspezifischen Begriffe verwendet werden.<br />
� Einfache und natürliche Dialoge tragen zur einfachen Bedienung bei.<br />
� Auf den Wiedererkennungswert von vertrauten Icons/Symbolen<br />
setzen.<br />
� Die Wiederverwendung von parametrisierten Elementen ist<br />
wesentlicher Bestandteil von fensterorientierten Systemen (WIMP -<br />
Window, Icon, Menue, Pointing Device).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 413
Kunden und Entwickler – Erwartungen und Umsetzungen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 414
Software-Ergonomie<br />
Usability-Überlegungen (I)<br />
� Eine zentrale Aufgabe in der Anwendungsentwicklung ist es, auf die<br />
speziellen Erwartungen, Anforderungen und Bedürfnisse der<br />
Anwender und insbesondere der Zielgruppe einzugehen. Dies<br />
bedeutet, dass das Programm „die Sprache“ des Benutzers sprechen<br />
sollte.<br />
� Den Aspekten der einfachen Bedienbarkeit und intuitiven<br />
Handhabung kommt bei der Planung/Konzeption der Mensch-<br />
Maschine-Schnittstelle eine wesentliche Rolle zu.<br />
� Es ist somit nicht verwunderlich, dass sich mit dieser kritischen<br />
Softwarekomponente nicht nur Softwareentwickler beschäftigen<br />
sondern auch (Software-)Ergonomen, Psychologen, und Designer.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 415
Software-Ergonomie<br />
Usability-Überlegungen (II)<br />
�� Eine schlechte und wenig durchdachte Benutzungsoberfläche kann<br />
einem guten Anwendungsprogramm mehr schaden als eine gute<br />
Benutzungsoberfläche einer schlechten Anwendung nutzen kann.<br />
� Neben der korrekten Anwendungssoftware ist die Mensch-<br />
Maschine-Schnittstelle mit entscheidend dafür,<br />
� wie gut das Softwareprodukt von den Benutzern akzeptiert und<br />
somit<br />
�� wie erfolgreich sich das Produkt am Markt entwickelt.<br />
� Die Entwicklung der Mensch-Maschine-Komponente in einem<br />
Programmsystem macht einen signifikanten Anteil des<br />
Entwicklungsaufwandes aus (i.d.R. mehr als 70%!).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 416
Software-Ergonomie<br />
Usability-Überlegungen (III)<br />
� Neben (teilweise sehr umfangreichen) firmenspezifischen<br />
Guidelines/Style Guides, die Richtlinien darstellen, wie bestimmte<br />
Dialogelemente zu verwenden sind und wo diese Elemente innerhalb<br />
einer Applikation und applikationsübergreifend zu verwenden sind,<br />
haben sich auch einige „Grundregeln“ herauskristallisiert, die man<br />
generell beachten sollte:<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 417
Software-Ergonomie<br />
Usability-Überlegungen (IV)<br />
�� Auf Konsistenz achten: immer wiederkehrende Elemente<br />
� stehen an der gleichen Stelle (Layout),<br />
� haben immer das gleiche Aussehen (Design und Farbgebung) und<br />
die gleiche Bedeutung (Semantik)<br />
� das (mentale) Modell sollte konsistent sein; Metapher sollten<br />
durchgängig sein und auch zum Ausdruck gebracht werden<br />
�� Auf die strenge Trennung von Anwendungsfunktionalität und<br />
Komponenten der Benutzungsoberfläche achten;<br />
dies gewinnt mit der Komplexität/Umfang der Entwicklung an<br />
Bedeutung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 418
Software-Ergonomie<br />
Usability-Überlegungen (V)<br />
�� Feedback - Rückmeldungen aus der Anwendung<br />
Der Benutzer muss eine Reaktionen auf seine Aktionen erhalten<br />
(Mauscursor ändert sich, Button zeigt Zustand an, …)<br />
� Einfache und deutliche Elemente<br />
Short Cuts erlauben erfahrenen Benutzer , sich schnell im<br />
Programm zu bewegen;<br />
Abbruchmöglichkeiten vermindern die Angst, Fehler zu machen<br />
Bemerkung: Funktionen an Graphischen Oberflächen sind durchaus<br />
redundant, d.h. es gibt mehrere Möglichkeiten, eine Aufgabe zu lösen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 419
Software-Ergonomie<br />
Usability-Überlegungen (VI)<br />
�� Sinnvolle (Fehler-)Meldungen<br />
Fehlermeldungen müssen einfach und klar zu verstehen sein;<br />
sie sind für den Anwender und nicht für den Entwickler<br />
� Fehlervermeidung statt Fehlerbehebung<br />
Der Benutzer sollte keine ernsthaften Fehler machen können<br />
�� Die Benutzungsoberfläche führt, entlastet und bietet<br />
situationsorientierte (kontextsensitive) Hilfe an<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 420
Kaufverhalten bei tech. innovativen Produkten<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 421
An Innovation culture combines<br />
Dreamers who do<br />
(„Innovators“)<br />
Geoffrey Moore: Crossing the Chasm<br />
Folie aus einem Vortrag von Prof. G. Dueck, Chief Technologist , ibm<br />
Doers who dream<br />
(„Sponsors“)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 422
Crossing the Chasm (1/3)<br />
� Eine kleine Zahl von interessierten Techies „spielt“ schon sehr früh<br />
mit der neuen Technologie.<br />
� Dadurch werden die „Visionäre“ auf die Technologie aufmerksam;<br />
sie sehen darin kreative, neue Möglichkeiten, sich einen Wettbewerbsvorteil<br />
zu verschaffen (auch wenn die Technologie noch an<br />
Kinderkrankheiten leidet). Solche Visionäre sind in der Regel die<br />
ersten Kunden (First Mover) für den Anbieter der neuen Technologie.<br />
� Wenn die Technologie dann schon etwas ausgereifter ist - das Risiko<br />
also nicht mehr so groß erscheint und der Kundennutzen klarer zu<br />
Tage tritt -, dann interessiert sich auch die große Gruppe der<br />
„Pragmatiker“ dafür. Sie wollen i. a. einen in Geld messbaren Vorteil<br />
(schneller, billiger, bequemer, besser, …) mit der neuen Technologie<br />
erzielen (lazy user model).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 423
Crossing the Chasm (2/3)<br />
� Wenn die ebenfalls große Gruppe der „Konservativen“ dann im Laufe<br />
der Zeit sieht, dass viele andere die Technologie mit Erfolg ein-setzen,<br />
springen auch sie auf den Zug auf, denn jetzt scheint das Risiko<br />
minimal und der Nutzen bewährt.<br />
� Die letzte Gruppe, die die neue Technologie dann aufnimmt, sind die<br />
„Nachzügler“. Siegreifen erst dann zu einer neuen Technologie, wenn<br />
die alte immer schwieriger erhältlich ist oder nur noch unter hohen<br />
Kosten aufrechterhalten werden kann.<br />
�� Geoffrey Moore hat untersucht, warum sich viele – auch Erfolg<br />
versprechende - technologische Ansätze am Markt nicht bewährt<br />
haben und wieder untergegangen sind. Er zeigt, dass es fundamentale<br />
Unterschiede zwischen den ersten Kunden, den „Visionären“ und der<br />
viel größeren Gruppe der „Early Majority“ des „Mainstreams“ gibt.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 424
Crossing the Chasm (2/3)<br />
� Diese Unterschiede sind verantwortlich für eine Kluft im „Technology<br />
Adoption Life Cycle“ (TALC), die Moore „Chasm“ nennt.<br />
� Es reicht nicht aus, die neue Technologie nur für die Visonäre zu<br />
vermarkten. Die Argumente müssen sich ändern und auf die<br />
Nutzergruppen zugeschnitten werden, um diese unsichtbare Kluft zu<br />
überbrücken. Andernfalls landen sie unweigerlich im „Tal des<br />
Misserfolgs“. Gerade die Anfangserfolge bei den „Early Adopters“<br />
machen eine notwendige radikale Strategieänderung so schwierig,<br />
denn diese Erfolge scheinen ja der Beweis für die Richtigkeit des<br />
eingeschlagenen Weges.<br />
� Es macht daher sehr viel Sinn, die Kundengruppen und deren<br />
Bedürfnisse sehr genau zu kennen.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 425
Die Sinus-Milieus® in Deutschland 2007<br />
� Länderspezifische Segmentation von Gesellschaften auf Grundlage von<br />
Wertorientierungen und Lebensstilen in 17 Nationen<br />
� Unterschiede in der Alltagswirklichkeit kennzeichnen den Menschen stärker als<br />
die Unterschiedlichkeit sozioökonomischer Lebensbedingungen.<br />
� Seine lebensweltliche Zugehörigkeit wird immer weniger von<br />
schichtspezifischen und demografischen Merkmalen gesteuert als von seinen<br />
Vorstellungen vom Leben, seinen alltagsästhetischen Leitbildern und<br />
Konsumstilen.<br />
� Von oben nach unten: Nach sozialer Lage in Schichten, auf der Grundlage von<br />
Bildung, Beruf und Einkommen<br />
� Von links nach rechts: Nach der Grundorientierung, in einem Spannungsbogen<br />
von traditionell bis postmodern<br />
� Oben sind die gesellschaftlichen Leitmilieus angesiedelt, am linken Rand die<br />
Traditionellen Milieus, in der Mitte die Mainstream Milieus und rechts die<br />
Hedonistischen Milieus.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 426
http://www.sinus-sociovision.de/<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 427
Sinus A12 (Konservative): 5%<br />
Das alte deutsche Bildungsbürgertum:<br />
konservative Kulturkritik, humanistisch geprägte Pflichtauffassung und gepflegte Umgangsformen<br />
Lebenswelt:<br />
Die Konservativen repräsentieren das alte deutsche Bildungsbürgertum. Sie pflegen die bewährten<br />
Traditionen, eine humanistisch geprägte Pflichtauffassung und gehobene Umgangsformen. Entsprechend<br />
leiden sie unter dem "Verfall der Werte und guten Sitten". Sie legen großen Wert auf Abgrenzung durch<br />
die Betonung ihrer gehobenen Stellung in der Gesellschaft. Heute sind viele im Ruhestand, nach einer<br />
erfolgreichen, verantwortungsbewussten Berufskarriere. Ihr Engagement richtet sich inzwischen - noch<br />
mehr als früher - auf ehrenamtliche Tätigkeiten.<br />
Familie und familiärer Zusammenhalt sind den Konservativen sehr wichtig. Vom Zeitgeist und dessen Folgen<br />
distanzieren sie sich kritisch. Sie interessieren sich für klassische Kunst und Kultur (Theater, Oper,<br />
Museen) und verfolgen besorgt das Zeitgeschehen in Politik, Gesellschaft und Wirtschaft.<br />
Da sie mit allem - zum Teil sehr gut - ausgestattet sind, genießen sie heute vor allem immaterielle Werte und<br />
kümmern sich um Wohlbefinden und Gesundheit. Wenn sie Anschaffungen vornehmen, dann sind es die<br />
besonderen Dinge wie wertvolles Porzellan, Echt-Schmuck, Kulturreisen oder ein (teures) Auto.<br />
Soziale Lage:<br />
Altersschwerpunkt ab 60 Jahre; meist Zwei-Personen-Haushalte<br />
Akademische Abschlüsse sind überrepräsentiert, aber auch Volksschulabschlüsse mit qualifizierter<br />
Berufsausbildung (Frauen)<br />
Hoher Anteil von Personen im Ruhestand; typische (ehemalige) Berufe: Höhere Angestellte und Beamte sowie<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Selbständige und freie Berufe<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Mittleres bis gehobenes Einkommensniveau, teilweise größere Vermögen<br />
© Sinus Sociovision 2007<br />
Seite 428
Sinus A23 (Traditionsverwurzelte): 14%<br />
Die Sicherheit und Ordnung liebende Kriegsgeneration:<br />
verwurzelt in der kleinbürgerlichen Welt bzw. in der traditionellen Arbeiterkultur Lebenswelt:<br />
Die Traditionsverwurzelten sind die sicherheits- und ordnungsliebende Kriegs- und<br />
Nachkriegsgeneration. Ihre Wurzeln haben sie entweder in der kleinbürgerlichen Welt oder in der<br />
traditionellen Arbeiterkultur. Sie verstehen sich als die Bewahrer der traditionellen Werte<br />
Pflichterfüllung, Disziplin, Bescheidenheit und Moral.<br />
Inzwischen sind die meisten Rentner oder Pensionäre, nach einem Arbeitsleben in der unteren Mitte<br />
der Gesellschaft (kleine Angestellte und Beamte, Arbeiter, Bauern).<br />
Sie setzen fort, was sie auch früher gelebt haben: die Pflege von Familien- und Nachbarschaftsbanden,<br />
die Suche nach Anerkennung im unmittelbaren sozialen Umfeld. Sich selbst in den Mittelpunkt<br />
stellen, Traditionelles und Bewährtes aufzugeben, kommt für sie nicht in Frage.<br />
Ihre Interessen kreisen eng um die eigenen vier Wände, die Familie und vor allem inzwischen um die<br />
eigene Gesundheit. Fernsehen, Basteln, Gartenarbeit, manchmal auch Ausflüge und Kaffeefahrten<br />
füllen die freie Zeit. Nach einem arbeitsreichen Leben genießen sie es, "sich auszuruhen".<br />
Die Traditionsverwurzelten sind sehr zurückhaltende Konsumenten. Ein Leben lang haben sie gespart<br />
und nur "Sinnvolles" und Notwendiges angeschafft. Auch heute halten sie ihr Geld zusammen und<br />
sind für sich selbst sehr sparsam. Kinder und Enkelkinder unterstützen sie dagegen gerne.<br />
Soziale Lage:<br />
Altersschwerpunkt in der Kriegs- und Nachkriegsgeneration (65 Jahre und älter);<br />
entsprechend hoher Frauenanteil<br />
Überwiegend Hauptschule mit abgeschlossener Berufsausbildung<br />
Hoher Anteil von Rentnern und Pensionären; früher: kleine Angestellte und Beamte, Arbeiter,<br />
Facharbeiter und Bauern<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Meist kleine bis mittlere Einkommen<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
© Sinus Sociovision 2007<br />
Seite 429
Sinus B1 (Etablierte): 10%<br />
Das selbstbewusste Establishment:<br />
Erfolgs-Ethik, Machbarkeitsdenken und ausgeprägte Exklusivitätsansprüche<br />
Lebenswelt:<br />
Die Etablierten sind die gebildete, gutsituierte und selbstbewusste Elite. Sie haben hohe<br />
Exklusivitätsansprüche und zeigen entsprechende Kennerschaft. Damit grenzen sie sich bewusst<br />
von anderen ab ("die feinen Unterschiede").<br />
Beruflicher Erfolg ist ihnen wichtig. Dabei verfolgen sie klare Karrierestrategien. Sie übernehmen<br />
Verantwortung und Führung, und sie sind sicher, ihre hohen Ziele zu erreichen.<br />
Sie haben eine pragmatische Lebensphilosophie, reagieren mit Flexibilität auf neue Situationen und<br />
engagieren sich in Vereinigungen, Verbänden und Clubs - nicht zuletzt, um auch soziale Ziele zu<br />
fördern.<br />
Kunst, Kultur und individuelle Reisen gehören zum Lebensgenuss der Etablierten. Andererseits<br />
beschäftigen sie sich auch nachhaltig mit Politik und Wirtschaft. Sie sind sehr aufgeschlossen<br />
gegenüber technologischem Fortschritt und den beruflichen wie privaten Vorteilen, die er bringt.<br />
Sie konsumieren edel und haben ein sicheres Gespür für das Besondere. Sie genießen den Luxus, den<br />
sie sich auf Grund ihrer privilegierten finanziellen Situation leisten können. Alles, was dem eigenen<br />
Well Being zuträglich ist, hat viel Raum in ihrer Lebensführung.<br />
Soziale Lage:<br />
Mittlere Altersgruppen ab 30 Jahre (Schwerpunkt: 40 bis 60 Jahre); meist verheiratet, Drei- und Mehr-<br />
Personenhaushalte<br />
Überdurchschnittlich hohes Bildungsniveau<br />
Viele leitende Angestellte, höhere Beamte sowie Selbständige, Unternehmer und Freiberufler<br />
Hohe und höchste Einkommensklassen <strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
© Sinus Sociovision 2007<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 430
Sinus AB2 (DDR-Nostalgische): 5%<br />
Die resignierten Wende-Verlierer:<br />
Festhalten an preußischen Tugenden und altsozialistischen Vorstellungen von Gerechtigkeit und<br />
Solidarität<br />
Lebenswelt:<br />
Die DDR-Nostalgischen (sie stellen fast ein Viertel der ostdeutschen Bevölkerung) sehen sich als<br />
Verlierer der Wende. Das führt zu einer gewissen Verklärung der Vergangenheit und Verbitterung<br />
gegenüber der Gegenwart.<br />
Früher waren sie oft Führungskader in Politik, Verwaltung, Wirtschaft, Kultur, heute haben sie einfache<br />
Berufe oder sind arbeitslos. Diese Situation verstärkt die Verbitterung und den Rückzug aus der<br />
"westlich" geprägten Welt.<br />
Sie führen ein - zum Teil demonstrativ - einfaches Leben, konzentriert auf Familie, gleichgesinnte<br />
Freunde und Vereine. Die Betonung der alten Werte des Sozialismus (Gerechtigkeit, Solidarität)<br />
paart sich mit Kritik am "Turbo-Kapitalismus''.<br />
Die Interessen und Freizeitaktivitäten der DDR-Nostalgischen konzentrieren sich auf Heimwerken,<br />
Renovieren, bescheidenes Modernisieren des Haushaltes, aber auch auf das Engagement in<br />
Vereinen und lokaler Politik.<br />
Prestigekonsum lehnen sie demonstrativ als westliche Unart ab. Geld geben sie nur für das<br />
Notwendigste aus. Dazu gehören Anschaffungen für Haus und Haushalt, die Basisausstattung mit<br />
technischen Geräten zum Heimwerken, moderne Haushaltsgeräte und Unterhaltungselektronik,<br />
manchmal auch ein Computer.<br />
Soziale Lage:<br />
Schwerpunkt bei den über 45jährigen<br />
Meist einfache bis mittlere Bildung; aber auch Hochschulabschlüsse sind leicht überrepräsentiert<br />
Früher häufig Führungskader in Partei, Verwaltung, Wirtschaft und Kultur; heute einfache Angestellte,<br />
Arbeiter / Facharbeiter oder arbeitslos <strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Kleine bis mittlere Einkommen (Doppelverdiener); hoher Anteil an Beziehern Prof. Dr.-Ing. von Altersübergangsgeld<br />
Hans-Peter Wiedling<br />
und Rente<br />
© Sinus Sociovision 2007<br />
Seite 431
Sinus B2 (Bügerliche Mitte): 15%<br />
Der statusorientierte moderne Mainstream:<br />
Streben nach beruflicher und sozialer Etablierung, nach gesicherten und harmonischen<br />
Verhältnissen<br />
Lebenswelt:<br />
Lebensziel der bürgerlichen Mitte ist es, in gut gesicherten, harmonischen Verhältnissen zu leben.<br />
Cocooning im gepflegten Ambiente, umgeben von gleichgesinnten und gleichsituierten Freunden<br />
prägt ihren Lebensrahmen.<br />
Sie zeigen Leistung und Zielstrebigkeit. Beruflicher Erfolg, eine gesicherte Position und die Etablierung<br />
in der Mitte der Gesellschaft sind ihnen wichtig. Manchmal sind sie geplagt von Abstiegsängsten.<br />
Sie wollen sich einen angemessenen Wohlstand erarbeiten, sich leisten können, worauf sie Lust haben.<br />
Dabei bleiben sie aber flexibel und realistisch.<br />
Ein angenehmes, komfortables Leben, Harmonie im familiären Umfeld und im Freundeskreis<br />
charakterisieren den Lebensstil der Bürgerlichen Mitte. Dazu gehört Gäste einladen, gemeinsames<br />
Kochen, Vereinsengagement, sportliche Betätigung in der Gruppe oder im Verein ebenso wie die<br />
intensive Beschäftigung mit den Kindern.<br />
Sie konsumieren gerne und mit Genuss, sind convenienceorientiert und haben ein ausgeprägtes<br />
Selbstbewusstsein als Verbraucher (Smart Shopper). Sie bevorzugen eine Mischung aus<br />
konventionell und modern, aus gediegen und repräsentativ. Sie investieren viel in die Ausstattung<br />
ihrer Wohnung / ihres Hauses, lassen dabei aber auch nicht ihr eigenes Outfit zu kurz kommen.<br />
Soziale Lage:<br />
Altersschwerpunkt: 30 bis 50 Jahre, oft Mehr-Personen-Haushalte, kinderfreundliches Milieu<br />
Qualifizierte mittlere Bildungsabschlüsse<br />
Einfache / mittlere Angestellte und Beamte; Facharbeiter<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Mittlere Einkommensklassen<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
© Sinus Sociovision 2007<br />
Seite 432
Sinus B3 (Konsum-Materialisten): 12%<br />
Die stark materialistisch geprägte Unterschicht:<br />
Anschluss halten an die Konsum-Standards der breiten Mitte als Kompensationsversuch sozialer<br />
Benachteiligungen<br />
Lebenswelt:<br />
Gerade wegen seiner sehr beschränkten finanziellen Mittel zeigt dieses Milieu einen ausgeprägten<br />
Konsum-Materialismus. Viele Milieuangehörige konzentrieren sich ganz auf das Hier und Jetzt, auf<br />
spontanen und prestigeträchtigen Konsum, um zu beweisen, dass sie mithalten können.<br />
Sie möchten als "normale Durchschnittsbürger" gelten, haben aber häufig das Gefühl, in der<br />
Gesellschaft benachteiligt zu sein. Ihre Wünsche von einem komfortablen Leben und ihre Träume<br />
vom plötzlichen Reichtum stehen oft im krassen Kontrast zur Realität.<br />
Ihre beruflichen Chancen sind häufig eingeschränkt durch mangelnde Ausbildung und ungünstige<br />
persönliche Rahmenbedingungen. Der Anteil der Arbeitslosen ist hoch.<br />
In ihrer Freizeit möchten sie Unterhaltung, Ablenkung, Action und Spaß. Ausgehen (Kneipen,<br />
Fußballveranstaltungen, Einkaufsbummel) ist ebenso beliebt wie zu Hause fernsehen, Videos<br />
ansehen, Videospiele, Musik und Radio hören.<br />
Wichtige Konsumziele sind für sie die Ausstattung mit moderner Unterhaltungselektronik<br />
(Stereoanlage, DVD-Player, Fernsehgerät, Handy), ein "repräsentatives" Auto, Urlaub (Kurzreisen,<br />
Besuch von Freizeitparks) und alles, was die eigene Erscheinung ins "rechte Licht" setzt<br />
(dekorative Kosmetik, Modeschmuck, Duftwässer).<br />
Soziale Lage:<br />
Breite Altersstreuung bis 60 Jahre<br />
Meist Volks-/ Hauptschulabschluss mit oder ohne Berufsausbildung<br />
Überdurchschnittlich viele Arbeiter / Facharbeiter <strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Untere Einkommensklassen<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Häufig soziale Benachteiligungen (Arbeitslosigkeit, Krankheit unvollständige Familien)<br />
© Sinus Sociovision 2007<br />
Seite 433
Sinus B12 (Postmaterielle): 10%<br />
Das aufgeklärte Nach-68er-Milieu:<br />
Liberale Grundhaltung, postmaterielle Werte und intellektuelle Interessen<br />
Lebenswelt:<br />
Die Postmateriellen sind überwiegend hochgebildet, kosmopolitisch und tolerant. Gewöhnt, in globalen<br />
Zusammenhängen zu denken, setzen sie sich kritisch mit den Auswirkungen von<br />
Übertechnisierung und Globalisierung auseinander. Höchster Wert ist die Lebensqualität des<br />
einzelnen.<br />
Sie haben großes Vertrauen in ihre eigenen Fähigkeiten und gehen souverän mit beruflichen<br />
Herausforderungen um. Sie wollen Erfolg im Beruf - aber nicht um jeden Preis.<br />
Ihre postmateriellen Ansprüche richten sich auf die Entfaltung ihrer individuellen Bedürfnisse und<br />
Neigungen, auf das Schaffen von Freiräumen für sich und auf mehr Zeitsouveränität.<br />
In hohem Maße sind sie interessiert an Literatur, Kunst und Kultur. Weiterbildung ist ein<br />
lebenslängliches Thema, weil sie sich mehr über Intellekt und Kreativität definieren als über Besitz<br />
und Konsum.<br />
Ihr Lebensstil ist umwelt- und gesundheitsbewusst (Balance zwischen Körper, Geist und Seele). Sie<br />
schätzen subtile Genüsse, die durchaus einen hohen Preis haben dürfen. Überflüssigen Konsum<br />
lehnen sie aber ab. Nach dem Motto "weniger ist mehr" kaufen sie selektiv und mit hoher<br />
Kennerschaft.<br />
Soziale Lage:<br />
Breites Altersspektrum - von Anfang 20 bis zur Generation der "jungen Alten"; häufig größere<br />
Haushalte mit Kindern<br />
Hohe bis höchste Formalbildung (Abitur, Studium)<br />
Qualifizierte und leitende Angestellte und Beamte, <strong>Fachbereich</strong> Freiberufler, <strong>Informatik</strong>: Studenten 3. Semester Bachelor Studiengang<br />
Hohes Einkommensniveau<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
© Sinus Sociovision 2007<br />
Seite 434
Sinus C12 (Moderne Performer): 10%<br />
Die junge, unkonventionelle Leistungselite:<br />
intensives Leben - beruflich und privat, Multi-Optionalität, Flexibilität und Multimedia-Begeisterung<br />
Lebenswelt:<br />
Die Modernen Performer sind die junge, unkonventionelle Leistungselite. Sie wollen ein intensives<br />
Leben, in dem sie ihre Multioptionalität und Flexibilität ausleben und ihre beruflichen wie<br />
sportlichen Leistungsgrenzen erfahren können.<br />
Ihr ausgeprägter Ehrgeiz richtet sich auf "das eigene Ding", oft die eigene Selbständigkeit (Start-ups).<br />
Dabei haben sie nicht nur den materiellen Erfolg im Auge. Treibendes Motiv ist ebenso, zu<br />
experimentieren, spontan Chancen zu nutzen, wenn sie sich auftun und die eigenen Fähigkeiten zu<br />
erproben.<br />
Die Modernen Performer sind mit Multimedia groß geworden. Die modernen<br />
Kommunikationstechnologien nutzen sie intensiv und lustvoll, im beruflichen wie im privaten<br />
Leben.<br />
Neben der Multimedia-Begeisterung zeigen sie großes Interesse an sportlicher Betätigung und<br />
Outdoor-Aktivitäten (Kino, Kneipe, Kunst).<br />
Ihr Konsumstil ist geprägt durch Lust auf das Besondere, das Integrieren von Einflüssen aus anderen<br />
Kulturen und Szenen. Anspruchvolles "Multikulti" ist die Devise. Dafür geben sie auch viel Geld<br />
aus.<br />
Soziale Lage:<br />
Jüngstes Milieu in Deutschland, Altersschwerpunkt unter 30 Jahre<br />
Hohes Bildungsniveau; (noch) viele Schüler und Studenten, zum Teil aber mit Jobs<br />
Unter den Berufstätigen hoher Anteil (kleinerer) Selbständiger<br />
und Freiberufler (Start-ups), sowie qualifizierte <strong>Fachbereich</strong> und leitende <strong>Informatik</strong>: Angestellte 3. Semester Bachelor Studiengang<br />
Hohes Haushaltsnettoeinkommen (gutsituierte Elternhäuser); bei den Berufstätigen Prof. Dr.-Ing. gehobenes Hans-Peter Wiedling<br />
eigenes Einkommen<br />
© Sinus Sociovision 2007<br />
Seite 435
Sinus C2 (Experimentalisten): 8%<br />
Die individualistische neue Bohème:<br />
Ungehinderte Spontaneität, Leben in Widersprüchen, Selbstverständnis als Lifestyle-Avantgarde<br />
Lebenswelt:<br />
Die Experimentalisten haben große Lust am Leben und Experimentieren. Sie sind tolerant und offen<br />
gegenüber unter-schiedlichsten Lebensstilen, Szenen und Kulturen. Gleichzeitig lehnen sie Zwänge,<br />
Routinen und Rollenvorgaben ab. Vielmehr leben sie lustvoll unterschiedliche Rollen und auch<br />
Widersprüche aus (Lifestyle-Avantgarde, neue Bohème).<br />
Weniger wichtig sind ihnen materieller Erfolg, Status und Karriere. Ihre Ablehnung, sich "lebenslänglich"<br />
festzulegen, führt oft zu ungewöhnlichen Patchwork-Biografien und -Karrieren.<br />
Die Experimentalisten sind mit Multimedia groß geworden und nutzen intensiv Online-Angebote, Videound<br />
Computerspiele. Sie engagieren sich aber auch für gesellschaftliche Randgruppen, betreiben<br />
Esoterik, machen mentales Training und gehen kreativen Tätigkeiten nach. Ihr Hauptinteresse richtet<br />
sich auf Musik, Kunst, Kultur, auf einschlägige Filme und Bücher. Sie haben ein großes Bedürfnis nach<br />
Kommunikation und Unterhaltung, sind ständig in Bewegung und dort zu finden, wo etwas<br />
Spannendes, Neues los ist.<br />
Die Experimentalisten geben ihr Geld gerne für Ungewöhnliches, für Dinge abseits des Mainstreams aus.<br />
Spontan kaufen sie, was ihnen ins Auge fällt oder in die Nase sticht. Zudem reizen sie moderne<br />
Unterhaltungselektronik und vielfältige Outdoor-Aktivitäten (Raves, Techno-Events, Rock- und Pop-<br />
Konzerte, Disco, Szene-Lokale, Extremsportarten).<br />
Soziale Lage:<br />
Junges Milieu, Altersschwerpunkt unter 30 Jahre; viele Singles<br />
Gehobene Bildungsabschlüsse; viele Auszubildende, Schüler und Studenten<br />
(Mittlere) Angestellte, (kleinere) Selbständige und <strong>Fachbereich</strong> Freiberufler; <strong>Informatik</strong>: auch Arbeiter 3. Semester (Jobber) Bachelor Studiengang<br />
Vergleichsweise hoher Anteil von Personen ohne eigenes Einkommen Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Haushaltsnettoeinkommen im Durchschnitt (gutsituierte Elternhäuser)<br />
© Sinus Sociovision 2007<br />
Seite 436
Sinus BC3 (Hedonisten): 11%<br />
Die spaßorientierte moderne Unterschicht /untere Mittelschicht:<br />
Verweigerung von Konventionen und Verhaltenserwartungen der Leistungsgesellschaft<br />
Lebenswelt:<br />
Die Hedonisten sind die spaßorientierte untere Mittel- bis Unterschicht, immer auf der Suche nach Fun<br />
und Action, Unterhaltung und Bewegung (on the road). Nur nicht sein wie "die Spießer".<br />
Gleichzeitig haben sie oft Träume von einem geordneten Leben mit Familie, geregeltem<br />
Einkommen und schönem Auto / Motorrad.<br />
Bezogen auf den Beruf führen viele eine Art Doppel-Leben, angepasst an den Berufsalltag, im<br />
Gegensatz zum hedonistischen Lebensstil in der Freizeit. Trotz und auf Grund dieser partiellen<br />
Anpassung haben sie häufig aggressive Underdog-Gefühle gegenüber ihrer (Arbeits-) Umwelt.<br />
Die Hedonisten leben ganz im Hier und Jetzt, möchten sich wenig Gedanken um die Zukunft machen.<br />
Dabei zeigen sie Spaß an der Provokation der "Spießer" und der Identifikation mit "krassen"<br />
Szenen, Clubs und Fangemeinden.<br />
In besonderem Maße interessieren sie sich für Fernsehen, Video, Musik, Computerspiele, Sport<br />
(Fußball, Squash), Kino-, Disco- und Kneipenbesuche.<br />
Sie konsumieren gern und viel - soweit das ihr limitiertes Budget zulässt. Gemäß ihrem ausgeprägten<br />
Unterhaltungsbedürfnis interessieren sie sich für Produkte wie Stereo- und HiFi-Anlagen,<br />
Multimedia-Ausstattung, Videos, CDs, aber auch für "Klamotten", Modeschmuck, Uhren, Kosmetik,<br />
Duftwässer, Sportausstattung und -bekleidung, und natürlich Autos und Motorräder.<br />
Soziale Lage:<br />
Jüngere und mittlere Altersgruppen bis 50 Jahre; Schwerpunkt unter 30 Jahre<br />
Einfache bis mittlere Formalbildung - relativ oft ohne abgeschlossene Berufsausbildung<br />
Einfache Angestellte und Arbeiter; viele Schüler <strong>Fachbereich</strong> und Auszubildende <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Vergleichsweise großer Anteil von Personen ohne eigenes Einkommen; Prof. keine Dr.-Ing. erkennbaren Hans-Peter Wiedling<br />
Schwerpunkte <strong>beim</strong> Haushaltseinkommen<br />
© Sinus Sociovision 2007<br />
Seite 437
Analysephase<br />
� Benutzer in Bezug auf ihren Umgang mit dem System (z.B., durch<br />
Beobachtung und/oder Interviews) erfassen und beschreiben.<br />
� Für jeden Gruppe von Benutzern ein Profil erstellen, welches<br />
unterschiedliche Aspekte (Verhalten, demographischer Hintergrund).<br />
berücksichtigt.<br />
� Ziele und Einstellungen der Benutzer erarbeiten.<br />
� Arbeitsabläufe und Arbeitskontext freilegen und beschreiben.<br />
�� Typische Benutzerszenarien herausarbeiten.<br />
� Welche Software wird eingesetzt? Wie wird die Software eingesetzt?<br />
Wofür wird die Software eingesetzt?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 438
Usability Engineering Lifecycle<br />
1. Benutzer und seine Bedürfnisse verstehen lernen<br />
2. Gebrauchstauglichkeit vergleichen und bewerten<br />
3. Ziele für das Design festlegen<br />
4. Iteratives Designprozess:<br />
(a) Prototyping<br />
(b) Usability Evaluation (Inspektion und/oder Tests)<br />
5. Nachfolgende Schritte (Verbesserungen, Erweiterungen)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 439
Einen Eindruck von den Benutzern verschaffen<br />
� Bedürfnisse, Wünsche, Ziele, Aufgaben,<br />
Hintergründe/Rahmenbedingungen<br />
� erfassen und<br />
� visualisieren<br />
� Einsetzbare Techniken:<br />
� Persona beschreiben<br />
�� Moodboard einsetzen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 440
Persona – Rollen/Stereotypen<br />
� Mit der Beschreibung potentieller Benutzer und ihren Eigenschaften kann<br />
man ein lebendiges Bild von den Zielgruppen machen. Es entsteht ein<br />
Verständnis und ein erster Zugang zur Entwicklung realistischer<br />
Nutzungsszenarien (Tipp: http://www.usability.gov/).<br />
� Diese können dann für die Entwicklung und Prüfung von Produktentwicklungen<br />
genutzt werden Eine Form der Benutzerbeschreibung ist die<br />
Aufbereitung als "Persona". Dabei wird eine Art Steckbrief verfasst, der<br />
neben Alter, Geschlecht, Ausbildung, Vorlieben, Hobbys, Charaktereigenschaften<br />
sogar einen Namen oder "Nickname" eines repräsentativen<br />
Zielgruppenvertreters beinhaltet<br />
Rollen helfen,<br />
� sich repräsentative Bilder von den Benutzergruppen zu machen,<br />
� die Produktqualität zu verbessern und<br />
� Entwicklungszeiten zu verkürzen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 441
Rollen, Stereotypen<br />
� „Benutzer“ sind unspezifisch - sie müssen für alles und jedes<br />
herhalten!<br />
� Designs für den „Durchschnittsbenutzer“ führen zu Ergebnissen,<br />
welche niemanden wirklich beeindrucken.<br />
� Verweisen Sie nicht auf den „User“,<br />
verweisen Sie auf spezifische Rollen;<br />
sie sind die Prototypen für tatsächliche Nutzer.<br />
� Unterscheiden Sie unterschiedliche Benutzer(-gruppen) und<br />
designen Sie für diese!<br />
� Persona erzeugen Betroffenheit und geben den Personen ein Gesicht<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 442
Typische Rollen/Stereotypen<br />
� Ein geeigneter Stereotyp ist<br />
�� nicht durchschnittlich, aber typisch und glaubwürdig, und<br />
� ein Eindruck eines Stereotyps ergibt sich etwa aufgrund einer Befragung<br />
(Interviews);<br />
Stereotypen können markante Charakteristiken ausdrücken;<br />
andere, die nicht so scharf abgegrenzt werden, können die Anwendung<br />
dann ebenso nutzen.<br />
� Legen Sie die Stereotypen möglichst exakt fest:<br />
� Vergeben Sie Name und Alter;<br />
� Beschreiben Sie typisches Verhalten<br />
(gerade auch im Zusammenhang mit der zu entwickelnden Applikation);<br />
� Geben Sie der beschriebenen Person ein Gesicht (verwenden Sie ein<br />
Bild);<br />
� Definieren Sie Ziele für jede Rolle;<br />
� Definieren Sie Szenarien für jede Rolle.<br />
� Diese sollten gerade den dann folgenden Umsetzungen stand halten.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 443
Beispiel Persona - Buchhandlung<br />
� Beschreibung typischer Benutzer für unterschiedliche Benutzergruppen<br />
Name: Udo Fischer<br />
Alter: 49 Jahre, Single<br />
Kategorie:<br />
Liest gelegentlich im Urlaub; ist an Reiseberichten<br />
interessiert; kocht gerne.<br />
Name: Konrad Naumann<br />
Alter: 72 Jahre<br />
Kategorie: Vielleser, 2 Enkelkinder<br />
Liest viel und regelmäßig ist an einem breiten Angebot an<br />
Romanen und Biographien interessiert. Verschenkt auch gerne<br />
ein Buch an seine beiden Enkelkinder Jasmin und Kai.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 444
Moodboard – thematische Stimmungsbilder<br />
� Gespaltene Gesellschaft (http://www.sinus-sociovision.de/)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 445
Moodboard – thematische Stimmungsbilder<br />
� Moodboards sind meist Collagen aus Bildern unterschiedlicher Art,<br />
Schlüsselwörtern und Farbstimmungen.<br />
� Sie bieten gestalterische Orientierung, und sie sind hilfreich bei der<br />
Visualisierung von Produktwelten oder Zielgruppenassoziationen.<br />
Bildcollagen, Farbharmonien und Schlüsselworten stellen<br />
atmosphärische Eindrücke her, die eine bestimmte Zielgruppe, ein<br />
zu gestaltendes Produkt bzw. das Umfeld, für dass das Produkt oder<br />
eine Dienstleistung gestaltet werden soll, charakterisieren.<br />
�� Ziel ist die Visualisierung einer Grundstimmung, in die die<br />
Applikation oder der Service passen soll. Häufig können Farbklimata<br />
direkt aus dem Moodboard generiert werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 446
Ergonomische Normen<br />
� haben immer nur Richtliniencharakter<br />
� ergonomischer und technischer Gestaltungsspielraum<br />
� keine Normung eines Softwareproduktes<br />
� es gibt nicht "den" Benutzer;<br />
Benutzergruppen müssen individuell charakterisiert werden<br />
Standards<br />
vs.<br />
Innovation<br />
� Rahmenbedingungen (z.B. Arbeitsorganisation, Arbeitsumgebung) sind<br />
unterschiedlich<br />
� sollen keine bestimmte Implementierung nahe legen<br />
notwendig,<br />
aber nicht<br />
hinreichend<br />
� enthalten meist nur Mindestanforderungen<br />
� spiegeln lediglich den gegenwärtigen (bzw. damaligen) Stand des<br />
Wissens wider – noch sehr lückenhaft<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 447
Normen zur (Software-)Ergonomie<br />
� DIN EN ISO 9241: Ergonomische Anforderungen für Bürotätigkeiten<br />
mit Bildschirmgeräten<br />
� Hardware und Arbeitsplatzgestaltung<br />
- 1: Allgemeine Einführung<br />
- 4: Anforderungen an die Tastatur<br />
- 5: Anforderungen an Arbeitsplatzgestaltung und Körperhaltung<br />
- 6: Leitsätze für die Arbeitsumgebung<br />
http://www.din.de<br />
- 7: Anforderungen an visuelle Anzeigen bezüglich Reflexionen<br />
- 8: Anforderungen an Farbdarstellungen<br />
- 9: Anforderungen an Eingabemittel, ausgenommen Tastaturen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 448
Normen zur Software-Ergonomie<br />
� Fortsetzung DIN EN ISO 9241<br />
� Aussagen zur Softwareergonomie<br />
- 10: Grundsätze der Dialoggestaltung<br />
- 11: Richtlinien zur Gebrauchstauglichkeit<br />
- 12: Informationsdarstellung<br />
- 13: Benutzerführung<br />
- 14: Dialogführung über Menüs<br />
- 15: Dialogführung über Kommandosprachen<br />
- 16: Dialogführung über direkte Manipulation<br />
- 17: Dialogführung über Bildschirmformulare<br />
� DIN EN ISO 13407<br />
Benutzer-orientierte Gestaltung interaktiver Systeme<br />
enthalten die<br />
folgenden<br />
7 Prinzipien<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 449
Entwurfs- und Gestaltungsprinzipien<br />
� Aufgabenangemessenheit<br />
�� Selbstbeschreibungsfähigkeit<br />
� Steuerbarkeit<br />
� Erwartungskonformität<br />
� Fehlertoleranz<br />
� Individualisierbarkeit<br />
� Erlernbarkeit<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 450
Aufgabenangemessenheit (I)<br />
� Direktheit: kurze Wege zur Information / Funktion<br />
�� mehrere Dialogebenen �� Karteireiter �� Assistenten<br />
� geschachtelte Pulldown-Menüs<br />
� Anzahl Mausklicks, Weglänge zur Position,<br />
(häufige) Wechsel zwischen Tastatur und Maus<br />
� flexible + schnelle Navigation: Querverweise (Orientierung?!)<br />
� Gewichtung: häufiges einfach, seltenes aufwändiger<br />
�� Nachrangiges erst auf zusätzlichen Knopfdruck<br />
� keine unnötigen Informationen anzeigen<br />
� Einfachheit statt Featuritis<br />
� nicht Benötigtes muss der Benutzer gedanklich herausfiltern<br />
� KEIN menschliches RAM<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 451
Aufgabenangemessenheit (II)<br />
� Effizienz, Antwortzeiten, sinnvolle Vorgabewerte<br />
� am schnellsten ist eine vermiedene Eingabe<br />
� Unterstützung für wiederkehrende Aufgaben<br />
� Formatierung übertragen, Makro(-recorder), Tastatursteuerung<br />
� Unterstützung gängiger Arbeitsabläufe<br />
� Bedienfolgen, Assistenten (Wizards)<br />
� Workflow<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 452
Selbstbeschreibungsfähigkeit (I)<br />
Systemzustand muss auf einen Blick erkennbar sein<br />
� Wo bin ich ? Ort<br />
� momentaner Aufenthaltsort im System<br />
� Was kann ich hier tun ? Modus<br />
� zur Verfügung stehende Operationen<br />
� Wie kam ich hierher ? Weg<br />
� Vorgeschichte, Kontext<br />
� Wohin kann ich gehen ? Weg<br />
� Ziel eines Buttons (Verweises) soll erkennbar sein<br />
nicht zu<br />
verwechseln mit<br />
Dokumentation<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 453
Selbstbeschreibungsfähigkeit (II)<br />
� aktuellen Zustand und Kontext darstellen<br />
� Kontextinformationen (z.B. Verzeichnispfad bei Datei öffnen)<br />
� Statusbar/Statusanzeige<br />
� aktuelle Möglichkeiten zeigen<br />
� Bedienelemente inaktiv machen: besserer Überblick<br />
� Bedienelemente verbergen: aufgeräumteres Design<br />
� visuell direkt erkennbare sensitive Bereiche<br />
�� nicht erst durch "Scannen" (Webseiten ����, ����, Adventure Games ☺)<br />
� Reaktion / Rückkopplung / Feedback<br />
� Tasten(Buttons) lassen sich "drücken"<br />
� bereichs-/objektabhängig veränderlicher Mauscursor<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 454
Selbstbeschreibungsfähigkeit (III)<br />
� keine versteckten Funktionen / Tastaturkürzel<br />
� alle Tastaturkürzel in Menüs aufführen;<br />
eine Seite in der Dokumentation genügt nicht<br />
� Icons mit Tooltips beschriften<br />
� Information über länger dauernde Abläufe<br />
� Sanduhr, Fortschrittsanzeige, Zwischenergebnisse<br />
� Ablauf abbrechbar (und umkehrbar)<br />
� Anwender- und problemkompatible Terminologie<br />
� Begriffe, Befehle, Fehlermeldungen<br />
� Begriffe aus Anwendungsdomäne aufgreifen und verwenden<br />
(wie reden künftige Benutzer über ihre Arbeit ?)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 455
Steuerbarkeit<br />
� kein "Eigenleben" des Systems<br />
Benutzer agiert, System reagiert<br />
� beenden ohne "wollen Sie wirklich ?"<br />
� freie Eingabereihenfolge<br />
� auch bei Validierung von Eingabewerten<br />
(Validierung auf Fensterebene, nicht auf Elementebene)<br />
� mehrstufige Rückgängig- (Undo-) Funktion<br />
� dafür muss man etwas tun!<br />
�� Dialogfolgen und längere Abläufe jederzeit abbrechbar und<br />
umkehrbar<br />
� dem Arbeitstempo angepasste Steuerungsformen<br />
� Menü � Toolbar � Tastatur<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 456
Erwartungskonformität (I)<br />
� im Widerspruch zu Originalität und Innovation ?!<br />
� es kann auch schlechter werden ...<br />
� plattformspezifisches Standardverhalten (Look&Feel)<br />
� definiert in Style Guides<br />
� gewohnt, aber leider nicht immer optimal<br />
� besonders kritisch, weil unterbewusst: Tastatur + Klickverhalten<br />
� Erwartungen aus der Anwendungsdomäne erfassen<br />
�� nicht immer "logisch", historisch gewachsen<br />
� oft unbewusst (Interview und Fragebogen hilft nicht)<br />
� Beispiel: Gehwegplanung via Trampelpfad auf Gras<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 457
Erwartungskonformität (II)<br />
� Wiedererkennbarkeit und Konsistenz<br />
� Einsatz von Steuerelementen für typische Aufgaben<br />
• Checkbox für einzelnen Boolean (schließt kein Fenster!)<br />
• Radiobuttons als Gruppe gegenseitig auslösend<br />
� Standarddialoge verwenden<br />
• Datei öffnen/speichern, Farbauswahl,<br />
Schriftauswahl, Seite einrichten, Drucken<br />
�� Mauszeiger<br />
� schlechte Beispiele<br />
� Strg+Alt+Del zum Anmelden<br />
� Start � Beenden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 458
Fehlertoleranz<br />
Entwickler konzentrieren sich lieber<br />
auf die "eigentliche" Funktion<br />
� "Urängste" etwas (am Computer) verkehrt zu machen<br />
� vertrauensbildende Maßnahmen erforderlich � Gefühl<br />
� Einarbeitung durch Entdeckungsreise ermöglichen<br />
� Vorbeugung: Bedienelemente deaktivieren<br />
� Rückfrage/Warnung bei "gefährlicher" Aktion<br />
� Vorsicht: viele lesen nicht, sondern nehmen unbesehen Default<br />
� Möglichkeiten zur Fehlerbehebung vorsehen<br />
�� Rückgängig/Undo, Abbrechen, Papierkorb<br />
Zustandsanzeige<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 459
Individualisierbarkeit<br />
� Anpassung an<br />
� persönliche Benutzungshäufigkeit<br />
� Gewohnheiten aus anderen Anwendungen<br />
� persönliches Systemumfeld<br />
� konfigurierbare Toolbars und Menüs<br />
kein Ersatz für<br />
sorgfältig abgestimmte<br />
Grundeinstellung !<br />
� eigene Teilmenge definieren; eigene Funktionen als Makros<br />
� Favoriten, Last Used, Most Used<br />
�� Zeitabhängigkeiten<br />
Anpassung<br />
macht<br />
Arbeit<br />
konfigurierbare Fokussteuerung<br />
� Erscheinen von Tooltips, Doppelklick, Repeat-Funktion<br />
� individuelle Einstellungen sichern und "mitnehmen"<br />
� auf anderen Rechner oder bei SW-Upgrade<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 460
Erlernbarkeit<br />
� damit Einsteiger zu Fortgeschrittenen und Profis werden<br />
� ausführliche Hinweisdialoge für Einsteiger<br />
� mit Checkbox "Dialog künftig nicht mehr anzeigen"<br />
� Tooltips für Icons und Buttons<br />
� viele Bilder und Begriffe müssen erst gelernt werden<br />
� Statuszeilentexte für Eingabefelder<br />
�� Tooltip würde Eingabefeld verdecken<br />
� kontextabhängige Hilfe für ausführlichere Erklärungen<br />
� Guided Tour vermittelt Arbeitsabläufe<br />
� kann man das Problem visualisieren?<br />
Bei (nicht vor)<br />
der Arbeit<br />
lernen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 461
Benutzerzentriertes Design - Kriterien<br />
� Lernaufwand:<br />
Wie lange benötigt ein typischer Benutzer, um die Durchführung<br />
einer definierten Aufgabe zu lernen?<br />
� Arbeitsgeschwindigkeit:<br />
Wie schnell lassen sich typische Aufgaben von typischen<br />
Benutzern ausführen<br />
� Fehlerrate:<br />
Wie viele und welche Fehler treten bei der Durchführung der Aufgabe auf?<br />
�� Erinnerungsvermögen:<br />
Was und wie viel behalten Benutzer in ihrer Erinnerung bezüglich<br />
Aufgaben über einen definierten Zeitraum hinweg?<br />
� Joy-of-Use/(subjektive) Zufriedenheit:<br />
Wie empfindet der Benutzer persönlich die Arbeit mit einem System?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 462
Usability Inspection - Ziele<br />
� Usability Inspection wird durch geführt, um gezielt Probleme auf zu<br />
spühren,<br />
� die gravierend die Handhabbarkeit behindern oder<br />
� leicht beseitigt werden können.<br />
� Dabei werden die folgenden Fragen beantwortet:<br />
� Welche Bedienhandlungen erfordern einen hohen Lernaufwand (was<br />
erschwert das Lernen)?<br />
� Welche Fehler entstehen leicht?<br />
�� Welche Fehler haben gravierende Folgen?<br />
� Welche Bedienelemente sind ungünstig gestaltet<br />
(unübliche Beschriftung, oder grafische Darstellung, mangelhafte<br />
Strukturierung von Dialogen)?<br />
� Welche Systemnachrichten sind unangemessen formuliert oder nicht<br />
aussagekräftig?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 463
Usability Test - Voraussetzung<br />
� Festlegung des Testgegenstandes (hier unser Prototyp)<br />
� Tester, die den Test vorbereiten, durchführen und auswerten;<br />
es ist besser, dabei nicht (nur) auf Entwickler zu setzen!<br />
� Testpersonen<br />
Festlegung der teilnehmenden Personen (wie viele und welche) und<br />
Erstellung eines Zeitplanes<br />
� Testumgebung<br />
Die Tests dürfen soweit möglich nicht gestört werden und<br />
müssen wiederholt werden können (� Usability Lab)<br />
�� Testkritierien (Definition von Schwerpunkten):<br />
Insbesondere bei komplexen Systemen wird selten versucht, alle<br />
denkbaren Aktionen zu überprüfen.<br />
Typisch ist, dass die Inspektion anhand von Szenarien erfolgt.<br />
Es müssen messbare und vergleichbare Daten entstehen!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 464
Durchführung 1/4<br />
Effizienz der Interaktion:<br />
� Wie lange dauert die Durchführung einer Aufgabe?<br />
� Wie viele Aufgaben können in einer vorgegeben Zeit durchgeführt<br />
werden?<br />
� Welche Antwortzeiten brauchen die Testpersonen?<br />
� Welche Aktionen treten besonders häufig auf?<br />
� Wie häufig treten sehr ineffiziente Interaktionen auf?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 465
Durchführung 2/4<br />
Auftreten von Fehlern:<br />
� Wie viele Aktionen waren erfolgreich/fehlerhaft?<br />
� Welche Fehler treten besonders häufig auf?<br />
� Weil lange dauert die Behebung von Fehlern?<br />
� Wie viele positive/negative Kommentare werden geäußert?<br />
� Wie groß ist der Anteil der Benutzer, der eine Aufgabe (richtig/schnell<br />
genug/auf optimalem Weg) durchgeführt hat?<br />
�� Wie viele Kommandos (von allen möglichen) wurden genutzt?<br />
� Wie oft und wie lange wurden Anleitungen oder andere Hilfsmittel<br />
studiert?<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 466
Durchführung 3/4<br />
Erlernbarkeit:<br />
� Wie lange braucht ein Anwender,<br />
um die Durchführung einer Aufgabe zu lernen?<br />
� Wie ist die Vergessenkurve für die Anwendung nach einer<br />
bestimmten Zeit (Tagen, Wochen, Monaten)?<br />
Subjektive Zufriedenheit sollte zudem erfragt und dokumentiert werden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 467
Durchführung 4/4<br />
Bemerkungen:<br />
Messgrößen:<br />
� Strecke: Welche Strecke wird mit der Maus zurückgelegt wird?<br />
� Zeit: Wie lange dauert es, um eine Aufgabe zu lösen<br />
� Anzahl: Wie viele Klicks werden benötigt, um eine Aufgabe zu lösen?<br />
Auch kleine und mittelgroße Projekte können erheblich von<br />
Evaluationstests profitieren!<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 468
Usability Test im Rahmen des Praktikums<br />
� Usability Test aktiv mit definiertem Aufwand einsetzen<br />
� Tester und Testgegenstand (Getestete) festlegen<br />
� Konzept & Entwurf formal überprüfen<br />
Szenario, Use Case, Screen Diagramme, Workflow, Dokumentation/javadoc<br />
� Applikationsspezifische Merkmale überprüfen<br />
Persistenz, Abbruchmöglichkeiten, Verknüpfung mit Anwendungsobjekten,<br />
Unterstützung versch. Benutzergruppen<br />
�� GUI<br />
Übersichtlichkeit, Benutzerführung, Konsistenz, Erwartungskonformität,<br />
Dynamisches Layout, komplexe Komponenten, …<br />
� Besonderheiten<br />
Freier Kommentar<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 469
Beispiele:<br />
�Direkte �Direkte Manipulation (Drag&Drop)<br />
�Auto-Ergänzung<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling
Ziel: intuitive, problemorientierte Bedienung<br />
Beispiele:<br />
�� Ballerspiel<br />
Meist aufwändiger<br />
�<br />
�<br />
Drag&Drop im Windows Explorer<br />
Textblock verschieben in Textverarbeitung<br />
zu programmieren<br />
als Menüs+Dialoge!<br />
� Größenänderung und Platzierung in Zeichenwerkzeugen<br />
� Pinsel, Radierer etc. in Malprogrammen<br />
� Veranstaltung verschieben im Stundenplan<br />
� Verschieben einer Datei auf eine Fläche: Inhalt anzeigen/Datei öffnen<br />
� i.d.R. mit der Maus; feinmotorisch anspruchsvoll<br />
� "Feinarbeit" bei Bedarf mit Pfeil-Tasten<br />
� Manipulation und Visualisierung hängen eng zusammen<br />
(� dynamische Interaktion)<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 471
Drag&Drop<br />
� Wie der Entwurf eines (größeren) Programms zunächst erst konzipiert/geplant<br />
werden muss genauso ist es notwendig komplexe/zusammengesetzte Dialoge<br />
zu modellieren.<br />
� Besonders geeignet zur Dialogmodellierung sind Zustandsdiagramme bzw. -<br />
graphen. Dabei können die einzelnen Programm- bzw. Dialogzustände als<br />
Knoten beschrieben werden, und alle Übergänge werden als Kanten<br />
dargestellt, die durch Ereignisse ausgelöst werden.<br />
Für eine Drag&Drop-Interaktion bedeutet das:<br />
� Sobald ein Objekt ausgewählt wurde und der Mausknopf gedrückt bleibt, kann<br />
das Objekt verschoben werden. Wird der Mausknopf wieder losgelassen, soll<br />
der Inhalt des Objektes (=Datei) dargestellt werden.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 472
Zustandsdiagramme<br />
� Die unterschiedlichen Zustände<br />
und Übergänge können<br />
wie folgt beschrieben werden<br />
(weitere Übergänge sind<br />
vorstellbar; sie werden aber<br />
nicht benötigt):<br />
Objekt bewegen<br />
z1 z2 z3<br />
Objekt auswählen<br />
Objekt im Ziel loslassen<br />
Zustand Ereignis Folgezustand: Aktionen<br />
z1 (start) Maustaste wird gedrückt und<br />
Objekt ausgewählt<br />
z2: Objekt ausgewählt<br />
kein Objekt ausgewählt z1<br />
z2 Objekt bewegen<br />
Objekt im Ziel loslassen<br />
z2: neue Position setzen; neu zeichnen<br />
z3 Objekt im Ziel z3: anwendungsspezifische Aktion:<br />
Datei lesen, ..., „Aufräumen“,<br />
z1: Ausgangszustand<br />
z3<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 473
Aufgabe<br />
Mit dem Loslassen des<br />
Objektes werden<br />
Dateiattribute und<br />
der Dateiinhalt zeilenweise<br />
in die JTextArea geschrieben.<br />
Über eine JTextArea-Instanz sollen<br />
Objekte (z.B. Icons) gezogen werden<br />
können.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 474
Realisierung: JTextArea als Zielbereich<br />
public class DropTest extends JFrame<br />
{<br />
DropTarget dt;<br />
JTextArea ta;<br />
public DropTest() // alles erzeugen und in Anfangszustand versetzen<br />
{<br />
super ("Drag&Drop Test");<br />
this.setSize(400,300);<br />
setDefaultCloseOperation (EXIT_ON_CLOSE);<br />
ta = <strong>new</strong> JTextArea();<br />
this.getContentPane().add(ta, BorderLayout.CENTER);<br />
dt = <strong>new</strong> DropTarget(ta, <strong>new</strong> MyDropListener(ta)); // Ziel ist die TextArea<br />
this.setVisible(true);<br />
}<br />
public static void main (String args[])<br />
{<br />
<strong>new</strong> DropTest();<br />
}<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 475
Drag&Drop interfaces<br />
interface DropTargetListener<br />
{<br />
public void dragEnter (DropTargetDragEvent dte) { }<br />
public void dragExit (DropTargetEvent dte) { }<br />
public void dragOver (DropTargetDragEvent dtde) { }<br />
public void dropActionChanged (DropTargetDragEvent dtde) { } // move/copy<br />
public void drop (DropTargetDropEvent dtde) { }<br />
}<br />
...<br />
interface DropSourceListener<br />
{<br />
public void dragEnter (DragSourceDragEvent dsde) { }<br />
public void dragOver (DragSourceDragEvent dsde) { }<br />
public void dragExit (DragSourceEvent dse) { }<br />
public void dropActionChanged (DragSourceDragEvent dsde) { } // move/copy<br />
public void dragDropEnd (DragTargetDropEvent dsde) { } // Benachrichtigung<br />
}<br />
...<br />
interface dragSourceMotionListener<br />
{ public void dragMouseMoved (DragSourceDragevent dsde) {} }<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 476
Realisierung: Dynamische Interaktion<br />
Interface DropTargetListener realisieren:<br />
class MyDropListener implements DropTargetListener<br />
{<br />
JTextArea ta;<br />
DropListener (JTextArea ta)<br />
{<br />
super();<br />
this.ta = ta;<br />
}<br />
public void dragEnter (DropTargetDragEvent dte) {...}<br />
public void dragExit (DropTargetEvent dte) {...}<br />
public void dragOver (DropTargetDragEvent dtde) {...}<br />
public void dropActionChanged (DropTargetDragEvent dtde) {...}<br />
public void drop (DropTargetDropEvent dtde) {...} // entscheidendes Ereignis<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 477
public void drop (DropTargetDropEvent dtde) {...} (I)<br />
Interface DropTargetListener realisieren:<br />
public void drop (DropTargetDropEvent dtde)<br />
{<br />
System.out.println (dtde.getSource());<br />
try<br />
{<br />
Transferable tr = dtde.getTransferable();<br />
DataFlavor[] flavor = tr.getTransferDataFlavors();<br />
for (int i = 0; i < flavor.length; i++)<br />
{<br />
// genutzt zum Übertragen von Datei von und nach Java: java.util.List<br />
ta.append(flavor[i].getMimeType().toString()+"\n");<br />
if (flavor[i].isFlavorJavaFileListType())<br />
{<br />
dtde.acceptDrop(DnDConstants.ACTION_COPY);<br />
java.util.List list = (java.util.List) tr.getTransferData(flavor[i]);<br />
DataInputStream br;<br />
String line = null;<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 478
public void drop (DropTargetDropEvent dtde) {...} (II)<br />
for (int j=0; j < list.size(); j++) // da sind u.U. mehrere Objekte!<br />
{<br />
ta.append(list.get(j) + \n"); // Dateiname<br />
DataFlavor bestTextFlavor = DataFlavor.selectBestTextFlavor(flavor);<br />
ta.append ("bestTextFlavor: "+bestTextFlavor+"\n"); // Empfehlung für Font<br />
}<br />
}<br />
FileInputStream fis = <strong>new</strong> FileInputStream (list.get(j).toString());<br />
br = <strong>new</strong> DataInputStream (fis);<br />
line = br.readLine(); // Zeile aus Datei lesen<br />
while (line != null)<br />
{<br />
ta.append(line+"\n"); // Zeile einfügen<br />
line = br.readLine(); // Versuch, nächste Zeile zu lesen<br />
}<br />
ta.append ("-----------------\n");<br />
}<br />
}<br />
dtde.dropComplete(true); // Erfolg melden<br />
}<br />
catch (Exception e) { System.out.println (e); }<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 479
Auto-Ergänzung (1/2)<br />
� Auch bei dem Beispiel machen wir uns zunächst deutlich, was wir erreichen<br />
möchten:<br />
� Durch das automatische Vervollständigen eines Wortes<br />
(z.B. Befehls oder Namens) soll die Eingabe der Benutzerin/des Benutzers<br />
sicherer und schneller gemacht werden;<br />
bei langen Begriffen werden zu dem Fehler durch Verschreiben vermieden<br />
�� Das ist ein Beispiel, bei dem die Eingabe nicht erst mit dem RETURN überprüft<br />
und weiterverarbeitet wird, sondern mit jedem Zeichen betrachtet wird<br />
(Zwischenzustände spielen eine Rolle).<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 480
Auto-Ergänzung (2/2)<br />
� Beispiel:<br />
für den Anfangsbuchstaben ‘w‘ stehen die folgenden Wörter zu<br />
Verfügung:<br />
"wiedling", "wiesmann"<br />
� ‘wies‘ wird ergänzt zu wiesmann ,<br />
� ‘wied‘ wird ergänzt zu wiedling<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 481
Realisierung (1/3)<br />
class AutoFill extends PlainDocument {<br />
private String[] terms;<br />
String eMail[] = { "hahn", "kreling", "wiedling", "wiesmann"<br />
};<br />
private JTextField Recognizer;<br />
public AutoFill(AutoFillField aRecognizer) {<br />
super();<br />
this.Recognizer = aRecognizer;<br />
this.terms = eMail;<br />
}<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 482
Realisierung (2/3)<br />
public void insertString(int offs, String str, AttributeSet a)<br />
throws BadLocationException {<br />
String input, begriff;<br />
input = Recognizer.getText(0, offs) + str;<br />
}<br />
// best match suchen<br />
begriff = "";<br />
for (int i = 0; i < terms.length; i++)<br />
if (terms[i].startsWith(input)) begriff = terms[i];<br />
// no match, dann bleibt der input<br />
if (begriff.matches("")) begriff = input;<br />
// alten Text entfernen insertString<br />
super.remove(0, Recognizer.getText().length());<br />
// neuen Text einfügen<br />
super.insertString(0, begriff, a);<br />
// Differenz markieren<br />
Recognizer.select(offs + 1, Recognizer.getText().length());<br />
}<br />
an Erfordernisse<br />
anpassen<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 483
Realisierung (3/3)<br />
class AutoFillField extends JTextField {<br />
}<br />
public AutoFillField(int cols) {<br />
}<br />
super(cols);<br />
protected Document createDefaultModel() {<br />
}<br />
...<br />
return <strong>new</strong> AutoFill(this);<br />
AutoFillField ta;<br />
ta = <strong>new</strong> AutoFillField(10);<br />
ta.setText("AutoFillField");<br />
autoErgänzung<br />
anwenden<br />
spez. Document<br />
verwenden<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 484
ENDE.<br />
<strong>Fachbereich</strong> <strong>Informatik</strong>: 3. Semester Bachelor Studiengang<br />
Prof. Dr.-Ing. Hans-Peter Wiedling<br />
Seite 485