Universität Stuttgart Institut für Visualisierung und Interaktive Systeme Fachpraktikum Graphische Benutzungsoberflächen Aufgabe 2: Notenrechner (Java) Harald Bosch, Mark Giereth, Christiane Taras In dieser Aufgabe werden Sie einen Notenrechner in Java* entwickeln. Dieser Notenrechner soll aus den Noten einzelner Prüfungen eine Gesamtnote errechnen können und aus einer angestrebten Gesamtnote und zugehörigen Teilnoten auch eine noch offene Teilnote berechnen können. Um die hierarchische Struktur der Noten gut abbilden zu können wird ein JXTreeTable verwendet. Die eingegebenen Prüfungsdaten sollen in XML-Dateien gespeichert werden und wieder aus diesen Dateien gelesen werden können. Dabei arbeiten Sie mit objektorientierten Entwurfsmustern, wie das ModelView-Controller (MVC) oder das Beobachter Muster, die in Swing allgegenwärtig sind. Sie implementieren Routinen zur EventBehandlung, um beispielsweise auf Benutzereingaben mit der Maus zu reagieren. Wichtige Lernziele sind unter anderem Swing Event Handling Objektorientierte Entwurfsmuster XML-Behandlung in Java Bearbeitungszeit: 3 Wochen Java Im Gegensatz zu herkömmlichen kompilierten Programmiersprachen, erzeugt der JavaCompiler so genannten Bytecode. Damit dieser ausgeführt werden kann, führt nach der Übersetzungsphase ein Java Laufzeitumgebung, die Java Virtual Machine (JVM), den Bytecode aus. Mit dem Java Development Kit (JDK) lassen sich Java Programme entwickeln. Dem JDK sind Hilfsprogramme beigelegt, die für die Java-Entwicklung nötig sind, z.B. der Java Compiler javac, ein Programm zum Testen von Java Applets, appletviewer, oder ein Tool zum Generieren von HTML Seiten aus Programmkommentaren, javadoc. Beim Java Runtime Environment (JRE) ist nur die JVM zusammen mit den nötigen Bibliotheken gebündelt, für alle diejenigen, die JavaProgramme nur laufen lassen möchten und keine Entwicklungstools benötigen. Eclipse Die Entwicklungsumgebung Eclipse unterstützt einige Aufgaben im Entwicklungsprozess und bietet eine graphische Oberfläche hierfür. Eclipse ist selbst zum größten Teil in Java programmiert und benötigt mindestes eine JRE in der Version 1.4. Weiter Informationen zu Eclipse erhalten Sie unter http://www.eclipse.org Abb. 1 Oberfläche des Notenrechners * Ein Beispiel-Projekt in Eclipse Um mit Eclipse arbeiten zu können, müssen Sie zunächst ein neues Java Projekt anlegen (File|New|Java Project). Geben Sie ihrem Projekt im nachfolgend angezeigten Dialog einen Namen und bestätigen Sie mit Finish. Es wird ein neues Verzeichnis in ihrem Workspace eingerichtet, das aller Dateien zum Projekt enthält. http://java.sun.com/ 1 * */ public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } } Abb. 2 New Project Wizard Als Ergebnis sehen Sie im Package Explorer Tab folgenden Eintrag (Test ist hier der Name des Projekts): Legen Sie nun ihr erstes Java Programm an. Erzeugen Sie eine neue Klasse, indem Sie im Kontextmenü (Rechtsklick auf src Eintrag) New|Class auswählen. Es erscheint folgender Dialog: Fügen Sie in der main-Methode folgende Zeile ein: System.out.println("Hallo FaPra"); und speichern Sie. Speichern löst automatisch eine Neukompilierung aus (sofern der Menüpunkt Project|Build Automatically aktiviert ist). Starten Sie nun das Programm, indem Sie im Kontextmenü (Rechtsklick auf Main.java) Run As| Java Application auswählen. Es sollte eine Ausgabe („Hallo FaPra“) in einem Tab erfolgen, das den Namen Console hat. Sofern Sie noch keine Erfahrung mit der Programmierung in Java haben, sollten Sie sich per Tutorien und Bücher in das Thema einlesen. Gute Ausgangspunkte sind [1], [2] und [3]. Dokumentation zu allen Klassen die Teil der Java-API sind können unter [4] eingesehen werden. Java Swing Abb. 3 New Class Wizard Geben Sie als Package fapra.diagram an und als Name der Klasse Main. Bitte stellen Sie alle weiteren von Ihnen entwickelten Klassen in dieses Package. Die Main Klasse dient Ihnen später zum Starten der Anwendung. Selektieren Sie die Optionen wie oben ersichtilich. Das Ergebnis ist der folgender Java Code: package fapra.diagram; /** * @author In Java existieren zwei Toolkits zur Realisierung von Benutzungsoberflächen. Einerseits das schwergewichtige* AWT und das leichtgewichtige Swing. In dieser Aufgabe wird vor allem Swing [3] eingesetzt. Swing verwendet den Window Manager des Betriebssystems nur zur Realisierung der Top-Level Fenster und verwaltet den gesamten Grafikkontext eines Fensters selbst. Dokumentationen zu allen Klassen können leicht im Web gefunden werden (z.B. „Java Swing Jtree“ suchen). Baum-Ansichten in Java Swing Ein zentrales Element des Notenrechners ist die Baum-Ansicht, in der die verschiedenen Prüfungen hierarchisch dargestellt und verwaltet werden. Java Swing stellt zwar eine Komponente zur Darstellung eines Baums zur Verfügung * schwergewichtig im Sinne der GIS-Vorlesung 2 (JTree), diese kann aber nicht wie die QTreeView in QT weitere Eigenschaften der Knoten in einer Tabelle darstellen. Für diese Aufgabe verwenden wir daher die * † JXTreeTable aus der SwingX-Bibliothek von Swinglabs. Die Anzeige des Baums kann direkt genutzt werden, während die Datenstruktur dahinter an die Anforderungen der Anwendung angepasst werden sollte. Die Kommunikation zwischen der Ansicht und dem Datenmodel ist im Programmskelet bereits vollständig implementiert. Lediglich die Methoden zum Einfügen, Löschen und Verändern von Knoten müssen im Datenmodel noch erstellt oder erweitert werden. Allgemein Das Programmskelett für diese Aufgabe steht in Form eines Eclipse Projects zur Verfügung. Importieren Sie zunächst dieses Projekt in ihren Eclipse Workspace. Im Skelet enthalten sind insbesondere folgende Dateien: Main.java enthält die main()Methode zum Starten des Notenrechners. VisJMarkCalc.java realisiert das Hauptfenster. Hier sind das Aussehen und das Verhalten beschrieben. Es verwendet ein JXTreeTable um die Daten anzuzeigen, ein MarkTreeModel um die Daten zu verwalten und Actions um das Verhalten zu definieren. Die im Notenrechner eingetragenen Daten sollen in XML-Dateien gespeichert werden, die die Prüfungen genauso hierarchisch verwalten können, wie die Baum-Ansicht. MarkTreeModel.java: verwaltet die Knoten, und ihre Attribute, des Prüfungsrechners. Das Model im Sinne von MVC. Falls Sie XML noch nicht kennen, dann informieren Sie sich darüber, z.B. auf der Seite http://de.selfhtml.org/xml/intro.htm. Im Hauptverzeichnis für diese Aufgabe finden Sie die Datei „MarkCalc.xsd“. Diese Datei beschreibt den Aufbau der XML-Dateien, die vom Notenrechner geschrieben und gelesen werden können sollen. MarkNode.java ist ein Element des MarTreeModels. Diese Klasse muss nicht verändert werden. XML‡ und XSD§ Machen Sie sich mit Hilfe der Seite http://www.usegroup.de/software/xmltutorial /schema.html mit den Elementen in der XSDDatei vertraut. Die Qt-Entwicklungsumgebung bringt schon sehr viele nützliche Klassen zur Verarbeitung von XML-Daten mit. Lesen Sie hierzu den Abschnitt „QtXml Module“ im Qt Assistant. Entwicklung des Notenrechners In diesem Abschnitt sollen Sie den Notenrechner, dessen Skelett Ihnen bereits vorgegeben ist, fertig implementieren. * http://download.java.net/javadesktop/ swinglabs/releases/0.8/docs/api/org/jdesktop/ swingx/JXTreeTable.html † Der Diagramm-Editor soll eine Menüleiste (JMenuBar), eine Werkzeugleiste (JToolBar) und einen Inhaltsbereich – eine von Ihnen entwickelte und von JComponent abgeleitete Komponente – innerhalb eines Hauptfensters (JFrame) besitzen und wie folgt aussehen: Das Hauptfenster Das Hauptfenster einer Swing Anwendung ist ein JFrame. Die gegebene Klasse VisJMarkCalc erbt von JFrame und wird bereits von der Main-Klasse instanziiert. Nach der Initialisierung wird angegeben welche Aktion ausgeführt werden soll, wenn das Fenster geschlossen wird (unter Windows das rote X rechts oben). In unserem Fall soll zunächst die Anwendung beendet werden. Dieses Verhalten kann später abgefangen werden, um ein versehentliches Beenden der Anwendung zu vermeiden. Es wird anschließend die Fenstergröße auf den Inhalt angepasst und das Fenster angezeigt, indem der Status auf visible=true gesetzt wird. Swing Fenster sind hierarchisch angeordnet wie folgende Abbildung zeigt: https://swingx.dev.java.net/ ‡ XML = Extensible Markup Language § XSD = XML Schema Definition 3 Abb. 4 Fensterhierarchie (Quelle: [3]) Fügen Sie das bereits vorhandene, rudimentäre Menü (createMenuBar())und die Toolbar(createToolbar()) in den Frame ein. Achten Sie dabei darauf, dass Sie dem LayoutManager mitteilen wie er die Toolbar zu platzieren hat, und dass das Menü, wie in Abb. 4 zu sehen, außerhalb der Content Pane liegt. Als nächstes sollten Sie in der createButtons() Methode zwei Köpfe erstellen und entsprechen Abb. 1 platzieren. ActionListener und Action Die Ereignisbehandlung von Buttons und davon abgeleiteten Kombonenten wie Menu Items, etc. wird in Swing durch ActionListener realisiert. Jede von Abstract Button abgeleitete Komponente, besitzt die Möglichkeit ActionListener Instanzen zu registrieren. Im folgenden Beispiel wird ein ActionListener für einen Button registiert (wie hier i.d.R. implementiert als anonyme Klasse). Wird der Button geklickt, so wird "clicked" ausgegeben. JButton b = new JButton("click me"); b.addActionListener(new ActionListener() { public void actionPerformed( ActionEvent e) { System.out.println("clicked"); } }); Im unserer Anwendung soll zur Implementierung der Ereignisbehandlung das Action Interface verwendet werden. Dieses Interface erweitert das ActionListener Interface, indem es das Setzen und Auslesen von Eigenschaften wie Name, Icon, Tooltip, etc. bereitstellt. Als Erweiterung von ActionListener muss auch die actionPerformed(Action Event) Metode implementiert werden. Im Skelett sind bereits die Aktionen für „New“ und „About“ als Beispiel unter Verwendung der abstrakten Klasse AbstractAction angegeben. Die Verwendung von Action ist insbesondere dann hilfreich, wenn mehrere unterschiedliche Möglichkeiten zum Triggern einer Funktion bereitgestellt werden, wie dies beispielsweise in Hauptmenü, Werkzeugleiste, Kontextmenü oder durch Tastaturkürzel der Fall ist. Unterschiedliche Komponenten (wie JButton, JMenuItem, etc.) können dieselbe Action referenzieren. Die Eventbehandlung kann dadurch an zentraler Stelle erfolgen und Beschreibung, Icon, Tooltip etc. müssen nicht jedes Mal angegeben werden, sondern werden aus der gemeinsamen Action-Instanz gelesen. Hinweise: Bitte informieren Sie sich über die Verwendung anonymer Klassen zur Implementierung von Eventhandlern Menü- und Werkzeugleiste Im Kommentar zu createMenuBar() sind alle möglichen Aktionen aufgelistet. Erweitern Sie createActions() um entsprechende ActionInstanzen (noch ohne Funktionalität). Verwenden Sie dabei bitte sinnvolle, im Programmskelett mitgelieferten, Icons. Füllen Sie mit diesen Actions das Menü und die Toolbar, und passen Sie ihre Buttons an, damit diese um ebenfalls auf denselben Aktionen arbeiten. Da die beiden Aktionen zum Hinzufügen und Löschen von Einträgen sehr wichtig für das Programm sind, sollen diese in der Toolbar und dem Menü leichter zu finden sein. Fügen Sie dazu einen Trenner (Separator) vor den beiden Aktionen ein. Funktionalität hinzufügen Das bisher Beschriebene behandelte im Wesentlichen das Beschreiben des Aussehens. Im Folgenden wird nun die Funktionalität des von Ihnen zu entwickelnden Noten-Rechners beschrieben. Dazu werden Sie vor allem die actionPerformed()-Methoden der Actions und die Methoden im MarkTreeModel anpassen müssen. Prüfungen einfügen, bearbeiten und löschen Vervollständigen Sie die Methoden „addNode“, „deleteNode“, und „setValueAt“ in MarkTreeModel so, dass die folgenden Anforderungen erfüllt sind: 4 Die Prüfungen sollen vom Benutzer des Notenrechners selbst angelegt und auch wieder gelöscht werden können. Die Prüfungen sollen in beliebiger Tiefe geschachtelt werden können, so dass die Notenberechnung über mehre Ebenen stattfinden kann. Neue Prüfungen sollen jeweils als Kindknoten der aktuell ausgewählten Prüfung angelegt werden. Ist keine Prüfung ausgewählt, so soll die neue Prüfung als Kindknoten die Baum-Wurzel angelegt werden. Zu jeder Prüfung sollen der Prüfungsname, die in der Prüfung erreichte Note und die Wertigkeit der Prüfung erfasst werden können. Der Prüfungsname kann ein beliebiger Text sein. Die Note soll als positive, reelle Zahl erfasst werden und zwischen MIN_MARK und MAX_MARK liegen. Noten wie 2+, 2-, B und „gut“ können außer Acht gelassen werden. Die Wertigkeit einer Prüfung gibt an, mit welchem Anteil die Prüfungsnote in die Note der übergeordneten Prüfung einfließt. Die Eingabe der Wertigkeit soll möglichst frei gestaltet sein, so dass z.B. bei drei Prüfungen, die laut Prüfungsordnung im Verhältnis 1:1:4 zu einer Note zusammengerechnet werden, dies auch so eingegeben werden kann (also: Wertigkeit für Prüfung 1 = 1, Wertigkeit für Prüfung 2 = 1, Wertigkeit für Prüfung 3 = 4). Allerdings brauchen auch für die Wertigkeit nur positive, reelle Zahlen in Betracht gezogen werden. Eingabe und Änderung von Prüfungsnamen, Noten und Wertigkeiten soll direkt in der Baum-Ansicht möglich sein. Wird ein ungültiger Wert eingegeben, so soll eine passende Benutzerinformation erscheinen und der Wert auf den vorherigen zurückgesetzt werden. Bevor eine Prüfung wirklich gelöscht wird, soll eine aussagekräftige Sicherheitsabfrage angezeigt werden, sodass der Benutzer die Möglichkeit hat, das Löschen der Prüfung noch abzubrechen. Die Wurzel des Baumes darf natürlich in keinem Fall gelöscht werden. Wurde vor Anstoßen der Löschen-Aktion keine Prüfung ausgewählt, soll eine passende Benutzerinformation erscheinen. Wichtiger Hinweis: Das MarkTreeModel hat keine Möglichkeit die aktuell ausgewählte Prüfung zu identifizieren. Sie sollten also in der actionPerformed() Methode bereits den JXTreeTable nutzen um den selektierten Knoten aus der Hierarchie-Spalte zu holen. Noten berechnen Der Notenrechner soll zwei mögliche Notenberechnungen erlauben: 1. Berechnung einer Gesamtnote aus den Noten und Gewichtungen der untergeordneten Noten 2. Berechnung einer Teilnote anhand der (gewünschten) Gesamtnote (nur direkter Vaterknoten) und der Noten und Gewichte der schon gesetzten Teilnoten. Um die Verwaltung von unbenoteten Scheinen zu ermöglichen, soll der Notenrechner Teilnoten mit der Gewichtung 0 (oder ohne gesetzte Gewichtung) bei der Notenberechnung ignorieren. Die Berechnung soll auch über Hierarchiestufen hinweg funktionieren. Das heißt, wenn alle Noten in der untersten Hierarchiestufe und alle Gewichtungen gesetzt sind, soll durch einen einzigen Klick die Gesamtnote in der obersten Hierarchiestufe (und dadurch alle untergeordneten Noten) berechnet werden können. Genauso soll im Szenario 2 bei nicht gesetzten Teilnoten, zu denen allerdings eine Gewichtung angegeben wurde, versucht werden, diese aus ihren untergeordneten Prüfungen zu berechnen (sofern solche existieren). Treten während den Berechnungen Fehler auf, z.B. wenn im 1. Berechnungsszenario für keine der Kindprüfungen sowohl Note als auch Gewichtung definiert wurden oder im 2. Berechnungsszenario keine Gesamtnote angegeben ist, so soll dies dem Benutzer mitgeteilt werden. Falls im 2. Berechnungsszenario die gewünschte Gesamtnote nicht mehr erreichbar ist, so soll dem Benutzer die schlechteste und beste noch erreichbare Note mitgeteilt werden. Prüfungen ohne Noten oder Gewichtungen sollen bei den Berechnungen ignoriert werden. Vervollständigen sie die öffentlichen und privaten Methoden „calculateMarkFromChildren“ und „calculateMarkFromParent“ entsprechend den oben beschriebenen Anforderungen. Datei speichern und laden Die im Notenrechner eingetragenen Prüfungen sollen über die DOM-Schnittstelle in XML-Dateien gespeichert und aus diesen wieder gelesen werden können. Der Pfad der XML-Datei soll vom Benutzer selbst bestimmt 5 werden können (JFileChooser). Damit die aktuellen Daten aus der Baum-Ansicht über ein DOM in die XML-Datei gespeichert werden können, müssen Sie die Methode „writeDOM“ erweitern um die Prüfungen zu traversieren und in einem DOM zu speichern. Anschließend serialisieren Sie den DOM in eine XML Datei (z.B. mit dem LSSerializer). Zum Parsen einer zuvor gespeicherten Datei können Sie den DocumentBuilder nutzen und anschließend das DOM traversieren um das MarkTreeModel aufzubauen. Erweitern Sie dafür die Methode „readDom“. Denken Sie dabei auch an passende Benutzerhinweise. Fügen Sie in die verwendeten DateiAuswahl-Dialoge jeweils einen Filter für XMLDateien ein. Programm-Information Ein Programm sollte immer Hinweise über den Entwickler bzw. Hersteller geben. Im Notenrechner gibt es dafür einen Menüpunkt „Info“ unter dem man einen „About-Dialog“ öffnen kann. In diesem steht allerdings noch nicht viel drin. Gestalten Sie den About-Dialog mit Hilfe von HTML-Tags so, wie in Abbildung 3. Informationen über die verwendbaren HTMLTags finden Sie im Qt Assistant im Abschnitt „Supported HTML Subset“. möglichen Sie die Angabe einer Sprache (Locale) als Argument beim Programmstart. Literatur [1] Christian Ullenboom: „Java ist auch eine Insel“, Aufl. 6, Galileo Computing, 2007, erhältlich als eBook unter: http://www.galileocomputing.de/ openbook/javainsel6/ [2] Sharon Zakhour et al.: „The Java Tutorial“, Prentice Hall, 2006, erhältlich als eBook unter: http://java.sun.com/docs/books/ tutorial/ [3] The Swing Tutorial: http://java.sun.com/docs/books/tutorial/ uiswing/index.html [4] Java Platform Standard Edition 6 API: http://java.sun.com/javase/6/docs/api/ [5] Java Internationalisierungs-Tutorial von Sun: http://java.sun.com/docs/books/tutorial/i 18n/index.html Programmierrichtlinien Bitte halten Sie sich beim Programmieren an die nachstehenden Richtlinien – die Richtlinienkonformität geht in die Bewertung Ihrer Lösung mit ein! Bitte halten Sie sich an die Java Code Conventions! Sie finden sie unter diesem Link: http://java.sun.com/docs/codeconv/ Sprache Kommentare und sämtliche Bezeichner sind in Englisch verfassen. Zeilenlänge und Einrückung Abb. 5 About-Dialog des Notenrechners Internationalisierung Internationalisierung ist heutzutage ein wichtiger Schritt bei der Programmentwicklung. In Java werden lokalisierte Ressourcen, wie Zeichenketten, über sogenannte Property Dateien bereitgestellt. Machen Sie von den Internationalisierungs-Mechanismen[5] in Java Gebrauch. Externalisieren Sie GUI-relevante Strings in ein ResourceBundle (Eclipse bietet hierfür einen Wizard an), übersetzen sie das Property-File in eine andere Sprache und er- Die Zeilenlänge darf 80 Zeichen nicht überschreiten. Die Einrückungstiefe beträgt vier Leerzeichen. Kurze Kommentare Kurze Kommentare dienen zur Verbesserung der Lesbarkeit des Codes: if (a == 2) { return TRUE; // special case } else { return isPrime(a); /* works only for odd 'a' */ } 6 Der ersten Kommentar sollte beispielsweise nicht lauten: /* if a=2 then return true */. Klassen-, Methoden- und Attributkommentare Verwenden Sie die Javadoc Kommentare für Klassen, Attribute und Methoden. Wenn Sie über einer Deklaration „/**“ eingeben, erzeugt Eclipse ein Dokumentationsskelett automatisch. Bei Methoden sind die Parameter zu erklären (vorausgehende @param Anweisung). Weitere Informationen zu Javadoc finden Sie unter: http://java.sun.com/j2se/javadoc/writingdocc omments/index.html /** * Adds a new method to this model. * @param modifiers values are +,#,* @param name name of the method * @param params method parameters * @param returnType type of the object returned by the method * @return the new String */ public String addMethod(String modifiers, String name, String[] params, String returnType) {... Namenskonventionen Generell: Bitte „CamelCase“ verwenden, zum Beispiel CamelCaseLooksLikeThis. Klassen und Interfaces: Einfache Substantive in UpperCamelCase. Methoden und Attribute: Einfache Verben oder sprechende Bezeichnungen, in lowerCamelCase. Variablen: Möglichst kurze „sprechende“ Bezeichnungen in lowerCamelCase. Konstanten: Großbuchstaben mit „_“ als Worttrennzeichen wie zum Beispiel static readonly int MAX_WIDTH = 100; 7 Fragenkatalog Sie müssen mindestens die Hälfte der folgenden Fragen richtig beantworten, um das Fachprktikum erfolgreich abzuschließen. Eine Frage gilt dann als richtig beantwortet, wenn genau die richtigen Antworten markiert sind. Es können beliebig viele Antworten pro Frage richtig sein, also auch keine oder alle. Java 1. Bei welchen der folgenden Swing-Klassen handelt es sich um „top-level container“? javax.swing.JPanel javax.swing.JDialog javax.swing.Jframe 2. Wie heißt diejenige abstrakte Klasse, die alle Klassen, welche graphisch auf dem Bildschirm repräsentiert werden können, erweitern? java.awt.Container java.awt.Window javax.swing.JComponent java.awt.Component 3. Wie wird das Layout von graphischen Objekten, die wiederum weitere graphische Objekte enthalten können, in Java festgelegt? Mit Hilfe sogenannter „Layout Manager“. Per Konvention. Indem für jede graphische Komponente die anderen hinzugefügt wird direkt die Position in Pixelkoordinaten relativ zum entsprechenden Container angegeben wird. 4. Welche Bedeutung hat die Angabe des sogenannten „Classpath“ für die Java Virtual Machine? Er legt fest wo der „Class Loader“ nach Klassen und Paketen suchen soll. Über den Classpath wird angegeben wohin Klassen per default serialisiert werden sollen. Der Classpath klassifiziert JavaBiliotheken nach den ihnen zugewiesenen Sicherheitsrichtlinien. 5. Durch Implementierung welcher Schnittstelle (Interface) lässt sich Funktionlität die in Folge unterschiedlicher Benutzer- interaktionen ausgelöst und in verschiedenen Controls zur Verfügung gestellt werden soll, einheitlich zusammenführen? java.awt.event.ActionListener java.awt.event.ActionEvent javax.swing.Action java.awt.event.KeyEvent Eclipse 6. Über welche Tastatenkombination lassen sich in Eclipse markierte Code-Zeilen einbzw auskommentieren (Ctrl = Strg)? Ctrl-Shift-7 Ctrl-Shift-c Ctrl-Shift-* 7. Über welche Tastatenkombination lassen sich in Eclipse die Import-Statements „aufräumen“ (Ctrl = Strg)? Ctrl-Shift-i Ctrl-Shift-o Ctrl-Shift-! 8. Über welche Menüs/Controls lässt sich in Eclipse die „Java Perspective“ laden Window/OpenPerspective/(other/)Java „Open perspective“-Button auf der Toolbar Shortcut Button für die „JavaPerspective“, wenn diese bereits zufor geöffnet war. Allgemeines 9. MVC steht im Kontext dieser Aufgabe für: Model-view-controller Multi-view-coordinator Multi-variant-connector XML und XSD 10. Wie lautet die Adresse der offiziellen Webseite für XML? http://www.w3.org/XML/ http://de.selfhtml.org/xml/intro.htm http://de.wikipedia.org/wiki/Extensibl e_Markup_Language 11. Welches XSD-Konstrukt definiert eine Auswahl möglicher untergeordneter Tags? maxOccurs="unbounded" <xsd:choice> <xsd:complexType> 8 Bewertungskriterien Punkte Der komplette Quellcode ist standardkonform und objektorientiert. Er enthält keine offensichtlichen Speicher- und Ressourcenlecks oder offensichtlich semantisch falsch verwendete Sprachkonstrukte. 1 Das Programm ist in sinnvoller Weise dokumentiert, insbesondere existieren Javadoc Kommentare für alle Klassen, Methoden und Attribute. 1 Das Programm lässt sich ohne Speicherschutzverletzungen, Exceptions oder andere Laufzeitfehler im VISGS-Pool ausführen. Das Programm befolgt die Programmierrichtlinien. Es lässt sich im VISGS-Pool mit den vorgegebenen Compiler-Einstellungen fehler- und warnungsfrei übersetzen. 1 Javadoc HTML Seiten wurden erstellt. 1 Es gibt ein Menü, eine Toolbar und zwei Buttons die alle Programmfunktionen anbieten. Auswählbare Funktionen in Menü, Toolbar und Kontextmenü haben dieselben Namen, Icons, und Tooltips und beruhen auf Action Objekten. 4 Die Aktionen „New“, „Open“ und „Save“ lassen sich über die Short-Cuts „Strg+N“, „Strg+O“ bzw. „Strg+S“ aufrufen. Alle Aktionen haben Access-Keys (Mnemonics) 1 Über die Aktion „Add“ können hierarchisch verschachtelte Prüfungen angelegt werden. Eine neu angelegte Prüfung erscheint als Kindknoten der aktuell ausgewählten Prüfung bzw. als Kindknoten der Wurzel (wenn keine Prüfung ausgewählt wurde). 2 Die angelegten Prüfungen lassen sich direkt in der Baum-Ansicht editieren, dabei finden Wertprüfungen statt. D.h. für Noten werden nur reelle Zahlen zwischen MIN_MARK und MAX_MARK akzeptiert, für Gewichtungen nur positive reelle Zahlen. Bei Eingabe eines falschen Wertes erfolgt eine aussagekräftige Meldung und der ursprüngliche Wert wird wiederhergestellt. 3 Angelegte Prüfungen können über die Aktion „Delete Node“ gelöscht werden. Vor dem Löschen erfolgt eine sinnvolle Sicherheitsabfrage, über die der Benutzer die Aktion bestätigen oder abbrechen kann. Ist keine Prüfung zum Löschen ausgewählt, erscheint eine passende Meldung. Der Wurzelknoten kann nicht gelöscht werden. Beim Versuch das zu tun, erscheint eine aussagekräftige Meldung. 2 Beide Möglichkeiten der Notenberechnung ermitteln die richtigen Werte und funktionieren über Hierarchie-Ebenen hinweg. Prüfungen ohne Gewichtungen oder Noten werden ignoriert. Im Szenario 2 erscheint eine Fehlermeldung wenn keine Note für die übergeordnete Prüfung angegeben wurde. Im Szenario 1 erscheint eine Meldung, wenn für keine der Kindprüfungen sowohl Gewichtung als auch Note definiert wurden. 4 Die eingegebenen Daten können an einer vom Benutzer gewählten Stelle gespeichert werden. Die gespeicherten Dateien enthalten die richtigen Werte. 3 Wurde eine Datei an eine Stelle gespeichert, so können Änderungen durch die Aktion Speichern wieder in dieselbe Datei geschrieben werden (ohne erneute Pfadauswahl). 0.5 Wird die Aktion Speichern gewählt wenn noch kein Dateipfad festgelegt wurde, erscheint ein Datei-Auswahl-Dialog. 0,5 Die gespeicherten Dateien können wieder geladen werden. 1,5 In den Datei-Auswahl-Dialogen ist ein Filter für XML-Dateien voreingestellt. 0,5 Sind Dateien, die geladen werden sollen, nicht lesbar oder Dateien, die geschrieben werden sollen, nicht schreibbar, erscheinen sinnvolle Benutzerinformationen. Benut- 1 9 zerinformationen erscheinen auch, wenn die zu ladende Datei nicht als DOM geladen werden konnte oder das root-Element nicht den Namen „MarkCalc“ hat. Der Pfad von dem der aktuelle Baum geladen wurde bzw. wohin er zuletzt gespeichert wurde, wird im Wurzelelement angezeigt. 0,5 Der About-Dialog ist ähnlich dem gezeigten Bild gestaltet. 0,5 Die gesamte Anwendung ist in mindestens 2 Sprachen verfügbar (alle Namen, Tooltips, Dialoge, etc.). Die Sprache kann über ein Programmargument umgestellt werden. Die Realisierung beruht auf Resource Bundles. 2 Gesamtpunktzahl 30 10