Login |
 
 

Aufgabe 2, Abgabe spätestens am 20.05.2010, 8:00 Uhr

Einleitung

In dieser Aufgabe sollt ihr eine graphische Benutzeroberfläche (Graphical User Interface = GUI) für die in Aufgabe 1 implementierte Funktionalität erstellen. Dazu verwendet ihr Swing mit Fenstern, Komponenten und ereignisgesteuerter Interaktion. Außerdem lernt ihr das Model-View-Controller Entwurfsmuster kennen.

Nach Möglichekit solltet ihr auf eurer eigenen Lösung aufbauen, d.h. eure Klassen aus Aufgabe 1 verwenden. Zur Sicherheit gibt es im Repository die Lösung zur Aufgabe 1 (ue1-sol.jar).

Teil 1 - Raum Dialog

Erstellt einen Dialog, der es euch ermöglicht, einen Raum anzulegen, d.h. in dem ihr die benötigten Felder eingeben könnt um einen IRoom zu erstellen. Dabei könnt ihr z.B. wie folgt vorgehen:

  1. Erstellt eine Klasse RoomDialog extends JDialog {...}
  2. Fügt diesem Dialog ein Textfeld hinzu, um die Raumnummer eingeben zu können,
  3. dann einen Spinner oder eine andere Komponente eurer Wahl um die Kapazität angeben zu können.
  4. Schließlich benötigt ihr noch einen OK- und einen Cancel-Button.
  5. Benutzt einen LayoutManager eurer Wahl, um den Dialog so zu gestalten, wie er euch gefällt.

Bis jetzt ist der Dialog noch in keinster Weise interaktiv. Überlegt euch, wie ihr den Dialog dazu benutzen könnt, um den Raum tatsächlich dem Manager hinzuzufügen. Dazu ist es sicherlich sinnvoll, den Manager nicht im Dialog zu halten (mehrere Dialoge, neue Instanz des Dialoges, wenn ein neuer Raum erstellt wird, usw.).

Eine Standardlösung für diese Situation ist das sogenannte Model-View-Controller Konzept, indem ein Controller dafür sorgt, dass die Daten aus der GUI-Komponente in das Model gelangen. Schreibt also einen Controller, der den Manager und die GUI-Komponente "kennt". Registriert hier die Listener an euerem Dialog. Dazu muss euer Dialog natürlich Methoden anbieten, um die Felder/Werte auslesen und Listener registrieren zu können.

Wenn der OK-Button geklickt wird, lest die Werte aus den Feldern aus und erstellt einen Raum, den ihr dann dem Manager hinzufügt.

Beim Hinzufügen können natürlich Fehler auftreten (leere Felder, Raum schon vorhanden, etc). Baut in euren Dialog eine Möglichkeit ein, um diese Fehler (die ConstraintViolationException die beim Hinzufügen geworfen wird enthält eine Nachricht) in eurem Dialog anzeigen zu können (beispielsweise mit einem Label).

Mit diesem Dialog könnt ihr nur einen Raum erstellen (denn er sollte sich schließen, wenn ein Raum erfolgreich erstellt wurde). Baut euch also noch einen JFrame, der genau einen Button "Add Room" hat und der dann den Raum-Dialog öffnet.

Testet euren Dialog in dem ihr eine Testklasse schreibt, die in der main-Methode nichts anderes macht als den Controller zu instanziieren und dieser öffnet dann im Konstruktor diesen letzteren Frame.

Teil 2 - Administration GUI

In diesem Teil sollt ihr eine Benutzeroberfläche für das Erstellen, Suchen, Bearbeiten und Löschen von Lehrveranstaltungen, Räumen, Zeiten und Dozenten erstellen. Holt euch dazu die JAR-Datei ue2-2.jar mit den benötigten Klassen und bindet sie in euer Projekt ein.

Damit eine einheitliche Verwaltung möglich ist, passt euren in Aufgabe 2.1 geschriebenen RoomDialog an das Interface ISubDialog<T extends IEntity> an:

package de.unikn.bioml.mpi2.stuvove.implementation.gui;

public class RoomDialog extends JDialog implements ISubDialog<IRoom>{

public RoomDialog(JFrame owner, String dialogTitle, boolean modal){
super(owner, title, modal);
...
}
...
}

Schreibt außerdem einen Dialog um eine Lehrveranstaltung anzulegen

package de.unikn.bioml.mpi2.stuvove.implementation.gui;

public class StudyCourseDialog extends JDialog
implements ISubDialog<IStudyCourse> {

public StudyCourseDialog(
JFrame owner, String dialogTitle, boolean modal) {
super(owner, title, modal);
...
}
}

Dazu sollte man folgendes eingeben können:

  • Titel
  • Beschreibung
  • Typ (Vorlesung, Seminar oder Übung)

    • Bei einer Übung muss die zugehörige Vorlesung angegeben werden.

  • Dozent
  • Raum
  • mehrere Zeiten
  • maximale Studentenzahl

Diesmal müsst ihr keinen eigenen Frame erstellen, der die Buttons enthält, um die Dialoge zu öffnen, sondern sollt den abstrakten AbstractAdministrationFrame implementieren:

package de.unikn.bioml.mpi2.stuvove.implementation.gui;

public class AdministrationFrame extends AbstractAdministrationFrame {...}

Dazu müsst ihr die Buttons erstellen und über die beiden getAddXXXButton()-Methoden bereit stellen (angezeigt werden sie automatisch).

Außerdem stellt der AbstractAdmininstrationFrame die Funktionalität zur Verfügung nach Lehrveranstaltungen, Räumen, Zeiten und Dozenten zu suchen. Ihr sollt dabei die Suchfunktionalität für die Räume und Lehrveranstaltungen hinzufügen. Die Implementierungen für die nötigen GUI-Komponenten findet ihr in der gleichen JAR-Datei (ue2-2.jar) (SearchRoomPanel, SearchStudyCoursePanel), ihr sollt sie lediglich in eurem Frame einbinden.

Auch den Controller müsst ihr nicht komplett selber implementieren, sondern sollt den AbstractAdministrationController erweitern:

package de.unikn.bioml.mpi2.stuvove.implementation.gui;

public class AdministrationController
extends AbstractAdministrationController {...}

Diesem fügt ihr euere SubDialoge hinzu und registriert beim Frame die Listener an den Buttons, die für das Öffnen der SubDialoge zuständig sind. In den dazugehörigen initialize-Methoden könnt ihr die SubDialoge erstellen und alle nötigen Listener registrieren.

Die beiden openXXXDialog-Methoden machen die SubDialoge sichtbar (für den StudyCourseDialog müssen erst noch die ComboBoxen gefüllt werden).

In den beiden addXXX-Methoden soll versucht werden, den Raum, bzw. die Lehrveranstaltung dem Manager hinzuzufügen. Eventuell auftretende Fehler werden im Dialog angezeigt. Ist das Erstellen erfolgreich, wird der Dialog geschlossen, andernfalls bleibt er offen.

Die beiden searchXXX-Methoden suchen im Manager nach dem angegebenen Raum, bzw. der Lehrveranstaltung und zeigen die Ergebnisse in der ResultListe des AbstractAdmininstrationFrames(getResultList()) an.

Die von euch zu schreibenden Klassen müssen in dem oben angegebenen Package de.unikn.bioml.mpi2.stuvove.implementation.gui abgelegt werden.

Die grafische Oberfläche lässt sich einfach durch folgende Zeile in einer main-Methode starten:

new AdministrationController(new Manager(), new AdministrationFrame()); 

Teil 3 - Speichern und Laden

Zuletzt sollt ihr das Laden und Speichern der Daten implementieren. Implementiert dazu die folgenden abstrakten Methoden aus dem AbstractAdministrationController:

    /**
* Loads all single files from the specified directoy and deserializes
* the entries and adds them to the manager.
*
* @param directory contains the single files
*/
protected abstract void loadFromText(File directory);

/**
* Loads all single files from the specified directoy and deserializes
* the entries and adds them to the manager.
*
* @param directory contains the single files
*/
protected abstract void loadFromXML(File directory);

/**
* Serializes all entities of the manager in single files into the
* specified directory using the text serializers.
*
* @param directory to save the files into
*/
protected abstract void saveToText(File directory);

/**
* Serializes all entities of the manager in single files into the
* specified directory using the text serializers.
*
* @param directory to save the files into
*/
protected abstract void saveToXML(File directory);

In diesen Methoden sollt ihr alle Entitäten aus dem Manager in einzelne Dateien serialisieren. Die Dateien liegen dann in dem übergebenen Ordner. Erstellt dazu euer File mit folgendem Konstruktor: File roomFile = new File(directory, "myfilename");. Geht dabei wie folgt vor:

  • Erstellt euch die notwendigen Dateien
  • Erstellt euch die entsprechenden (De)Serialisierer
  • (De)Serialisiert die Entitäten aus / in den Manager

Testet euer Programm ausführlich. Viel Erfolg!