refactor: removed MainFXMLController from dependencies
Replaced MainFXMLController-based scene-changing with event-based scene-changing to remove cyclic dependency
This commit is contained in:
@@ -5,6 +5,10 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Annotates a method to be executed after all dependencies annotates with {@link Inject}
|
||||
* have been injected.
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
public @interface AfterInject { }
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package ch.zhaw.gartenverwaltung.bootstrap;
|
||||
|
||||
import ch.zhaw.gartenverwaltung.HelloApplication;
|
||||
import ch.zhaw.gartenverwaltung.MainFXMLController;
|
||||
import ch.zhaw.gartenverwaltung.io.CropList;
|
||||
import ch.zhaw.gartenverwaltung.io.JsonCropList;
|
||||
import ch.zhaw.gartenverwaltung.io.JsonPlantList;
|
||||
@@ -13,7 +12,6 @@ import ch.zhaw.gartenverwaltung.models.GardenSchedule;
|
||||
import ch.zhaw.gartenverwaltung.models.PlantListModel;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.layout.AnchorPane;
|
||||
import javafx.scene.layout.Pane;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
@@ -39,14 +37,19 @@ public class AppLoader {
|
||||
|
||||
private final GardenSchedule gardenSchedule = new GardenSchedule(taskList, plantList);
|
||||
private final Garden garden = new Garden(gardenSchedule, cropList);
|
||||
private final MainFXMLController mainController;
|
||||
|
||||
|
||||
public AppLoader(MainFXMLController mainController) throws IOException {
|
||||
this.mainController = mainController;
|
||||
public AppLoader() throws IOException {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Loads and returns a {@link Pane} (cached).
|
||||
*
|
||||
* @param fxmlFile The file name to be loaded
|
||||
* @return The loaded Pane
|
||||
* @throws IOException if the file could not be loaded
|
||||
*/
|
||||
public Pane loadPane(String fxmlFile) throws IOException {
|
||||
Pane pane = panes.get(fxmlFile);
|
||||
if (pane == null) {
|
||||
@@ -56,6 +59,16 @@ public class AppLoader {
|
||||
return pane;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given fxml-file from resources (no caching) and creates a new {@link Scene},
|
||||
* which is then appended to the given {@link Stage}.
|
||||
* Performs dependency-injection.
|
||||
*
|
||||
* @param fxmlFile The file name to be loaded
|
||||
* @param appendee The {@link Stage} to which the new {@link Scene} is appended.
|
||||
* @return The controller of the loaded scene.
|
||||
* @throws IOException if the file could not be loaded
|
||||
*/
|
||||
public Object loadSceneToStage(String fxmlFile, Stage appendee) throws IOException {
|
||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
||||
Pane root = loader.load();
|
||||
@@ -65,13 +78,27 @@ public class AppLoader {
|
||||
return controller;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given fxml-file from resources and caches the pane.
|
||||
* Performs dependency-injection.
|
||||
*
|
||||
* @param fxmlFile The file name to be loaded
|
||||
* @throws IOException if the file could not be loaded
|
||||
*/
|
||||
public void loadAndCacheFxml(String fxmlFile) throws IOException {
|
||||
FXMLLoader loader = new FXMLLoader(Objects.requireNonNull(HelloApplication.class.getResource(fxmlFile)));
|
||||
AnchorPane anchorPane = loader.load();
|
||||
panes.put(fxmlFile, anchorPane);
|
||||
Pane pane = loader.load();
|
||||
panes.put(fxmlFile, pane);
|
||||
annotationInject(loader.getController());
|
||||
}
|
||||
|
||||
/**
|
||||
* Injects the applications dependencies into the given object's fields annotated with {@link Inject}.
|
||||
* Afterwards, all methods on the objects annotated with {@link AfterInject} are executed.
|
||||
* (Success of the injections is not guaranteed!)
|
||||
*
|
||||
* @param controller The class containing the injectable fields
|
||||
*/
|
||||
public void annotationInject(Object controller) {
|
||||
Arrays.stream(controller.getClass().getDeclaredFields())
|
||||
.filter(field -> field.isAnnotationPresent(Inject.class))
|
||||
@@ -104,7 +131,6 @@ public class AppLoader {
|
||||
case "PlantList" -> plantList;
|
||||
case "PlantListModel" -> new PlantListModel(plantList);
|
||||
case "GardenSchedule" -> gardenSchedule;
|
||||
case "MainFXMLController" -> mainController;
|
||||
case "AppLoader" -> this;
|
||||
default -> null;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
package ch.zhaw.gartenverwaltung.bootstrap;
|
||||
|
||||
import javafx.event.Event;
|
||||
import javafx.event.EventType;
|
||||
|
||||
public class ChangeViewEvent extends Event {
|
||||
private final String view;
|
||||
|
||||
public static final EventType<ChangeViewEvent> CHANGE_MAIN_VIEW = new EventType<>("CHANGE_MAIN_VIEW");
|
||||
|
||||
public ChangeViewEvent(EventType<? extends Event> eventType, String view) {
|
||||
super(eventType);
|
||||
this.view = view;
|
||||
}
|
||||
|
||||
public String view() {
|
||||
return view;
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,9 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Annotates a Field to be injected from the application-dependencies
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.FIELD)
|
||||
public @interface Inject { }
|
||||
|
||||
Reference in New Issue
Block a user