commit afe9208c71aad6e21061854c628bd3a03d51405b Author: naumueller <> Date: Sun Oct 19 15:37:07 2025 +0200 First GUI with Metadata dialog created diff --git a/nbactions.xml b/nbactions.xml new file mode 100644 index 0000000..a0cb38e --- /dev/null +++ b/nbactions.xml @@ -0,0 +1,40 @@ + + + + run + + jar + + + clean + javafx:run + + + + debug + + clean + javafx:run@ide-debug + + + true + + + + profile + + clean + javafx:run@ide-profile + + + + CUSTOM-jlink + jlink + + clean + + compile + javafx:jlink + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..af04bce --- /dev/null +++ b/pom.xml @@ -0,0 +1,89 @@ + + 4.0.0 + efi.projekt + Gesundheitsassistent + 1.0-SNAPSHOT + + UTF-8 + 11 + 11 + + + + org.openjfx + javafx-controls + 13 + + + org.openjfx + javafx-fxml + 13 + + + io.github.mkpaz + atlantafx-base + 2.1.0 + jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + 11 + + + + org.openjfx + javafx-maven-plugin + 0.0.4 + + efi.projekt.gesundheitsassistent.FxStart + + + + + + default-cli + + + + + debug + + + + + + + + + ide-debug + + + + + + + + + ide-profile + + + + + + + + + + + + + + + diff --git a/src/main/java/efi/projekt/gesundheitsassistent/FxStart.java b/src/main/java/efi/projekt/gesundheitsassistent/FxStart.java new file mode 100644 index 0000000..807c127 --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/FxStart.java @@ -0,0 +1,73 @@ +package efi.projekt.gesundheitsassistent; + +import atlantafx.base.theme.NordDark; +import efi.projekt.gesundheitsassistent.controller.MetadataDialogController; +import efi.projekt.gesundheitsassistent.model.Metadata; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.io.IOException; + +public class FxStart extends Application { + + private static Scene scene; + private Metadata metadata; // das zentrale Model + + @Override + public void start(Stage primaryStage) throws IOException { + + // 1️⃣ Metadata Model erzeugen + metadata = new Metadata(); + + // 2️⃣ Metadata Dialog laden + FXMLLoader dialogLoader = new FXMLLoader(getClass() + .getResource("/efi/projekt/gesundheitsassistent/view/MetadataDialog.fxml")); + Parent dialogRoot = dialogLoader.load(); + + // Controller bekommen und Model übergeben + MetadataDialogController dialogController = dialogLoader.getController(); + dialogController.setMetadata(metadata); + + // 3️⃣ Dialog Stage erzeugen + Stage dialogStage = new Stage(); + dialogStage.setTitle("Metadaten eingeben"); + dialogStage.initModality(Modality.APPLICATION_MODAL); // blockiert Hauptfenster + dialogStage.setScene(new Scene(dialogRoot)); + dialogStage.showAndWait(); // wartet bis Dialog geschlossen wird + + // 4️⃣ Hauptfenster laden + FXMLLoader mainLoader = new FXMLLoader(getClass() + .getResource("/efi/projekt/gesundheitsassistent/view/FxView.fxml")); + Parent mainRoot = mainLoader.load(); + + scene = new Scene(mainRoot, 1280, 720); + Application.setUserAgentStylesheet(new NordDark().getUserAgentStylesheet()); + + primaryStage.setTitle("Virtueller Gesundheitsassistent"); + primaryStage.setScene(scene); + primaryStage.show(); + } + + static void setRoot(String fxml) throws IOException { + scene.setRoot(loadFXML(fxml)); + } + + private static Parent loadFXML(String fxml) throws IOException { + FXMLLoader fxmlLoader = new FXMLLoader( + FxStart.class.getResource("/efi/projekt/gesundheitsassistent/view/" + fxml + ".fxml") + ); + return fxmlLoader.load(); + } + + public static void main(String[] args) { + launch(); + } + + public Metadata getMetadata() { + return metadata; + } +} diff --git a/src/main/java/efi/projekt/gesundheitsassistent/controller/FxViewController.java b/src/main/java/efi/projekt/gesundheitsassistent/controller/FxViewController.java new file mode 100644 index 0000000..39587cf --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/controller/FxViewController.java @@ -0,0 +1,48 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/javafx/FXMLController.java to edit this template + */ +package efi.projekt.gesundheitsassistent.controller; + +import efi.projekt.gesundheitsassistent.model.FxModel; +import java.net.URL; +import java.util.ResourceBundle; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; + +/** + * FXML Controller class + * + * @author aumni + */ +public class FxViewController implements Initializable { + + private FxModel model; + + @FXML + private Button exitButton; + + /** + * Initializes the controller class. + */ + @Override + public void initialize(URL url, ResourceBundle rb) { + + } + + @FXML + private void handleExit() { + Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Programm wirklich beenden?"); + alert.showAndWait() + .filter(response -> response == ButtonType.OK) + .ifPresent(response -> System.exit(0)); + + } + + public void setModel(FxModel model) { + this.model = model; + } +} diff --git a/src/main/java/efi/projekt/gesundheitsassistent/controller/MetadataDialogController.java b/src/main/java/efi/projekt/gesundheitsassistent/controller/MetadataDialogController.java new file mode 100644 index 0000000..47d90a7 --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/controller/MetadataDialogController.java @@ -0,0 +1,76 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package efi.projekt.gesundheitsassistent.controller; + +import efi.projekt.gesundheitsassistent.model.Metadata; +import javafx.fxml.FXML; +import javafx.scene.control.Alert; +import javafx.scene.control.ButtonType; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.TextField; +import javafx.stage.Stage; + +/** + * + * @author aumni + */ +public class MetadataDialogController { + + @FXML + private TextField nameField; + + @FXML + private TextField ageField; + + @FXML + private ChoiceBox genderChoiceBox; + + @FXML + private TextField heightField; + + @FXML + private TextField weightField; + + private Metadata metadata; + + public void initialize() { + // ChoiceBox füllen + genderChoiceBox.getItems().addAll("Männlich", "Weiblich", "Divers"); + genderChoiceBox.setValue("Männlich"); // default + } + + public void setMetadata(Metadata metadata) { + this.metadata = metadata; + bindFields(); + } + + private void bindFields() { + // Bidirektionales Binding zwischen Model und UI + nameField.textProperty().bindBidirectional(metadata.nameProperty()); + ageField.textProperty().bindBidirectional(metadata.ageProperty(), new javafx.util.converter.NumberStringConverter()); + genderChoiceBox.valueProperty().bindBidirectional(metadata.genderProperty()); + heightField.textProperty().bindBidirectional(metadata.heightProperty(), new javafx.util.converter.NumberStringConverter()); + weightField.textProperty().bindBidirectional(metadata.weightProperty(), new javafx.util.converter.NumberStringConverter()); + } + + @FXML + private void handleOk() { + try { + metadata.validate(); + // Dialog schließen + Stage stage = (Stage) nameField.getScene().getWindow(); + stage.close(); + } catch (IllegalArgumentException e) { + Alert alert = new Alert(Alert.AlertType.ERROR, e.getMessage(), ButtonType.OK); + alert.showAndWait(); + } + } + + @FXML + private void handleCancel() { + Stage stage = (Stage) nameField.getScene().getWindow(); + stage.close(); + } +} diff --git a/src/main/java/efi/projekt/gesundheitsassistent/model/FxModel.java b/src/main/java/efi/projekt/gesundheitsassistent/model/FxModel.java new file mode 100644 index 0000000..912bbf8 --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/model/FxModel.java @@ -0,0 +1,37 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package efi.projekt.gesundheitsassistent.model; + +import java.io.Serializable; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; + +/** + * + * @author aumni + */ +/** + * Superklasse für alle Modelle + */ + +public class FxModel implements Serializable { + + private final StringProperty id = new SimpleStringProperty(this, "id"); + + public FxModel() {} + + public FxModel(String id) { + this.id.set(id); + } + + public StringProperty idProperty() { return id; } + public String getId() { return id.get(); } + public void setId(String id) { this.id.set(id); } + + public void validate() throws IllegalArgumentException { + // Subklassen können überschreiben + } +} + diff --git a/src/main/java/efi/projekt/gesundheitsassistent/model/Metadata.java b/src/main/java/efi/projekt/gesundheitsassistent/model/Metadata.java new file mode 100644 index 0000000..96d5995 --- /dev/null +++ b/src/main/java/efi/projekt/gesundheitsassistent/model/Metadata.java @@ -0,0 +1,100 @@ +/* + * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license + * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template + */ +package efi.projekt.gesundheitsassistent.model; + +import javafx.beans.property.*; + +/** + * + * @author aumni + */ +public class Metadata extends FxModel { + private StringProperty name = new SimpleStringProperty(this, "name"); + private IntegerProperty age = new SimpleIntegerProperty(this, "age"); + private StringProperty gender = new SimpleStringProperty(this, "gender"); + private DoubleProperty height = new SimpleDoubleProperty(this, "height"); //in cm + private DoubleProperty weight = new SimpleDoubleProperty(this, "weight"); //in kg + + public Metadata() {}; + + public Metadata(String name, int age, String gender, double height, double weight) { + this.name.set(name); + this.age.set(age); + this.gender.set(gender); + this.height.set(height); + this.weight.set(weight); + } + + // Properties + public StringProperty nameProperty() { + return name; + } + + public IntegerProperty ageProperty() { + return age; + } + + public StringProperty genderProperty() { + return gender; + } + + public DoubleProperty heightProperty() { + return height; + } + + public DoubleProperty weightProperty() { + return weight; + } + + //Getter & Setter + public String getName() { + return name.get(); + } + + public void setName(String name) { + this.name.set(name); + } + + public int getAge() { + return age.get(); + } + + public void setAge(int age) { + this.age.set(age); + } + + public String getGender() { + return gender.get(); + } + + public void setGender(String gender) { + this.gender.set(gender); + } + + public double getHeight() { + return height.get(); + } + + public void setHeight(double height) { + this.height.set(height); + } + + public double getWeight() { + return weight.get(); + } + + public void setWeight(double weight) { + this.weight.set(weight); + } + + @Override + public void validate() { + if (getName() == null || getName().isBlank()) throw new IllegalArgumentException("Name darf nicht leer sein") ; + if (getAge() < 0) throw new IllegalArgumentException("Alter darf nicht negativ sein"); + if (getGender() == null || getGender().isBlank()) throw new IllegalArgumentException("Geschlecht muss gesetzt sein"); + if (getHeight() <= 0) throw new IllegalArgumentException("Größe muss größer 0 sein"); + if (getWeight() <= 0) throw new IllegalArgumentException("Gewicht muss größer 0 sein"); + } +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java new file mode 100644 index 0000000..449cd3d --- /dev/null +++ b/src/main/java/module-info.java @@ -0,0 +1,13 @@ +module efi.projekt.gesundheitsassistent { + requires javafx.controls; + requires javafx.fxml; + requires java.base; + requires atlantafx.base; + + opens efi.projekt.gesundheitsassistent to javafx.fxml; + opens efi.projekt.gesundheitsassistent.controller to javafx.fxml; + + exports efi.projekt.gesundheitsassistent; + exports efi.projekt.gesundheitsassistent.controller; +} + diff --git a/src/main/resources/efi/projekt/gesundheitsassistent/styles/fxview.css b/src/main/resources/efi/projekt/gesundheitsassistent/styles/fxview.css new file mode 100644 index 0000000..d0a5706 --- /dev/null +++ b/src/main/resources/efi/projekt/gesundheitsassistent/styles/fxview.css @@ -0,0 +1,93 @@ +/* + * Empty Stylesheet file. + */ + +.mainFxmlClass { + +} + +/* ========================================================= + Virtueller Gesundheitsassistent - Fahrzeug UI Design + ========================================================= */ + +.root { + -fx-font-family: "Segoe UI", "Roboto", sans-serif; + -fx-background-color: linear-gradient(to bottom, #0f2027, #203a43, #2c5364); + -fx-text-fill: #e0e0e0; +} + +/* -------------------- Überschriften & Text -------------------- */ +.label { + -fx-text-fill: #ffffff; + -fx-font-size: 16px; +} + +.title-label { + -fx-font-size: 22px; + -fx-font-weight: bold; +} + +/* -------------------- Buttons -------------------- */ +.button { + -fx-background-color: linear-gradient(to bottom, #00b4db, #0083b0); + -fx-text-fill: white; + -fx-font-size: 16px; + -fx-background-radius: 10; + -fx-padding: 8 20; +} + +.button:hover { + -fx-background-color: linear-gradient(to bottom, #00d2ff, #3a7bd5); +} + +/* -------------------- Panels -------------------- */ +.titled-pane { + -fx-background-color: #1b2838; + -fx-text-fill: #ffffff; +} + +.titled-pane > .title { + -fx-background-color: #273b4a; + -fx-padding: 10; +} + +.titled-pane > .content { + -fx-background-color: #1f2f3a; +} + +/* -------------------- Charts -------------------- */ +.chart { + -fx-background-color: transparent; +} + +.chart-plot-background { + -fx-background-color: rgba(255, 255, 255, 0.05); + -fx-border-color: #00b4db; + -fx-border-radius: 8; +} + +.axis { + -fx-tick-label-fill: #cccccc; +} + +.axis-label { + -fx-text-fill: #ffffff; +} + +/* -------------------- Avatar Container -------------------- */ +#avatarContainer { + -fx-background-color: rgba(0, 0, 0, 0.3); + -fx-border-color: #00b4db; + -fx-border-width: 2; + -fx-border-radius: 12; +} + +/* -------------------- Scrollbar -------------------- */ +.scroll-bar:horizontal, .scroll-bar:vertical { + -fx-background-color: transparent; +} + +.scroll-bar .thumb { + -fx-background-color: #00b4db; + -fx-background-radius: 10; +} diff --git a/src/main/resources/efi/projekt/gesundheitsassistent/view/FxView.fxml b/src/main/resources/efi/projekt/gesundheitsassistent/view/FxView.fxml new file mode 100644 index 0000000..216e4c7 --- /dev/null +++ b/src/main/resources/efi/projekt/gesundheitsassistent/view/FxView.fxml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + +