From 371656572c3ddb92733e338a60753c6ffad7ec4c Mon Sep 17 00:00:00 2001 From: Konrad Neitzel Date: Sat, 22 Mar 2025 22:56:53 +0100 Subject: [PATCH] First try to build some component based solution. --- README.md | 29 +++ injectfx-example/pom.xml | 2 +- .../neitzelfx/component/example/Address.java | 11 + .../component/example/ExampleApp.java | 36 ++++ .../neitzelfx/component/example/Main.java | 17 ++ .../neitzelfx/component/example/Person.java | 11 + .../injectfx/example/JavaFXApp.java | 2 +- .../injectfx/example/Main.java | 2 +- .../injectfx/example/MainWindow.java | 2 +- .../src/main/resources/address.fxml | 17 ++ .../injectfx/example/MainWindow.fxml | 2 +- .../src/main/resources/person.fxml | 18 ++ injectfx-lib/pom.xml | 2 +- .../neitzelfx/component/AutoViewModel.java | 108 ++++++++++ .../component/ComponentController.java | 23 +++ .../neitzelfx/component/ComponentLoader.java | 188 ++++++++++++++++++ .../injectfx/FXMLComponentInstances.java | 2 +- .../injectfx/InjectableComponentScanner.java | 4 +- .../injectfx/InjectingControllerFactory.java | 2 +- .../injectfx/InjectingFXMLLoader.java | 2 +- .../injectfx/annotation/FXMLComponent.java | 2 +- .../injectfx/annotation/FXMLConfig.java | 2 +- .../neitzel/neitzelfx/mvvm/BindDirection.java | 50 +++++ .../mvvm/BindingAwareFXMLLoader.java | 116 +++++++++++ .../neitzelfx/mvvm/GenericViewController.java | 56 ++++++ .../neitzelfx/mvvm/GenericViewModel.java | 141 +++++++++++++ .../testcomponents/test1ok/SuperClass.java | 4 - .../test1ok/TestInterface1_1.java | 4 - .../test1ok/TestInterface1_2.java | 4 - .../test1ok/sub/TestComponent1_2.java | 12 -- .../InjectableComponentScannerTest.java | 12 +- .../testcomponents/test1ok/SuperClass.java | 4 + .../test1ok/TestComponent1_1.java | 4 +- .../test1ok/TestInterface1_1.java | 4 + .../test1ok/TestInterface1_2.java | 4 + .../test1ok/sub/TestComponent1_2.java | 12 ++ .../test2fail/TestComponent2_1.java | 4 +- pom.xml | 5 + 38 files changed, 873 insertions(+), 47 deletions(-) create mode 100644 README.md create mode 100644 injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Address.java create mode 100644 injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/ExampleApp.java create mode 100644 injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Main.java create mode 100644 injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Person.java rename injectfx-example/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/example/JavaFXApp.java (93%) rename injectfx-example/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/example/Main.java (89%) rename injectfx-example/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/example/MainWindow.java (93%) create mode 100644 injectfx-example/src/main/resources/address.fxml rename injectfx-example/src/main/resources/de/neitzel/{ => neitzelfx}/injectfx/example/MainWindow.fxml (87%) create mode 100644 injectfx-example/src/main/resources/person.fxml create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/component/AutoViewModel.java create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/component/ComponentController.java create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/component/ComponentLoader.java rename injectfx-lib/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/FXMLComponentInstances.java (99%) rename injectfx-lib/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/InjectableComponentScanner.java (98%) rename injectfx-lib/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/InjectingControllerFactory.java (97%) rename injectfx-lib/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/InjectingFXMLLoader.java (97%) rename injectfx-lib/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/annotation/FXMLComponent.java (83%) rename injectfx-lib/src/main/java/de/neitzel/{ => neitzelfx}/injectfx/annotation/FXMLConfig.java (85%) create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/mvvm/BindDirection.java create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/mvvm/BindingAwareFXMLLoader.java create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/mvvm/GenericViewController.java create mode 100644 injectfx-lib/src/main/java/de/neitzel/neitzelfx/mvvm/GenericViewModel.java delete mode 100644 injectfx-lib/src/test/java/de/neitzel/injectfx/testcomponents/test1ok/SuperClass.java delete mode 100644 injectfx-lib/src/test/java/de/neitzel/injectfx/testcomponents/test1ok/TestInterface1_1.java delete mode 100644 injectfx-lib/src/test/java/de/neitzel/injectfx/testcomponents/test1ok/TestInterface1_2.java delete mode 100644 injectfx-lib/src/test/java/de/neitzel/injectfx/testcomponents/test1ok/sub/TestComponent1_2.java rename injectfx-lib/src/test/java/de/neitzel/{ => neitzelfx}/injectfx/InjectableComponentScannerTest.java (81%) create mode 100644 injectfx-lib/src/test/java/de/neitzel/neitzelfx/injectfx/testcomponents/test1ok/SuperClass.java rename injectfx-lib/src/test/java/de/neitzel/{ => neitzelfx}/injectfx/testcomponents/test1ok/TestComponent1_1.java (52%) create mode 100644 injectfx-lib/src/test/java/de/neitzel/neitzelfx/injectfx/testcomponents/test1ok/TestInterface1_1.java create mode 100644 injectfx-lib/src/test/java/de/neitzel/neitzelfx/injectfx/testcomponents/test1ok/TestInterface1_2.java create mode 100644 injectfx-lib/src/test/java/de/neitzel/neitzelfx/injectfx/testcomponents/test1ok/sub/TestComponent1_2.java rename injectfx-lib/src/test/java/de/neitzel/{ => neitzelfx}/injectfx/testcomponents/test2fail/TestComponent2_1.java (53%) diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ea55c4 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# JavaFX Maven Project + +Example Maven Project for a JavaFX Application. + +**Update**: Added profile fatjar + +**Update**: Added reporting to create a site (html documentation of project) + +**Update**: Java 21 is now fully supported + +This projects includes multiple plugins: +- Build of an App-Image using JPackage (Profile: image) +- Build of an fat jar (Profile: fatjar) +- Use of Maven Wrapper +- Static code analysis with PMD and Spotbugs +- Check of dependency updates during build +- JavaFX plugin to start application + +**Requirements** +To use this Template, all you need is a local Java Installation. +My current advice is to use a long term supported (LTS) version of either Java 17 or Java 21. + +**[Documentation in English](documentation/en/_Index.md)** + +**[Dokumentation in Deutsch](documentation/de/_Index.md)** + +**Important: ChatGPT was utilized to generate the documentation based on +predefined content specifications, as it represents the fastest way to produce +comprehensive documentation.** \ No newline at end of file diff --git a/injectfx-example/pom.xml b/injectfx-example/pom.xml index 48f7828..0040265 100644 --- a/injectfx-example/pom.xml +++ b/injectfx-example/pom.xml @@ -16,7 +16,7 @@ ${project.artifactId} ${project.artifactId} ${project.artifactId} - de.neitzel.injectfx.example.Main + de.neitzel.neitzelfx.injectfx.example.Main ${project.artifactId}-${project.version} diff --git a/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Address.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Address.java new file mode 100644 index 0000000..12d9335 --- /dev/null +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Address.java @@ -0,0 +1,11 @@ +package de.neitzel.neitzelfx.component.example; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Address { + private String street; + private String city; +} \ No newline at end of file diff --git a/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/ExampleApp.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/ExampleApp.java new file mode 100644 index 0000000..6ce3978 --- /dev/null +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/ExampleApp.java @@ -0,0 +1,36 @@ +package de.neitzel.neitzelfx.component.example; + +import de.neitzel.neitzelfx.component.ComponentLoader; +import javafx.application.Application; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +public class ExampleApp extends Application { + + @Override + public void start(Stage primaryStage) throws Exception { + // Beispielmodel initialisieren + Address address = new Address(); + address.setStreet("Sample Street 1"); + address.setCity("Sample City"); + + Person person = new Person(); + person.setName("Max Mustermann"); + person.setAddress(address); + + // ComponentLoader verwenden + ComponentLoader loader = new ComponentLoader(); + Parent root = loader.load(person, "/person.fxml"); + + // Scene erstellen und anzeigen + Scene scene = new Scene(root); + primaryStage.setTitle("ComponentLoader Example"); + primaryStage.setScene(scene); + primaryStage.show(); + } + + public static void main(String[] args) { + launch(); + } +} \ No newline at end of file diff --git a/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Main.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Main.java new file mode 100644 index 0000000..0e3df0d --- /dev/null +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Main.java @@ -0,0 +1,17 @@ +package de.neitzel.neitzelfx.component.example; + +import de.neitzel.neitzelfx.injectfx.example.JavaFXApp; + +/** + * Another Main class as workaround when the JavaFX Application ist started without + * taking care os Classloader Requirements of JavaFX. (Important when starting from inside NetBeans!) + */ +public class Main { + /** + * Additional main methode to start Application. + * @param args Commandline Arguments. + */ + public static void main(String[] args) { + ExampleApp.main(args); + } +} diff --git a/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Person.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Person.java new file mode 100644 index 0000000..69babf2 --- /dev/null +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/component/example/Person.java @@ -0,0 +1,11 @@ +package de.neitzel.neitzelfx.component.example; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class Person { + private String name; + private Address address; +} diff --git a/injectfx-example/src/main/java/de/neitzel/injectfx/example/JavaFXApp.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/JavaFXApp.java similarity index 93% rename from injectfx-example/src/main/java/de/neitzel/injectfx/example/JavaFXApp.java rename to injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/JavaFXApp.java index 2d1ca44..91937be 100644 --- a/injectfx-example/src/main/java/de/neitzel/injectfx/example/JavaFXApp.java +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/JavaFXApp.java @@ -1,4 +1,4 @@ -package de.neitzel.injectfx.example; +package de.neitzel.neitzelfx.injectfx.example; import javafx.application.Application; import javafx.fxml.FXMLLoader; diff --git a/injectfx-example/src/main/java/de/neitzel/injectfx/example/Main.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/Main.java similarity index 89% rename from injectfx-example/src/main/java/de/neitzel/injectfx/example/Main.java rename to injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/Main.java index 2343191..88a30fe 100644 --- a/injectfx-example/src/main/java/de/neitzel/injectfx/example/Main.java +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/Main.java @@ -1,4 +1,4 @@ -package de.neitzel.injectfx.example; +package de.neitzel.neitzelfx.injectfx.example; /** * Another Main class as workaround when the JavaFX Application ist started without diff --git a/injectfx-example/src/main/java/de/neitzel/injectfx/example/MainWindow.java b/injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/MainWindow.java similarity index 93% rename from injectfx-example/src/main/java/de/neitzel/injectfx/example/MainWindow.java rename to injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/MainWindow.java index 27802f7..7888b5e 100644 --- a/injectfx-example/src/main/java/de/neitzel/injectfx/example/MainWindow.java +++ b/injectfx-example/src/main/java/de/neitzel/neitzelfx/injectfx/example/MainWindow.java @@ -1,4 +1,4 @@ -package de.neitzel.injectfx.example; +package de.neitzel.neitzelfx.injectfx.example; import javafx.event.ActionEvent; import javafx.fxml.FXML; diff --git a/injectfx-example/src/main/resources/address.fxml b/injectfx-example/src/main/resources/address.fxml new file mode 100644 index 0000000..ab51c1e --- /dev/null +++ b/injectfx-example/src/main/resources/address.fxml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/injectfx-example/src/main/resources/de/neitzel/injectfx/example/MainWindow.fxml b/injectfx-example/src/main/resources/de/neitzel/neitzelfx/injectfx/example/MainWindow.fxml similarity index 87% rename from injectfx-example/src/main/resources/de/neitzel/injectfx/example/MainWindow.fxml rename to injectfx-example/src/main/resources/de/neitzel/neitzelfx/injectfx/example/MainWindow.fxml index 5e84972..bc561e9 100644 --- a/injectfx-example/src/main/resources/de/neitzel/injectfx/example/MainWindow.fxml +++ b/injectfx-example/src/main/resources/de/neitzel/neitzelfx/injectfx/example/MainWindow.fxml @@ -3,7 +3,7 @@ - +