Login |
 
 

Aufgabe 4, Abgabe spätestens am 24.06.2010, 8:00 Uhr

Einleitung

In dieser Aufgabe sollt ihr eure Benutzeroberfläche so erweitern, dass es möglich ist sich einen eigenen Stundenplan zu erstellen. (Die Vorgaben gibts wie immer im Jar-Projekt als ue4.jar).

Dazu sollt ihr die JTable verwenden, mit den dazugehörigen Komponenten TableModel, JTableCellRenderer und JTableCellEditor. Der Stundenplan soll in einer Tabelle angezeigt werden. Die gewünschten Lehrveranstaltungen werden dem Stundenplan hinzugefügt und dabei automatisch (entsprechend der zugehörigen Timeslots) in die Tabelle einsortiert.

Durch die Darstellungsart (Renderer) der Lehrveranstaltungen soll optisch unterscheidbar sein, ob es sich dabei um eine Vorlesung, ein Seminar oder eine Übung handelt. Lehrveranstaltungen, die bereits im Stundenplan sind, sollen auch wieder gelöscht werden können.

Vereinfachend nehmen wir an, dass es pro Tag sechs Timeslots mit je zwei Stunden gibt (8-10, 10-12, ...).

Teil 1 - JTable und TableModel

Schreibt für den Stundenplan ein TimeTableModel, das AbstractTimeTableModel implementiert. Das TimeTableModel ist dafür zuständig die Daten zu halten. Achtet beim Einfügen der Lehrveranstaltungen darauf, dass diese an der richtigen Stelle eingefügt werden. Es soll in einem Stundenplan immer nur eine Lehrveranstaltung pro Timeslot möglich sein. Die Methode toHTML() soll den Stundenplan, d.h. euer Model als HTML zurück geben.

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

public class TimeTableModel extends AbstractTimeTableModel {
...
}

Implementiert außerdem die abstrakte Klasse AbstractTimeTable. Diese ist eine JTable, die vorgegebenen abstrakten Methoden müssen überschrieben werden. Achtet beim Konstruktor darauf, den entsprechenden super-Konstruktor aufzurufen. Ferner könnt ihr dann im Konstruktor alle gewünschten Eigenschaften einstellen, z.B. den SelectionMode, die Zeilenhöhe, usw.

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

public class TimeTable extends AbstractTimeTable {...}

 

Teil 2 - TableCellRenderer und TableCellEditor

Um die Lehrveranstaltungen auch richtig anzeigen zu können müsst ihr einen eigenen Renderer definieren, den ihr in TimeTable#getCellRenderer(int row, int column) zurück gebt. Der Renderer könnte z.B. so aussehen:

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

public class TimeTableCellRenderer extends DefaultTableCellRenderer {

public Component getTableCellRendererComponent(final JTable table,
final Object value, final boolean isSelected,
final boolean hasFocus, final int row, final int column) {...}
}

Tipp: falls der übergebene Wert null ist, könnt ihr wenn ihr wollt mit super.getTableCellRendererComponent() auf die DefaultTableCellRenderer- Implementierung zugreifen.

Um eine einmal hinzugefügte Lehrveranstaltung wieder entfernen zu können, muss ein TableCellEditor implementiert werden, der dies ermöglicht. In TimeTable#getCellEditor(int row, int column) gebt ihr eure Implementierung zurück. Der TableCellEditor hat zwei Methoden:

  • getTableCellEditorComponent, die die Editor-Komponente zurück gibt, also bestimmt, wie die Tabellenzelle im Editiermodus angezeigt wird. An diese Komponente müsst ihr die Logik hinzufügen, die bestimmt, was beim Editieren passieren soll.
  • getCellEditorValue gibt den editierten Wert zurück.

Die Klasse erbt von AbstractCellEditor und könnte in etwa so aussehen:

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

public class TimeTableCellEditor extends AbstractCellEditor implements
TableCellEditor {...}

 

Teil 3 - GUIManager, IModelHandler und IModelListener

Damit der TimetableFrame über Änderungen am Manager, die über den AdministrationFrame eingefügt werden informiert werden kann, sollt ihr eine weitere Wrapper-Klasse für den Manager schreiben:

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

public class GUIManager implements IGUIManager

Wie das Interface IGUIManager nahe legt, ermöglicht der GUIManager IModelListener hinzuzufügen. Diese sollen dann informiert werden, wenn sich etwas am Manager ändert, d.h. ihr leitet die Methoden wieder an den übergebenen IManager weiter und informiert alle registrierten IModelListener wenn nötig. Ferner benötigt ihr eine Möglichkeit IModelListener zu verwalten. Der TimeTableFrame implementiert bereits IModelListener, darum braucht ihr euch also nicht zu kümmern.

Viel Erfolg!!!