diff --git a/pom.xml b/pom.xml index 306fcf070f377886ad386c2eca9e14d901246ca5..c97d20635bf94ff888cd24a78b3c8fee1d9cde59 100644 --- a/pom.xml +++ b/pom.xml @@ -41,12 +41,20 @@ <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> - <version>14</version> + <version>17</version> + <!-- Pour Mac M1+ --> + <!-- <classifier>mac-aarch64</classifier> --> + </dependency> + <dependency> + <groupId>org.openjfx</groupId> + <artifactId>javafx</artifactId> + <version>17</version> + <type>pom</type> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-swing</artifactId> - <version>14</version> + <version>17</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> diff --git a/res/stages/load-data-stage.fxml b/res/stages/load-data-stage.fxml new file mode 100644 index 0000000000000000000000000000000000000000..ba97c3cdf5fea292eb84c0fa814cf5542c102a64 --- /dev/null +++ b/res/stages/load-data-stage.fxml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.Scene?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.VBox?> +<?import javafx.stage.Stage?> + +<Stage fx:id="stage" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.LoadDataController"> + <scene> + <Scene> + <AnchorPane prefHeight="143.0" prefWidth="363.0"> + <children> + <VBox layoutX="-1.0" layoutY="1.0" prefHeight="151.0" prefWidth="364.0"> + <children> + <HBox alignment="CENTER" prefHeight="91.0" prefWidth="272.0"> + <children> + <Label fx:id="filenamelab" prefHeight="83.0" prefWidth="157.0" text="file name" /> + <Button mnemonicParsing="false" onAction="#openFileChooser" text="Parcourir" /> + </children> + </HBox> + <HBox alignment="CENTER" prefHeight="76.0" prefWidth="310.0"> + <children> + <Button mnemonicParsing="false" onAction="#validate" text="Valider" /> + </children> + </HBox> + </children> + </VBox> + </children></AnchorPane> + </Scene> + </scene> +</Stage> diff --git a/res/stages/main-stage.fxml b/res/stages/main-stage.fxml new file mode 100644 index 0000000000000000000000000000000000000000..e099e011a8ce7681c128ba314ec001f8d8aaeaeb --- /dev/null +++ b/res/stages/main-stage.fxml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.Scene?> +<?import javafx.scene.chart.CategoryAxis?> +<?import javafx.scene.chart.NumberAxis?> +<?import javafx.scene.chart.ScatterChart?> +<?import javafx.scene.control.Button?> +<?import javafx.scene.layout.AnchorPane?> +<?import javafx.scene.layout.HBox?> +<?import javafx.scene.layout.Region?> +<?import javafx.scene.layout.VBox?> +<?import javafx.stage.Stage?> + +<Stage fx:id="stage" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.MainStageController"> + <scene> + <Scene> + <AnchorPane prefHeight="487.0" prefWidth="692.0"> + <children> + <VBox prefHeight="488.0" prefWidth="691.0"> + <children> + <HBox prefHeight="305.0" prefWidth="691.0"> + <children> + <Region prefHeight="200.0" prefWidth="200.0" /> + <ScatterChart prefHeight="213.0" prefWidth="557.0"> + <xAxis> + <CategoryAxis side="BOTTOM" /> + </xAxis> + <yAxis> + <NumberAxis side="LEFT" /> + </yAxis> + </ScatterChart> + <Region prefHeight="200.0" prefWidth="200.0" /> + </children> + </HBox> + <Region prefHeight="77.0" prefWidth="691.0" /> + <HBox prefHeight="100.0" prefWidth="200.0"> + <children> + <Region prefHeight="101.0" prefWidth="131.0" /> + <Button mnemonicParsing="false" onAction="#openLoadData" prefHeight="27.0" prefWidth="122.0" text="Charger" /> + <Region prefHeight="101.0" prefWidth="75.0" /> + <Button mnemonicParsing="false" prefHeight="25.0" prefWidth="129.0" text="Classifier" /> + <Region prefHeight="101.0" prefWidth="70.0" /> + <Button mnemonicParsing="false" prefHeight="26.0" prefWidth="133.0" text="Reglages" /> + <Region prefHeight="101.0" prefWidth="111.0" /> + </children> + </HBox> + </children> + </VBox> + </children></AnchorPane> + </Scene> + </scene> +</Stage> diff --git a/src/main/java/fr/univlille/sae/classification/ClassificationApp.java b/src/main/java/fr/univlille/sae/classification/ClassificationApp.java deleted file mode 100644 index 629539234881dc47173492b0ab04392868b2c3c3..0000000000000000000000000000000000000000 --- a/src/main/java/fr/univlille/sae/classification/ClassificationApp.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.univlille.sae.classification; - -public class ClassificationApp { - - public static void main(String[] args) { - - } - - -} diff --git a/src/main/java/fr/univlille/sae/classification/Main.java b/src/main/java/fr/univlille/sae/classification/Main.java new file mode 100644 index 0000000000000000000000000000000000000000..77fa80b1a00b346d7ece5f116224b02c1127dd38 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/Main.java @@ -0,0 +1,31 @@ +package fr.univlille.sae.classification; + +import fr.univlille.sae.classification.model.ClassificationModel; +import fr.univlille.sae.classification.view.MainStageView; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.stage.Stage; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +public class Main extends Application { + + + public void start(Stage stage) throws IOException { + ClassificationModel model = new ClassificationModel(); + MainStageView view = new MainStageView(model); + + view.show(); + } + + // Ouvre l'application + public static void main(String[] args) { + Application.launch(args); + } + + + + +} diff --git a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java new file mode 100644 index 0000000000000000000000000000000000000000..190805880f62a128fdf49dde3a69deda50b35564 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java @@ -0,0 +1,54 @@ +package fr.univlille.sae.classification.controller; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.stage.FileChooser; +import javafx.stage.Stage; + +import java.io.File; + +public class LoadDataController { + + + @FXML + Stage stage; + + @FXML + Label filenamelab; + + File file; + + + public void loadData() { + + System.out.println("Loading data"); + stage.close(); + + } + + + public void openFileChooser() { + + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Choisissez le fichier à importer"); + this.file = fileChooser.showOpenDialog(stage); + + if(file != null) { + filenamelab.setText(file.getName()); + } + + } + + public void validate() { + + if (file == null) { + stage.close(); + //throw exception + } + + loadData(); + } + + + +} diff --git a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java index 9b40afd67cd1af4259ce47e832520dc3a4492e09..636343a65bd217bbaad2497b3688ad8aee68b5de 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java @@ -27,9 +27,9 @@ public class MainStageController { public void openLoadData() throws IOException { - /* + FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "main-stage.fxml").toURI().toURL(); + URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "load-data-stage.fxml").toURI().toURL(); if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); @@ -44,7 +44,7 @@ public class MainStageController { loadStage.setTitle("Chargement des donées"); loadStage.showAndWait(); - */ + } diff --git a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java new file mode 100644 index 0000000000000000000000000000000000000000..1bfdec5b51e9508249a2673a916238a80bf7a764 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java @@ -0,0 +1,53 @@ +package fr.univlille.sae.classification.model; + +import fr.univlille.sae.classification.utils.Observable; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Set; + +public class ClassificationModel extends Observable { + + + private List<LoadableData> datas; + private List<LoadableData> dataToClass; + + public ClassificationModel() { + this.datas = new ArrayList<>(); + + } + + /** + * TODO + * @param x + * @param y + */ + private void ajouterDonnee(double x, double y) { + + } + + + /** + * TODO + * @param file + */ + private void loadData(File file) { + + } + + /** + * TODO + * @param data + */ + private void classifierDonnee(LoadableData data) { + + List<String> classes = new ArrayList<>(data.getClassificationTypes()); + Random rdm = new Random(); + data.setClassification(classes.get(rdm.nextInt(classes.size()))); + + } + + +} diff --git a/src/main/java/fr/univlille/sae/classification/model/Iris.java b/src/main/java/fr/univlille/sae/classification/model/Iris.java new file mode 100644 index 0000000000000000000000000000000000000000..b30835b3751bee9f6034c71b0a458ccf2c1daabf --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java @@ -0,0 +1,46 @@ +package fr.univlille.sae.classification.model; + +import java.util.Set; + +public class Iris extends LoadableData{ + + + private double sepalWidth; + private double sepalLength; + private double petalWidth; + private double petalLength; + + + + + public Iris(double sepalWidth, double sepalLength, double petalWidth, double petalLength) { + this(sepalWidth, sepalLength, petalWidth, petalLength, "undefined"); + } + + public Iris(double sepalWidth, double sepalLength, double petalWidth, double petalLength, String classification) { + super(); + this.sepalWidth = sepalWidth; + this.sepalLength = sepalLength; + this.petalWidth = petalWidth; + this.petalLength = petalLength; + } + + + + + public double getSepalWidth() { + return sepalWidth; + } + + public double getSepalLength() { + return sepalLength; + } + + public double getPetalWidth() { + return petalWidth; + } + + public double getPetalLength() { + return petalLength; + } +} diff --git a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java new file mode 100644 index 0000000000000000000000000000000000000000..4de0abe4a687b74074761c54657795809bda17bb --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -0,0 +1,25 @@ +package fr.univlille.sae.classification.model; + +import java.util.Set; + +public class LoadableData { + + private static Set<String> classificationTypes; + + private String classification; + + + public LoadableData() { + + } + public String getClassification() { + return this.classification; + } + Set<String> getClassificationTypes() { + return classificationTypes; + } + void setClassification(String classification) { + this.classification = classification; + } + +} diff --git a/src/main/java/fr/univlille/sae/classification/utils/Observable.java b/src/main/java/fr/univlille/sae/classification/utils/Observable.java new file mode 100644 index 0000000000000000000000000000000000000000..78a076d96c9ba7fc6afd725bad3ad2e9e8a0d86c --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/utils/Observable.java @@ -0,0 +1,39 @@ +package fr.univlille.sae.classification.utils; + +import java.util.Collection; +import java.util.HashSet; + +public abstract class Observable { + + + protected Collection<Observer> attached = new HashSet<>(); + protected Collection<Observer> toDetach = new HashSet<>(); + + public void attach(Observer obs) { + attached.add(obs); + } + + public void detach(Observer obs) { + this.toDetach.add(obs); + } + + protected void notifyObservers() { + this.updateList(); + for (Observer o : attached) { + o.update(this); + } + } + + protected void notifyObservers(Object data) { + this.updateList(); + for (Observer o : attached) { + o.update(this, data); + } + } + + private void updateList() { + this.attached.removeAll(toDetach); + this.toDetach.clear(); + } + +} diff --git a/src/main/java/fr/univlille/sae/classification/utils/Observer.java b/src/main/java/fr/univlille/sae/classification/utils/Observer.java new file mode 100644 index 0000000000000000000000000000000000000000..e17a1a34c046e7a215b5afb60b6e712240813021 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/utils/Observer.java @@ -0,0 +1,10 @@ +package fr.univlille.sae.classification.utils; + +public interface Observer { + + + void update(Observable observable); + void update(Observable observable, Object data); + + +} diff --git a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java new file mode 100644 index 0000000000000000000000000000000000000000..226180703f21200d9c94673ba00bfc56e4184bb5 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java @@ -0,0 +1,6 @@ +package fr.univlille.sae.classification.view; + +public class LoadDataView { + + +} diff --git a/src/main/java/fr/univlille/sae/classification/view/MainStage.java b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java similarity index 58% rename from src/main/java/fr/univlille/sae/classification/view/MainStage.java rename to src/main/java/fr/univlille/sae/classification/view/MainStageView.java index 350ba9a8b8cd5f321dda31d5cd1485e24400820d..159c4639e73dff13d5a2db8af434c181697a836b 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStage.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -1,5 +1,8 @@ package fr.univlille.sae.classification.view; +import fr.univlille.sae.classification.model.ClassificationModel; +import fr.univlille.sae.classification.utils.Observable; +import fr.univlille.sae.classification.utils.Observer; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.stage.Stage; @@ -8,10 +11,18 @@ import java.io.File; import java.io.IOException; import java.net.URL; -public class MainStage extends Application { +public class MainStageView implements Observer { - public void start(Stage stage) throws IOException { + private ClassificationModel model; + + public MainStageView(ClassificationModel model) { + this.model = model; + model.attach(this); + } + + + public void show() throws IOException { FXMLLoader loader = new FXMLLoader(); URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "main-stage.fxml").toURI().toURL(); @@ -25,15 +36,16 @@ public class MainStage extends Application { root.setResizable(false); root.setTitle("SAE3.3 - Logiciel de classification"); root.show(); - } - // Ouvre l'application - public static void main(String[] args) { - Application.launch(args); - } + @Override + public void update(Observable observable) { + } + @Override + public void update(Observable observable, Object data) { + } }