{"id":19266546,"url":"https://github.com/ghackenberg/kurs-java-programmierung","last_synced_at":"2026-02-19T17:01:54.506Z","repository":{"id":259916025,"uuid":"867130894","full_name":"ghackenberg/kurs-java-programmierung","owner":"ghackenberg","description":"Unterlagen für meinen Kurs in Java-Programmierung an der Fakultät für Technik und angewandte Naturwissenschaften der FH OÖ.","archived":false,"fork":false,"pushed_at":"2024-12-13T11:30:25.000Z","size":4076,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-11T18:04:32.815Z","etag":null,"topics":["course-material","java","javafx","programming-examples"],"latest_commit_sha":null,"homepage":"","language":"Mermaid","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ghackenberg.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-03T14:00:55.000Z","updated_at":"2024-12-13T11:30:29.000Z","dependencies_parsed_at":"2025-04-11T18:04:42.127Z","dependency_job_id":"5a480e77-ef3d-40ff-8a08-30406646eb0c","html_url":"https://github.com/ghackenberg/kurs-java-programmierung","commit_stats":null,"previous_names":["ghackenberg/kurs-java-programmierung"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ghackenberg/kurs-java-programmierung","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghackenberg%2Fkurs-java-programmierung","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghackenberg%2Fkurs-java-programmierung/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghackenberg%2Fkurs-java-programmierung/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghackenberg%2Fkurs-java-programmierung/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ghackenberg","download_url":"https://codeload.github.com/ghackenberg/kurs-java-programmierung/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ghackenberg%2Fkurs-java-programmierung/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29623546,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-19T13:04:20.082Z","status":"ssl_error","status_checked_at":"2026-02-19T13:03:33.775Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["course-material","java","javafx","programming-examples"],"created_at":"2024-11-09T20:05:43.496Z","updated_at":"2026-02-19T17:01:54.488Z","avatar_url":"https://github.com/ghackenberg.png","language":"Mermaid","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kurs in Java Programmierung\n\n![](./Grafiken/Social-Preview.png)\n\nDieses Repository enthält Unterlagen zum Kurs in Java-Programmierung, welcher an der [Fakultät für Technik und angewandte Naturwissenschaften](https://fh-ooe.at/campus-wels) (*engl.* School of Engineering) der [Fachhochschule Oberösterreich](https://fh-ooe.at/) unterrichtet wird.\n\n*Beachte, dass sich der Kurs an Personen richtet, die bereits mit einer anderen objektorientierten Programmiersprache wie C# oder C++ umgehen können.*\n*Deshalb verzichten wir auf die Einführung grundlegender Elemente von (objektorientierten) Programmiersprachen wie Datentypen, Operatoren, Literale, Variablen, Zuweisungen, Verzweigungen, Schleifen, Funktionen, Klassen, Methoden und Namensräume.*\n\nIm Folgenden findest du **Grundlagen** der Java-Programmierung mit unterschiedlichen Standardbibliotheken, konkrete **Anwendungen** inklusive vollständigem Quelltext, und **Regelungen** zur Nutzung dieses Repositories.\n\n## Grundlagen\n\nJe nach konkreter Anwendungen kommen in der Regel verschiedene Bibliotheken und Frameworks zum Einsatz.\nIm Rahmen dieses Kurses werden die folgenden Themen betrachtet:\n\n* [Dateneingabe und -ausgabe mit `java.io`](./Grundlagen/Java.IO.md)\n* [Netzwerk-Kommunikation mit `java.net`](./Grundlagen/Java.Net.md)\n* [Grafische Benutzerschnittstellen mit `javafx`](./Grundlagen/JavaFX.md)\n  * [*Vertiefung 1:* Anordnung von Inhalten](./Grundlagen/JavaFX-Panes.md)\n  * [*Vertiefung 2:* Interaktive Steuerelemente](./Grundlagen/JavaFX-Controls.md)\n  * [*Vertiefung 3:* Darstellung von Datensammlungen](./Grundlagen/JavaFX-Collections.md)\n  * [*Vertiefung 4:* Erstellung von 2D-Visualisierungen](./Grundlagen/JavaFX-2D.md)\n  * [*Vertiefung 5:* Erstellung von 3D-Visualisierungen](./Grundlagen/JavaFX-3D.md)\n\n## Anwendungen\n\n*Mit konkreten Beispielen lernt man doch am besten!*\nDas Repository bietet dir einfache Beispiele, um die Entwicklung von Anwendungen mit der Programmiersprache Java zu erlernen.\nIm folgenden unterscheiden wir zwischen **Konsolenanwendungen**, welche typischerweise im Hintergrund laufen, sowie **grafischen Anwendungen (GUIs)**, mit denen die Benutzer direkt interagieren.\n\n### Konsolenanwendungen\n\nDieser Abschnitt führt dich in die Entwicklung von Konsolenanwendungen mit der Programmiersprache Java ein und beinhaltet die folgenden Beispiele:\n\n- Das **erste Beispiel** fokussiert sich auf die Eingabe und Ausgabe von Daten über die Konsole sowie die Umwandlung von Rohdaten und Zeichenketten.\n- Das **zweite Beispiel** betrachtet hingegen die Kommunikation von Anwendungen über das IP-Netzwerke und das User Datagram Protocol.\n\n#### 💻 [Konsole.IO](./Quellen/Konsole/IO/)\n\nDie erste Anwendung ist ein einfacher Taschenrechner, der die Grundrechenarten beherrscht.\nDas Programm ließt vom Benutzer nacheinander zwei Zahlen und einen Rechenoperator ein.\nDanach führt das Programm die gewünschte Berechnung durch und gibt das Ergebnis aus.\nZudem prüft das Programm die Gültigkeit der Eingaben, um die korrekte Funktion zu gewährleisten.\nBei ungültigen Eingaben gibt das Programm eine Fehlermeldung aus und wiederholt die Eingabe.\n\n![](./Quellen/Konsole/IO/Screenshot.png)\n\nDie folgende Grafik zeigt den technischen Aufbau der Taschenrechneranwendung.\nDie Anwendung besteht aus einer Programmklasse mit einer Hauptroutine sowie weiteren Klassen für die Datenein- und -ausgabe.\nDie Dateneingabe erfolgt über einen `BufferedReader`, mit dem ganze Zeilen eingelesen werden können.\nDie Zeileneingabe basiert wiederum auf einem `InputStreamReader`, welche Eingaberohdaten in Zeichen mit einer Zeichenkodierung (z.B. UTF-8) verwandelt.\nDie Zeicheneingabe nutzt schließlich die Standardeingabe, welche die notwendigen Rohdaten liefert.\nDie Ausgabe erfolgt ebenso über die Standardausgabe der Konsolenanwendung, welche sowohl Rohdaten als auch Zeichenketten verarbeiten kann.\n\n![](./Quellen/Konsole/IO/Architecture.svg)\n\n#### 💻 [Konsole.Net](./Quellen/Konsole/Net/)\n\nDie zweite Anwendung zeigt das Senden und Empfangen von UDP-Paketen.\nDie Anwendung umfasst eine Client- und eine Serveranwendung, die separat gestartet werden müssen.\nDie Clientanwendung fragt zunächst eine Eingabe vom Benutzer über die Konsole ab.\nDanach erstellt die Anwendung ein UDP-Paket mit der Eingabe als Inhalt.\nSchließlich sendet das Programm das Paket an eine vordefinierte IP-Adresse und eine vordefinierte Portnummer.\n\n![](./Quellen/Konsole/Net/Screenshot-Client.png)\n\nDie Serveranwendung wartet hingegen auf eingehende UDP-Pakete auf einer vordefinierten Portnummer.\nSobald ein UDP-Paket eingegangen ist, werden die Paketinformation auf der Konsole ausgegeben.\nDie Paketinformationen beinhalten die IP-Adresse und die Portnummer des Paketsenders.\nDes weiteren beinhalten die Paketinformationen den eigenliche Nutzinhalt sowie dessen Zeichenlänge.\nNachdem die Informationen ausgegeben wurden, terminiert die Anwendung.\n\n![](./Quellen/Konsole/Net/Screenshot-Server.png)\n\nDie folgende Grafik zeigt den technischen Aufbau der Anwendung bestehend aus einem Client und einem Server.\nSowohl der Client als auch der Server werden durch eine Programmklasse mit einer Hauptroutine dargestellt.\nBeide Programmklassen nutzen wiederum die Klassen `DatagramSocket` zum Senden und Empfangen sowie `DatagramPacket` zur Darstellung von Datenpaketen.\nAuf Clientseite enthält das Datenpaket die Adresse des Servers, auf Serverseite hingegen die Adresse des Clients.\n\n![](./Quellen/Konsole/Net/Architecture.svg)\n\n### Grafische Anwendungen (GUIs)\n\nDieser zweite Abschnitt beschäftigt sich mit der Entwicklung von grafischen Benutzerschnittstellen und Anwendungen mit der Programmiersprache Java und enthält die folgenden Beispiele:\n\n- Das **erste Beispiel** beschreibt zunächst die unterschiedlichen möglichen Anordnungen von Inhalten auf der verfügbaren Bildschirmfläche.\n- Das **zweite Beispiel** betrachtet die Erstellung von klassischen Menüstrukturen für Anwendungen sowie die Registrierung von Ereignisroutinen.\n- Das **dritte Beispiel** fokussiert die Darstellung und Bearbeitung von eigenen Datensammlungen mit Listen-, Tabellen- und Baumansichten.\n- Das **vierte Beispie**l erklärt die Erstellung von eigenen Datenvisualisierungen mit Diagrammen und grundlegenden 2D- und 3D-Grafikelementen.\n- Das **fünfte Beispiel** zeigt schließlich die Entwicklung einer einfachen Chat-Anwendung basierend auf IP-Netzwerken und dem User Datagram Protocol.\n\n#### 💻 [GUI.Anordnungen](./Quellen/GUI/Anordnungen/)\n\nDie erste Anwendung erklärt, wie in JavaFX die Inhalte auf der verfügbaren Bildschirmfläche anordnen kann.\nFür die Anordnung von Inhalten bietet JavaFX unterschiedliche Algorithmen, welche in Form von eigenen Knotentypen realisiert sind.\nDie Algorithmen entscheiden wiederum automatisch, welcher Teil der Bildschirmfläche den einzelnen Inhalten zur Verfügung steht.\nDer zugewiesene Teil der Bildschirmfläche ist durch die linke obere Bildschirmkoordinate sowie die Breite und Höhe der Fläche in Pixeln definiert.\nDiese Informationen werden durch den verwendeten Algorithmus an die darunter liegenden Inhalte weitergegeben und dort letztlich zur Füllung der entsprechenden Bildschirmpixel verwendet.\n\n![](./Quellen/GUI/Anordnungen/Screenshot.png)\n\nDie folgende Grafik zeigt die interne Objektstruktur, welche dieser Beispielanwendung zugrunde leigt.\nAn oberster Stelle findet sich eine Rasteranordnung, um das gesamte Fenster in zwei Spalten und zwei Zeilen bzw. vier gleich große Zellen einzuteilen.\nIn die linke obere Zelle legen wir eine Randanordnung, welche aus fünf Bereichen (oben, links, mitte, rechts, unten) besteht.\nIn die linke untere Zelle legen wir eine Rasteranordnung, welche in diesem konkreten Fall aus drei gleich großen Spalten und zwei gleich großen Zeilen besteht und deren Inhalte teilweise zwei Spalten überspannen.\nIn die rechte obere Zelle legen wir eine Stapelanordnung, welche die Inhalte in der verfügbaren Fläche zentriert und in der vordefinierten Reihenfolge übereinander legt.\nIn die rechte untere Zelle legen wir schließlich eine Flußanorndung, welche die verfügbare Bildschirmfläche primär horizontal und sekundär vertikal mit Inhalten auffüllt.\n\n![](./Quellen/GUI/Anordnungen/Scene.svg)\n\n#### 💻 [GUI.Menüs](./Quellen/GUI/Menüs/)\n\nDie zweite Anwendung zeigt, wie man mit JavaFX klassische Menüstrukturen definiert und Ereignisroutinen für die einzelnen Menüpunkte hinterlegt.\nKlassische Menüstrukturen bestehen grundsätzlich aus Menüs (z.B. Datei, Bearbeiten, und Hilfe) sowie Menüelementen (z.B. Öffnen, Speichern, Speichern unter, und Schließen).\nDie übergeordneten Menüs können zunächst aufgeklappt und zugeklappt werden, die Menüelemente können hingegen ausgewählt werden und somit eine Aktion anstoßen.\nDie Aktion selbst, welche angestoßen werden soll, wird schließlich als Ereignisroutine für das jeweilige Menüelementen gesetzt bzw. konfiguriert.\n\n![](./Quellen/GUI/Menüs/Screenshot.png)\n\nDie folgende Grafik zeigt die zugrunde liegende Objektstruktur der grafischen Anwendung.\nAn oberster Stelle der Struktur findet wir ein Randlayout, welches ein Menüband als Kindknoten enthält.\nDas Menüband wiederum enthält drei verschiedene Menüs, welche aus unterschiedlichen Menüelementen bestehen.\nDie Menüelemente verweisen schließlich auf Ereignisroutinen, welche bei deren Auswahl ausgeführt werden.\nIn den Ereignisroutinen kann man folglich die individuelle Funktionsweise der Menüelemente definieren.\n\n![](./Quellen/GUI/Menüs/Scene.svg)\n\n#### 💻 [GUI.Sammlungen](./Quellen/GUI/Sammlungen/)\n\nDie dritte Anwendung zeigt Möglichkeiten auf, wie man in JavaFX Sammlungen von Datensätzen anzeigen und bearbeitbar machen kann.\nGrundsätzlich bietet JavaFX dafür eine Reihe unterschiedlicher Steuerelemente, welche abhängig vom konkreten Anwendungsfall eingesetzt werden können.\nZu den Steuerelementen für Datensammlungen gehören Listenansichten, Tabellenansichten, Baumansichten, und Baumtabellenansichten.\nListen und Tabellen eignen sich dabei für flache Datenstrukturen, während Baumansichten und Baumtabellenansichten für geschachtelte Datenstrukturen gedacht sind.\n\n![](./Quellen/GUI/Sammlungen/Screenshot.png)\n\nDie folgende Grafik zeigt die Objektstruktur, welche der Anwendung zugrunde liegt.\nAn oberster Stelle der Objektstruktur finden wir ein Rasterlayout, welches die verfügbare Bildschirmfläche unter den Kindknoten aufteilt.\nDie Kindknoten selbst sind die Listenansicht, die Tabellenansicht, die Baumansicht, und die Baumtabellenansicht.\nDie Listenansicht verweist des weiteren auf die Listenelemente, welche in der Ansicht dargestellt werden sollen.\nDie Tabellenansicht beinhaltet neben den Tabellenelementen die Definition der einzelnen Spalten in From von Spaltenobjekten.\nDie Baumansicht verweist hingegen ein Baumelement, welches den Wurzelknoten der Baumstruktur repräsentiert und weitere Kindelemente beinhalten kann.\nDie Baumtabellenansicht definiert schließich sowohl die Tabellenspalten in From von Spaltenobjekten als auch den ein Baumelement als Wurzelknoten.\n\n![](./Quellen/GUI/Sammlungen/Scene.svg)\n\n#### 💻 [GUI.Visualisierungen](./Quellen/GUI/Visualisierungen/)\n\nDie vierte Anwendung zeigt Möglichkeiten auf, wie man in JavaFX Visualisierungen integrieren kann.\nStandardmäßig bietet JavaFX die Möglichkeit, einfache Diagrammvisualisierungen in Anwendungen zu integrieren.\nDarüber hinaus bietet JavaFX auch die Möglichkeit, eingene 2D- und 3D-Visualiserungen zu programmieren.\nFür eigene Visualisierungen steht ein entsprechendes Objektmodell bestehend aus 2D-Formen (Linien, Kreise, usw.) und 3D-Formen (Kugeln, Würfel, usw.) zur Verfügung.\n\n![](./Quellen/GUI/Visualisierungen/Screenshot.png)\n\nDie folgende Grafik zeigt die zugrunde liegende Objektstruktur dieses Beispiels.\nDer oberste Knoten der Objektstruktur ist ein Rasterlayout, welches vier Kindknoten beinhaltet.\nDer erste Kindknoten ist das Tortendiagramm, welches in der linken oberen Rasterzelle zu sehen ist.\nDer zweite Kindknoten ist das Balkendiagramm, welches in der rechten oberen Rasterzelle zu sehen ist.\nDer dritte Kindknoten ist die 2D-Visualisierung, welche in der linken unteren Zelle zu sehen ist.\nUnd der vierte Kindknoten ist die 3D-Visualisierung, welche in der rechten unteren Zelle zu sehen ist.\n\n![](./Quellen/GUI/Visualisierungen/Scene.svg)\n\n#### 💻 [GUI.Chat](./Quellen/GUI/Chat/)\n\nDie fünfte Anwendung erweitert das vorige Beispiel zum Senden und Empfangen von UDP-Paketen um eine grafische Benutzerschnittstelle.\nDie grafische Benutzerschnittstelle fragt zunächst den Namen des Nutzers, die gewünschte Portnummer für das Empfangen von Nachrichten, sowie die IP-Adresse und die Portnummer für das Senden von Nachrichten ab.\nDanach kann der Benutzer Nachrichten eingeben und versenden.\nAußerdem bekommt der Benutzer versendete und empfangene Nachrichten angezeigt.\n\n![](./Quellen/GUI/Chat/Screenshot-Default.png)\n\nDer folgende Screenshot zeigt den Aufbau der grafischen Benutzerschnittstelle bestehend aus einer Szene mit sogenannten Knoten.\nJavaFX unterscheidet verschiedene Knotentypen wie Buttons, Texteingabefelder, Zahleneingabefelder und Beschriftungen (*rote* Kästen).\nDes Weiteren bietet JavaFX bestimmte Knotentypen für das Layout von Kindelememten wie die Klassen `BorderPane`, `GridPane`, `ScrollPane` und `VBox` (*grüne* Kästen).\nBeachte, dass der Stil jedes Knotens individuell konfiguriert werden kann.\n\n![](./Quellen/GUI/Chat/Screenshot-Debug.png)\n\nDie folgende Grafik zeigt den schematischen Aufbau der grafischen Benutzeroberfläche als Knotenbaum.\nDie Wurzel des Knotenbaums ist eine Instanz der Klasse `Stage`, welche das gesamte Fenster repräsentiert.\nEine `Stage` enthält wiederum genau eine Instanz der Klasse `Scene`, welche den Inhalt des Fensters darstellt.\nDie `Scene` enthält schließlich genau ein Wurzelelement, welches in diesem konkreten Fall eine Instanz der Klasse `BorderPane` ist.\nDas Wurzelelemnt kann dann weitere Knoten beinhalten.\n\n![](./Quellen/GUI/Chat/Scene.svg)\n\n## Regelungen\n\nDie Unterlagen für diesen Kurs sind grundsätzlich quelloffen.\nIm Folgenden findest du weitere Informationen zur Nutzung der Unterlagen sowie zur Weiterentwicklung des Materials:\n\n* [LICENSE](./LICENSE.md)\n* [CHANGELOG](./CHANGELOG.md)\n* [CONTRIBUTING](./CONTRIBUTING.md)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghackenberg%2Fkurs-java-programmierung","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fghackenberg%2Fkurs-java-programmierung","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fghackenberg%2Fkurs-java-programmierung/lists"}