Daily Tracker MVC Java Project
Daily Tracker MVC Java Project
Daily Tracker MVC Java Project
Programmierung II
Projektabschlussbericht
Daily Tracker
1 Kurzzusammenfassung .................................................................................................. 3
2 Verwendete Technologien ............................................................................................. 4
3 Lösungsstrategie ............................................................................................................. 5
3.1 Daten und Logik (Model) ......................................................................................... 5
3.2 Controller .................................................................................................................... 7
3.3 Graphische Darstellung (View) ............................................................................... 9
3.4 ObservableList......................................................................................................... 11
4 Algorithmus ..................................................................................................................... 13
4.1 UML-Diagramm ....................................................................................................... 13
4.2 AddTask ................................................................................................................... 14
4.3 Drag and Drop ......................................................................................................... 15
4.4 Timestamp ............................................................................................................... 15
4.5 Retrieve Items ......................................................................................................... 16
4.6 Import ........................................................................................................................ 16
4.7 Future Work ............................................................................................................. 17
5 Referenzen ..................................................................................................................... 19
6 Anhang A – Quellcode .................................................................................................. 20
6.1 Modell – Quellcode ................................................................................................. 20
6.2 Controller – Quellcode ........................................................................................... 25
6.3 View – Quellcode .................................................................................................... 27
6.4 Main – Quellcode .................................................................................................... 32
Dieses Projekt bietet den Nutzern eine Softwarelösung zur effektiven Verwaltung ihrer
täglichen Aufgaben. Durch den Einsatz dieses Softwareprodukts sind die Benutzer in der
Lage, ihre Aufgaben zu verfolgen, ihren Fortschritt zu überwachen und die allgemeine
Produktivität zu steigern. Die Aufgabenverfolgung bietet zahlreiche Vorteile, u.a. die
Kultivierung dauerhafter, guter Gewohnheiten. Sie ermöglicht es dem Einzelnen, sich einen
umfassenden Überblick über die täglichen Leistungen zu verschaffen und Bereiche mit
Verbesserungsbedarf zu identifizieren.
Darüber hinaus bietet diese Software die Möglichkeit, die verfolgten Aufgaben als
Textdateien zu importieren und auf den persönlichen Geräten der Benutzer zu speichern.
Durch das Speichern des Tagesfortschritts kann der Benutzer ihre Leistung konsequent
verfolgen und ihre Ziele über einen längeren Zeitraum verfolgen.
Das Programm wurde mit IntelliJ IDEA Version 2022.1.2 als integrierte
Entwicklungsumgebung (IDE) entwickelt. Das Projekt nutzt das Azul Zulu SDK Version
17.0.6, das wesentliche Klassen aus verschiedenen Paketen bietet, die für die
Implementierung erforderlich sind. Insbesondere wurden die folgenden Pakete verwendet:
javafx.collections, javafx.scene.control, javafx.scene.input (mit besonderem Schwerpunkt auf
den Klassen ClipboardContent und Dragboard), java.io und java.time. (Azul, 2021)
Diese Pakete stellen wichtige Funktionalitäten für das Programm bereit. Das Paket
javafx.collections bietet Klassen und Schnittstellen für den Umgang mit Sammlungen von
JavaFX-Eigenschaften und ermöglicht so eine effiziente Datenverwaltung. Das Paket
javafx.scene.control bietet eine Vielzahl von Steuerelementen für die Benutzeroberfläche,
wie z. B. Schaltflächen und Beschriftungen, die die Erstellung einer interaktiven Oberfläche
erleichtern. Das javafx.scene.input-Paket, insbesondere die Klassen ClipboardContent und
Dragboard, ermöglicht die Unterstützung von Clipboard-Operationen und Drag-and-Drop-
Funktionen innerhalb der Anwendung. Das java.io-Paket bietet Klassen für Eingabe-
/Ausgabeoperationen und ermöglicht die Handhabung von Dateien und die Datenpersistenz.
Das java.time-Paket schließlich bietet Klassen für die Verwaltung von Datum und Uhrzeit, die
bei zeitbasierten Operationen und der Zeitplanung helfen. (Oracle, kein Datum)
Darüber hinaus erwies sich der in IntelliJ IDEA eingebaute Scene Builder als wertvolles
Werkzeug, das einen umfassenden Satz von Elementen und Komponenten bietet, die für
den Aufbau der Benutzeroberfläche des Programms erforderlich sind.
Der ursprüngliche Prototyp wurde ohne Modell erstellt, so dass alle Programmfunktionen
direkt in der Steuerung implementiert wurden. Bei diesem Ansatz fehlte die Datenlogik und
die Interaktion mit Datenquellen war nicht möglich. Durch die direkte Eingabe von
Funktionen in die Steuerung ergaben sich Nachteile wie eine unzureichende Trennung von
Belangen, Code-Redundanz und begrenzte Datenverwaltungsmöglichkeiten. Eine spezielle
Modellkomponente ist unerlässlich, um die Codeorganisation zu verbessern, eine effiziente
Datenverarbeitung zu ermöglichen und die Skalierbarkeit und Wartbarkeit zu fördern.
Die Modellklasse im aktuellen Projekt umfasst eine Reihe von Methoden zur effektiven
Datenverwaltung.
Die Methode `addTask(String text)` spielt eine entscheidende Rolle, indem sie das
Hinzufügen neuer Aufgaben zu `listView1` ermöglicht. Durch die Verwendung der
Datenstruktur `ObservableList` stellt das Modell sicher, dass alle an der Liste
vorgenommenen Änderungen automatisch in die Ansicht übernommen werden. Diese
nahtlose Synchronisierung zwischen dem Modell und der Benutzeroberfläche ermöglicht
eine effiziente Datenverwaltung.
Um den Zeitpunkt von Aufgaben genau zu erfassen, ruft die Methode `getCurrentTime()` das
aktuelle Datum und die Uhrzeit im angegebenen Format ab. Diese Informationen werden in
erster Linie verwendet, um Zeitstempel an die zu `listView3` hinzugefügten Elemente
anzuhängen. Durch die effektive Verwaltung zeitbezogener Daten gewährleistet das Modell
eine genaue Verfolgung und Analyse der Aufgabenerledigung.
Durch die Methode `exportToTxtFile(String filePath)` ist den Export des Inhalts von
`listView4` in eine durch den Parameter `filePath` angegebene Textdatei möglich. Durch den
Einsatz von `BufferedWriter` und `FileWriter` verwaltet das Modell effektiv den Prozess des
Schreibens der Daten in die Datei. Diese Funktionalität fördert die Datenpersistenz und
ermöglicht es den Benutzern, ihre verfolgten Aufgaben außerhalb der Anwendung zu
speichern und darauf zuzugreifen.
Um das Löschen von Daten zu erleichtern, löscht die Methode `deleteAll()` den Inhalt von
`listView1`, `listView2` und `listView3`. Diese Funktionalität bietet eine einfache Möglichkeit,
die Listen zurückzusetzen und alle gespeicherten Aufgaben zu entfernen. Durch die effektive
Verwaltung der Datenlöschung gewährleistet das Modell die Konsistenz und bereitet die
Listen auf neue Dateneinträge vor.
Die Methode `close()` steht zwar nicht in direktem Zusammenhang mit der Datenverwaltung,
sorgt aber für die ordnungsgemäße Beendigung des Programms. Indem sie alle nicht
gespeicherten Daten oder Ressourcen vor dem Schließen der Anwendung behandelt, fördert
diese Methode die Datenintegrität und die ordnungsgemäße Beendigung des Programms.
Zusammenfassend lässt sich sagen, dass jede Methode der Modellklasse zu einer
effizienten Datenverwaltung innerhalb des Projekts beiträgt. Sie erleichtern das Hinzufügen,
Löschen, Manipulieren, Konsolidieren und Persistieren von Daten und stellen sicher, dass
das Modell verschiedene Aspekte der Datenverarbeitung und -interaktion in der gesamten
Anwendung effektiv handhabt.
Der Controller spielt eine wichtige Rolle bei der Erleichterung der Kommunikation zwischen
dem Modell (das die Daten und die Geschäftslogik darstellt) und dem View (der die
Benutzeroberfläche darstellt). Seine Hauptaufgabe besteht darin, Benutzereingaben aus der
Ansicht zu verarbeiten, das Modell entsprechend zu aktualisieren und sicherzustellen, dass
alle Änderungen in der Ansicht wiedergegeben werden.
In der Methode `initialize()` legt der Controller die anfängliche Einrichtung fest. Er instanziiert
eine neue Instanz der Klasse `Model` und assoziiert die entsprechenden `ObservableList`-
Instanzen aus dem Model mit den entsprechenden `ListView`-Instanzen im View. Zusätzlich
aktiviert es die Drag-and-Drop-Funktionalität, indem es die Methode `Drag()` von der Klasse
`Model` aufruft und die notwendigen `ListView`-Instanzen übergibt.
Die Methode `addTask()` wird ausgelöst, wenn der Benutzer beabsichtigt, eine neue
Aufgabe hinzuzufügen. Sie ruft den in das Eingabefeld `textField1` in der Ansicht
eingegebenen Text ab, nimmt die Aufgabe mit der Methode `addTask()` in das Modell auf
und löscht das Eingabefeld für zukünftige Eingaben.
Wenn der Benutzer die Methode `retrieveItems()` aufruft, werden Elemente aus dem Modell
abgerufen und im `listView4` in der Ansicht angezeigt. Durch den Aufruf der Methode
`retrieveItems()` aus der Klasse `Model` wird die entsprechende Datenverarbeitung
eingeleitet. Anschließend wird die aktualisierte `ObservableList` aus dem Modell der
`listView4` zugewiesen, um sicherzustellen, dass die neuesten Elemente in der Ansicht
wiedergegeben werden.
Die Methode `exportToTxtFile()` dient dem Zweck, den Inhalt von `listView4` in eine
Textdatei zu exportieren. Sie verwendet den JavaFX `FileChooser`, um dem Benutzer die
Auswahl einer Zieldatei zu ermöglichen. Sobald eine Datei ausgewählt wurde, wird die
Methode `exportToTxtFile()` aus der Klasse `Model` aufgerufen, um den Exportprozess zu
verarbeiten und die Daten in der angegebenen Datei zu speichern.
Die Methode `deleteAll()` ist mit der Aktion "Delete All" innerhalb der Benutzeroberfläche
verbunden. Wenn sie ausgelöst wird, verwendet sie die Methode `deleteAll()` aus der Klasse
`Model`, um alle Aufgaben und zugehörigen Daten innerhalb des Modells zu löschen und
den Zustand der Anwendung effektiv zurückzusetzen.
Abbildung 1 -Prototyp 1
Die Implementierung eines Fensters erleichterte die Anpassung der Größe von Schaltflächen
und Beschriftungen und verbesserte deren Gesamterscheinung. Außerdem wurde ein
Hintergrundbild eingefügt, um der Ansicht eine stärkere visuelle Wirkung zu verleihen.
Außerdem wurde die Deckkraft der Listenfarben reduziert, so dass die Benutzer das
gesamte Bild sehen können, bevor sie sich mit dem Programm beschäftigen. Insbesondere
Die Klasse ObservableList ist Teil des JavaFX-Collections-Frameworks und bietet eine
Listenimplementierung, mit der sich Änderungen an ihren Elementen verfolgen lassen. Sie
unterstützt Benachrichtigungen für Änderungen wie das Hinzufügen, Entfernen oder
Aktualisieren von Elementen, was wichtig ist, um die Benutzeroberfläche mit den zugrunde
liegenden Daten zu synchronisieren.
1. Controller:
• `listView1`, `listView2`, `listView3` und `listView4` werden mit der Methode `setItems`
an ihre jeweiligen `ListView`-Oberflächenkomponenten gebunden. Dadurch wird
sichergestellt, dass alle Änderungen an der `ObservableList` sofort in der
Benutzeroberfläche wiedergegeben werden.
• Die Methode `addTask` in der Controller-Klasse interagiert mit der `ObservableList`
`listView1`. Wenn ein Benutzer eine Aufgabe über die Benutzeroberfläche hinzufügt,
wird die eingegebene Aufgabe mit der Methode `add` der `ObservableList` zu
`listView1` hinzugefügt. Dies löst die Aktualisierung der Benutzeroberfläche aufgrund
der Bindung aus.
• Die Methode `retrieveItems` kombiniert die Daten von `listView2` und `listView3` und
füllt `listView4` auf. Sie holt die Daten aus den entsprechenden `ObservableList`-
Objekten und weist sie `listView4` zu.
2. Modell:
• Die Methode `addTask` fügt Aufgaben zu `listView1` hinzu, indem sie die Methode
`add` der `ObservableList` aufruft. Diese Methode stellt sicher, dass die neue
Aufgabe zur Liste hinzugefügt wird und löst alle registrierten Listener aus, um die
Benutzeroberfläche zu aktualisieren.
• Die Methode `Drag` in der Model-Klasse behandelt die Drag-and-Drop-Funktionalität
zwischen `listView1`, `listView2` und `listView3`. Sie verwendet die `ObservableList`-
Projektabschlussbericht 11 Praktikum PR2, SS 2023
Methoden wie `getItems`, `add` und `remove`, um die Daten als Reaktion auf die
Drag-and-Drop-Ereignisse zu manipulieren.
• Die Methode `retrieveItems` ruft Elemente aus `listView2` und `listView3` ab und
kombiniert sie in einem einzigen String-Format. Anschließend fügt sie die
kombinierten Elemente mit der Methode `add` von `ObservableList` zu `listView4`
hinzu. Dies löst die Aktualisierung der Benutzeroberfläche aus und spiegelt die
Änderungen in `listView4` wider.
3. View:
In der FXML-Datei werden die `ObservableList'-Objekte mit Hilfe des Attributs `fx:id` und des
Attributs `fx:controller` zur Angabe der zugehörigen Controller-Klasse an die UI-
Komponenten gebunden.
• Die `ListView'-UI-Komponenten (`listView1`, `listView2`, `listView3` und `listView4`)
sind mit den entsprechenden `ObservableList'-Objekten über das `fx:id'-Attribut
verbunden.
• Die Daten in der `ObservableList` werden in der Benutzeroberfläche durch diese
`ListView`-Komponenten angezeigt, und alle Änderungen, die an der
`ObservableList` vorgenommen werden, werden aufgrund der Bindung automatisch
in der Benutzeroberfläche widergespiegelt.
Die Abbildung 3 bietet einen Überblick über die architektonische Struktur und die
Interaktionen innerhalb der Daily Tracker-Anwendung. Es stellt die Beziehungen und
Abhängigkeiten zwischen den Hauptkomponenten der Anwendung dar, einschließlich
Modell, Ansicht und Controller. Das Diagramm hilft zu visualisieren, wie diese Komponenten
zusammenarbeiten, um den Datenfluss, die Benutzerinteraktion und die Anwendungslogik zu
Das Diagramm besteht aus drei Hauptkomponenten: Modell, Ansicht und Controller,
zusammen mit ihren jeweiligen Attributen und Methoden.
• Modell: Das Modell stellt die Daten und die Geschäftslogik der Anwendung
dar. Es enthält einen internen Zustand, der in privaten Feldern gekapselt ist,
und bietet Methoden zum Bearbeiten und Abrufen der Daten. Die Klasse
4.2 AddTask
Die Methode `addTask()` ruft den Text aus `textField1` ab, fügt ihn mit Hilfe eines Modells
als Aufgabe hinzu und löscht danach `textField1`. Diese Methode spielt eine entscheidende
Rolle in der Datenlogik, indem sie Benutzereingaben erfasst, verarbeitet und das Modell mit
der neuen Aufgabe aktualisiert, wodurch ein reibungsloser Arbeitsablauf für die Verwaltung
von Aufgaben innerhalb des Programms gewährleistet wird. Sie wurde unabhängig
entwickelt, ohne externe Ressourcen zu nutzen.
Die Methode `Drag` implementiert die Funktion des Ziehens und Ablegens zwischen drei
Listenansichten: `listView1`, `listView2` und `listView3`. Der Code enthält drei Event-Handler,
die das Verhalten in verschiedenen Stadien des Drag-and-Drop-Prozesses definieren.
4.4 Timestamp
Innerhalb der Methode wird die Funktion LocalDateTime.now() verwendet, um die aktuellen
Datums- und Zeitinformationen zu erhalten. Dieses LocalDateTime-Objekt enthält das
genaue Datum und die Uhrzeit zum Zeitpunkt des Aufrufs der Methode.
Diese Methode ruft Elemente aus zwei separaten Listen, `listView2` und `listView3`, ab,
kombiniert sie zu einem neuen Format und fügt die kombinierten Elemente zu `listView4`
hinzu.
Zunächst erhält der Code die Verweise auf `listView2` und `listView3` über die Methoden
`getListView2()` bzw. `getListView3()`, die vermutlich die mit den jeweiligen Listenansichten
verbundenen beobachtbaren Listen zurückgeben.
Als nächstes wird die Anzahl der abzurufenden Elemente auf der Grundlage der
Mindestgröße zwischen `listView2Items` und `listView3Items` bestimmt.
Dann werden in einer Schleife die Elemente an den entsprechenden Indizes aus beiden
Listen abgerufen, mit einem Trennzeichen ("/") verkettet und das kombinierte Element mit
der Methode `add()` zu `listView4` hinzugefügt. Schließlich wird der Inhalt von `listView2`
und `listView3` mit der Methode `clear()` gelöscht.
4.6 Import
Diese Methode exportiert Elemente aus `listView4` in eine Textdatei, die durch den
Parameter `filePath` angegeben wird. Innerhalb der Methode wird ein `BufferedWriter`
erstellt und mit einem neuen `FileWriter` initialisiert, um in die angegebene Datei zu
schreiben.
Es ist zu beachten, dass ChatGPT während des gesamten Projekts zur Verfeinerung
und Beantwortung von Fragen während der Entwicklung genutzt wurde. Die
Hauptkonversation, die die Ausarbeitung aller wichtigen Funktionen umfasst, ist unter
dem oben angegebenen Link zu finden. Dieser Link steht jedem zur Verfügung, der
die Konversation nachlesen möchte.