Lernstoff 2xHIF PLF Mai 2022

Folgende Konzepte und Komponenten sollten genutzt werden können:

1. JavaFX

1.1. Menüs + Dazugehöriges

  • Hinzufügen eines MenItem (samt EventHandler für ActionEvent) ins Menu

  • Entfernen eines MenuItem aus Menu

  • Disablen(+Enablen) eines MenuItem

1.2. TabPane

  • Erzeugen der TabPane

  • Erzeugen eines Tab

  • Setzen von title und content eines Tab

  • Hinzufügen (und Entfernen) eines Tab zur TabPane

  • Hinzufügen eines ListChangeListeners als Lambda-Ausdruck (siehe Bsp)

  • Auswerten des ListChangeListeners (Change-Objekte durchiterieren mit while (chg.next()) { if (chg.wasRemoved()) { Tab removedTab = chg.getRemoved().get(0); …​ }} )

1.3. VBox, HBox, BorderPane

  • Elemente hinzufügen zu HBox, VBox (children-List): theBox.getChildren().add(..) oder per Aufzählung mit addAll(…​)

  • Elemente (meist Panes) hinzufügen zu BorderPane: theBdPane.setTop(..), .setCenter(..), …​ *

1.4. UserData, Id, StyleClass

  • die meisten UI-Elemente haben die Möglichkeit, ein beliebiges Objekt zu speichern:
    uiObj.setUserData(someOtherObj)
    und wieder abzufragen (Casten nötig, um Zugriff auf alle Methoden etc zu erhalten):
    TheClass theClObj = (TheClass)uiObj.getUserData().
    Damit kann z.B. ein Tab-Objekt eine Referenz und damit vollen Zugriff auf "sein" Duty-Objekt (z.B. ein WordWork-Objekt) erhalten.

  • Jedes UI-Element kann eine Id erhalten, die u.a. für Definition von CSS-Eigenschaften für dieses Element genutzt werden können.
    Man kann sogar mittels Node myNode = myScene.lookup("#uiObjId") das Element (falls es wie die meisten UI-Elemente von Node erbt) auffinden (geht leider für Menü-Elemente nicht, da diese nicht von Node erben).
    Es gibt auch Set<Node> matchingNodes = myNode.lookupAll(".classSel") (oder "#uiObjId" oder andere CSS-Selektoren).

  • Jedes UI-Element kann auch beliebig viele "StyleClass"-Einträge (z.B. als CSS-classes) erhalten: mit ObservableList<String> styleClasses = uiObj.getStyleClass() erhält man die Liste.
    In dieser kann mit add(..), remove(), contains() weitergearbeitet werden.

1.5. Element-Größen, Styling, etc.

Jedes Element, das javafx.css.Styleable implementiert (fast alle UI-Elemente) kann mit CSS-Mitteln gestylt werden. Entweder mit uiObj.setStyle("-f-xxx: theValue; …​") oder per CSS-Dateien. Dabei werden die aus CSS bekannten sowie einige JavaFX-spezifische Selektoren verwendet (siehe JavaFX 18 CSS Reference Guide).
Eine Basisklasse für den Großteil der UI-Elemente und aller Container ist javafx.scene.layout.Region (siehe Region (JavaFX 18)).
Für Element-Größen gibt es jeweils 3 Werte: minWidth/minHeight, prefWidth/prefHeight, maxWidth/maxHeight bzw. die Kombination xxxSize(), wobei je nach Container unterschiedliches Verhalten implementiert ist. PrefSize wird von vielen angestrebt.

1.6. Listeners, Eventhandling wie in den bisherigen Beispielen verwendet

1.7. GridPane

Constraints, row/colspan, Spalten/Zeilengrößen

1.8. FileChooser

  • FileChooser für lesen und Schreiben von Dateien (Bilder, Textdateien)

  • Vorbereiten:

    • Start-Verzeichnis mit fileChooser.setInitialDirectory(..)

    • vorgeschlagener Dateiname mit fileChooser.setInitialFileName(..)

    • Vorbereiten Popu-Liste anzuzeigender Datei-Arten (hier CSV-Files und All Files) mit jeweils mehreren dazugehörigen Endungen (hier "*.csv", "\*.csvdata", …​):
      fileChooser.getExtensionFilters().addAll(
          new ExtensionFilter("CSV-Files", "*.csv", "\*.csvdata", "*.txt"),
          new ExtensionFilter("All Files", "*.*"));

2. Java ohne FX

2.2. LocalDate von String parsen, als String ausgeben

siehe

2.3. Datei-Operationen

String.format(..) und Verwandtes Enums in einfacher Form Collections (mit Generic Element-Typ-Parametern):

Interfaces List⇒ArrayList, Set⇒HashSet, Map⇒HashMap, SortedSet⇒TreeSet Hilfsklassen Collections, Arrays

3. Konzepte in unserer Basis-App

  • Maps, denen Values Listen, Sets oder Maps sind (siehe Klasse Engine): Hinzufügen und Entfernen von Map-Einträgen; Lesen, Hinzufügen, Ändern, Entfernen von Elementen in die Substruktur (siehe wantedSet etc. in der "Engine")

  • Speichern von App-Settings in Properties-Files (wie für Wiederherstellen der Fenster-Position gezeigt)

Hier eine Liste, die teils aus den Import-Statements zusammengestellt ist:

  • Einfache UI-Controls

    • Label

    • TextField

    • TextArea

    • Button

    • Hyperlink

    • ImageView

    • MenuBar

    • Menu

    • MenuItem

  • Container und Elemente mit Container-Aspekt

    • BorderPane

    • GridPane

    • HBox

    • VBox

    • TabPane und Tab

  • Diverse weitere Klassen

    • javafx.application.Application

    • javafx.stage.Stage

    • javafx.scene.Scene

    • javafx.scene.control.Alert

  • File-Operationen

    • java.io.File

    • java.io.FileInputStream

    • java.io.IOException

    • java.io.FileNotFoundException

    • java.io.FileReader

    • java.io.FileWriter

    • java.net.URL

    • java.net.URI

    • java.net.MalformedURLException

    • javafx.stage.FileChooser

    • javafx.stage.FileChooser.ExtensionFilter

  • Datum und Zeit

    • LocalDate

    • LocalTime

    • LocalDateTime

    • DateTimeFormatter

  • Sonstiges

    • List

    • Set

    • Map

    • Exception

    • RuntimeException