diff --git a/src/main/java/fr/univlille/sae/classification/ClassificationApp.java b/src/main/java/fr/univlille/sae/classification/ClassificationApp.java index 145eb3a499cc9b13ec62058508c4933b03f4c0b2..c3c9cd7cab7f88c31ab2a550418d84daef27a770 100644 --- a/src/main/java/fr/univlille/sae/classification/ClassificationApp.java +++ b/src/main/java/fr/univlille/sae/classification/ClassificationApp.java @@ -7,9 +7,19 @@ import javafx.stage.Stage; import java.io.IOException; +/** + * Classe principale pour l'application de classification. + * Cette classe initialise et lance l'interface graphique de l'application. + */ public class ClassificationApp extends Application { + /** + * Point d'entrée principal pour l'initialisation de l'interface utilisateur. + * Cette méthode configure la vue principale en utilisant une instance du modèle + * de classification, puis affiche la fenêtre principale. + * @param stage la fenêtre principale de l'application. + */ public void start(Stage stage) throws IOException { ClassificationModel model = ClassificationModel.getClassificationModel(); MainStageView view = new MainStageView(model); @@ -17,7 +27,11 @@ public class ClassificationApp extends Application { view.show(); } - // Ouvre l'application + /** + * Point d'entrée principal de l'application. + * Cette méthode lance l'application JavaFX. + * @param args les arguments de ligne de commande. + */ public static void main(String[] args) { Application.launch(args); } diff --git a/src/main/java/fr/univlille/sae/classification/Main.java b/src/main/java/fr/univlille/sae/classification/Main.java index c1bafba0e15b9d93c8067cca55fecbe14473c900..84adac9c52050badc03a6fd071244f7d2e781d39 100644 --- a/src/main/java/fr/univlille/sae/classification/Main.java +++ b/src/main/java/fr/univlille/sae/classification/Main.java @@ -6,8 +6,14 @@ import javafx.application.Application; import javafx.stage.Stage; import java.io.IOException; - +/** + * Cette classe redirige l'exécution vers la classe principale de l'application, + */ public class Main { + /** + * Point d'entrée principal de l'application. + * @param args les arguments de ligne de commande. + */ public static void main(String[] args) { ClassificationApp.main(args); } diff --git a/src/main/java/fr/univlille/sae/classification/utils/Observer.java b/src/main/java/fr/univlille/sae/classification/utils/Observer.java index e17a1a34c046e7a215b5afb60b6e712240813021..0f7f2081b45365e98f517f4ec7fc366582e3c6cf 100644 --- a/src/main/java/fr/univlille/sae/classification/utils/Observer.java +++ b/src/main/java/fr/univlille/sae/classification/utils/Observer.java @@ -1,9 +1,28 @@ package fr.univlille.sae.classification.utils; -public interface Observer { +/** + * Interface pour implémenter le modèle Observateur. + * Cette interface définit les méthodes que les classes doivent implémenter pour agir + * comme des observateurs dans le cadre du modèle Observateur/Observé. + * Les observateurs sont notifiés des changements d'état des objets observés + * via les méthodes `update'. + */ +public interface Observer { + /** + * Méthode appelée pour notifier l'observateur qu'un changement s'est produit + * dans l'objet observé. + * @param observable l'objet observé qui a subi un changement. + */ void update(Observable observable); + + /** + * Méthode appelée pour notifier l'observateur qu'un changement s'est produit + * dans l'objet observé, avec des données supplémentaires. + * @param observable l'objet observé qui a subi un changement. + * @param data des informations supplémentaires concernant le changement. + */ void update(Observable observable, Object data); diff --git a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java index 2217c066ed36bdc8b7c4522533f301623810569e..8613467602476d7429b0085881ba871cfac2c9dd 100644 --- a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java +++ b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java @@ -92,8 +92,6 @@ public class ViewUtil { tempHBox.getChildren().addAll(rectangle, label); line.getChildren().add(tempHBox); - } - } if(colorsString.length < 7) legend.getChildren().add(line); diff --git a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java index dd613b18194e6ef2594f868ee0ea6ebcef707d4f..68d70c468c480b1ac178c38e901cfddf6f8ee524 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -1,6 +1,7 @@ package fr.univlille.sae.classification.view; import fr.univlille.sae.classification.controller.DataStageController; +import fr.univlille.sae.classification.controller.MainStageController; import fr.univlille.sae.classification.model.ClassificationModel; import fr.univlille.sae.classification.model.DataType; import fr.univlille.sae.classification.model.Iris; @@ -14,7 +15,6 @@ import javafx.scene.Node; import javafx.scene.chart.ScatterChart; import javafx.scene.chart.XYChart; import javafx.scene.layout.HBox; -import javafx.scene.layout.VBox; import javafx.scene.shape.Circle; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; @@ -33,10 +33,10 @@ import java.util.Map; */ public class DataStageView extends DataVisualizationView implements Observer { - private ClassificationModel model; - private DataStageController controller; - private Map<String, ScatterChart.Series<Double, Double>> serieList; + + + private XYChart.Series series1; private XYChart.Series series2; @@ -50,9 +50,9 @@ public class DataStageView extends DataVisualizationView implements Observer { * @param model le modèle de classification utilisé pour gérer les données. */ public DataStageView(ClassificationModel model) { - super(); - this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>(); - this.model = model; + super(model); + + this.series1 = new XYChart.Series(); this.series2 = new XYChart.Series(); this.series3 = new XYChart.Series(); @@ -78,8 +78,9 @@ public class DataStageView extends DataVisualizationView implements Observer { root.setResizable(false); root.setTitle("SAE3.3 - Logiciel de classification"); root.show(); + controller = (MainStageController) controller; controller = loader.getController(); - controller.setDataStageView(this); + ((DataStageController) controller).setDataStageView(this); scatterChart = controller.getScatterChart(); scatterChart.setLegendVisible(false); scatterChart.getData().addAll(series4, series1, series2, series3); @@ -94,125 +95,13 @@ public class DataStageView extends DataVisualizationView implements Observer { } } - /** - * Met à jour l'affichage des données en fonction des changements dans le modèle. - * @param observable modèle observé. - */ - @Override - public void update(Observable observable) { - try { - if (scatterChart == null || !(observable instanceof ClassificationModel)) { - System.err.println("Erreur de mise à jour."); - return; - } - - scatterChart.getData().clear(); - serieList.clear(); - - if (actualX == null && actualY == null) { - controller.setAxesSelected("Aucuns axes sélectionnés"); - } else { - controller.setAxesSelected(""); - controller.setAxesSelectedDisable(); - - List<LoadableData> points = new ArrayList<>(model.getDatas()); - points.addAll(model.getDataToClass().keySet()); - for (LoadableData data : points) { - Object xValue = data.getAttributesNames().get(actualX); - Object yValue = data.getAttributesNames().get(actualY); - - Double x = 0.0; - if (xValue instanceof Integer) { - x = ((Integer) xValue).doubleValue(); - } else if (xValue instanceof Double) { - x = (Double) xValue; - } - - Double y = 0.0; - if (yValue instanceof Integer) { - y = ((Integer) yValue).doubleValue(); - } else if (yValue instanceof Double) { - y = (Double) yValue; - } - - ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(x, y); - - Node nodePoint = ViewUtil.getForm(data, new Circle(5), controller); - - ScatterChart.Series<Double, Double> editSerie = serieList.get(data.getClassification()); - if(editSerie == null){ - editSerie = new ScatterChart.Series<Double, Double>(); - } - if(data.getClassification().equals("undefined") || model.getDataToClass().containsKey(data)) { - nodePoint = ViewUtil.getForm(data, new Rectangle(10,10), controller); - } - dataPoint.setNode(nodePoint); - editSerie.getData().add(dataPoint); - serieList.put(data.getClassification(), editSerie); - } - - for(String serie : serieList.keySet()) { - serieList.get(serie).setName(serie); - } - scatterChart.getData().addAll(serieList.values()); - - VBox vBox = ViewUtil.loadLegend(); - controller.loadLegend(vBox); - } - } catch (Exception e) { - System.err.println("Erreur de mise à jour : " + e.getMessage()); - } - } - - /** - * Met à jour l'affichage en ajoutant un nouveau point de données. - * @param observable modèle observé. - * @param data point de données à ajouter. - */ - @Override - public void update(Observable observable, Object data) { - try { - if (scatterChart == null || !(observable instanceof ClassificationModel)) { - System.err.println("Erreur de mise à jour."); - return; - } - LoadableData newData = (LoadableData) data; - if (actualX == null || actualY == null) { - controller.setAxesSelected("Aucuns axes sélectionnés"); - return; - } - Object attrX = newData.getAttributesNames().get(actualX); - Object attrY = newData.getAttributesNames().get(actualY); - if (attrX instanceof Integer) { - attrX = ((Integer) attrX).doubleValue(); - } - if (attrY instanceof Integer) { - attrY = ((Integer) attrY).doubleValue(); - } - XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( - (Double) attrX, - (Double) attrY - ); - - dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller)); - if (!scatterChart.getData().isEmpty()) { - series4.getData().add(dataPoint); - series4.setName("indéfini"); - scatterChart.getData().add(series4); - } - VBox vBox = ViewUtil.loadLegend(); - controller.loadLegend(vBox); - } catch (Exception e) { - System.err.println("Erreur de mise à jour : " + e.getMessage()); - } - } /** * Renvoie le contrôleur associé à cette vue. * @return contrôleur de la vue. */ public DataStageController getController() { - return controller; + return (DataStageController) controller; } /** diff --git a/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java b/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java index c3ad5af65602dcf8a469e619d393a5955429e562..0ee1a0140fd6e25ea2dba391e677ffcafbe6679a 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataVisualizationView.java @@ -1,6 +1,23 @@ package fr.univlille.sae.classification.view; +import fr.univlille.sae.classification.controller.DataStageController; +import fr.univlille.sae.classification.controller.DataVisualizationController; +import fr.univlille.sae.classification.controller.MainStageController; +import fr.univlille.sae.classification.model.ClassificationModel; +import fr.univlille.sae.classification.model.LoadableData; +import fr.univlille.sae.classification.utils.Observable; +import fr.univlille.sae.classification.utils.ViewUtil; +import javafx.scene.Node; import javafx.scene.chart.ScatterChart; +import javafx.scene.chart.XYChart; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.scene.shape.*; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Classe abstraite représentant une vue de visualisation des données. @@ -8,14 +25,27 @@ import javafx.scene.chart.ScatterChart; */ public abstract class DataVisualizationView { + public DataVisualizationController controller; + private ScatterChart.Series series1; + private ScatterChart.Series series2; + private ScatterChart.Series series3; + private ScatterChart.Series series4; protected String actualX; protected String actualY; protected ScatterChart scatterChart; + + private Map<String, ScatterChart.Series<Double, Double>> serieList; + public ClassificationModel model; /** - * Constructeur par défaut. + * Constructeur pour initialiser la vue de données. + * @param model le modèle de classification utilisé pour gérer les données. */ - protected DataVisualizationView() {} + protected DataVisualizationView(ClassificationModel model) { + this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>(); + this.model = model; + this.series4 = new XYChart.Series(); + } /** * Renvoie le nom de l'axe X actuel. @@ -61,4 +91,137 @@ public abstract class DataVisualizationView { * Méthode abstraite à implémenter pour recharger les données de la vue. */ public abstract void reload(); + + + /** + * Met à jour l'affichage des données en fonction des changements dans le modèle. + * @param observable modèle observé. + */ + public void update(Observable observable) { + try { + if (scatterChart == null || !(observable instanceof ClassificationModel)) { + System.err.println("Erreur de mise à jour."); + return; + } + + scatterChart.getData().clear(); + serieList.clear(); + + if (actualX == null && actualY == null) { + controller.setAxesSelected("Aucuns axes sélectionnés"); + } else { + controller.setAxesSelected(""); + controller.setAxesSelectedDisable(); + + List<LoadableData> points = new ArrayList<>(model.getDatas()); + points.addAll(model.getDataToClass().keySet()); + for (LoadableData data : points) { + Object xValue = data.getAttributesNames().get(actualX); + Object yValue = data.getAttributesNames().get(actualY); + + + + double x = 0; + if(xValue instanceof Number) { + x = ((Number) xValue).doubleValue(); + } + double y = 0; + if(yValue instanceof Number) { + y = ((Number) yValue).doubleValue(); + } + /** + Double x = 0.0; + if (xValue instanceof Integer) { + x = ((Integer) xValue).doubleValue(); + } else if (xValue instanceof Double) { + x = (Double) xValue; + } + + Double y = 0.0; + if (yValue instanceof Integer) { + y = ((Integer) yValue).doubleValue(); + } else if (yValue instanceof Double) { + y = (Double) yValue; + } + **/ + ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(x, y); + + Node nodePoint = ViewUtil.getForm(data, new Circle(5), controller); + + ScatterChart.Series<Double, Double> editSerie = serieList.get(data.getClassification()); + if(editSerie == null){ + editSerie = new ScatterChart.Series<Double, Double>(); + } + if(data.getClassification().equals("undefined") || model.getDataToClass().containsKey(data)) { + nodePoint = ViewUtil.getForm(data, new Rectangle(10,10), controller); + } + + dataPoint.setNode(nodePoint); + editSerie.getData().add(dataPoint); + serieList.put(data.getClassification(), editSerie); + } + + for(String serie : serieList.keySet()) { + serieList.get(serie).setName(serie); + } + scatterChart.getData().addAll(serieList.values()); + + + VBox vBox = ViewUtil.loadLegend(); + controller.loadLegend(vBox); + } + + + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); + } + } + + /** + * Met à jour l'affichage en ajoutant un nouveau point de données. + * @param observable modèle observé. + * @param data point de données à ajouter. + */ + public void update(Observable observable, Object data) { + try { + if (scatterChart == null || !(observable instanceof ClassificationModel)) { + System.err.println("Erreur de mise à jour."); + return; + } + + + + LoadableData newData = (LoadableData) data; + if (actualX == null || actualY == null) { + controller.setAxesSelected("Aucuns axes sélectionnés"); + return; + } + Object attrX = newData.getAttributesNames().get(actualX); + Object attrY = newData.getAttributesNames().get(actualY); + if (attrX instanceof Integer) { + attrX = ((Integer) attrX).doubleValue(); + } + if (attrY instanceof Integer) { + attrY = ((Integer) attrY).doubleValue(); + } + XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( + (Double) attrX, + (Double) attrY + ); + + dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller)); + if (!scatterChart.getData().isEmpty()) { + series4.getData().add(dataPoint); + series4.setName("indéfini"); + scatterChart.getData().add(series4); + } + + + controller.loadLegend(ViewUtil.loadLegend()); + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); + } + } + + } diff --git a/src/main/java/fr/univlille/sae/classification/view/KNNView.java b/src/main/java/fr/univlille/sae/classification/view/KNNView.java index 31cd2982be04ff01e20ba30e7d61a17a087b39d2..5df40577e89bfd2bda585d59c9f94ab00fe2e2cb 100644 --- a/src/main/java/fr/univlille/sae/classification/view/KNNView.java +++ b/src/main/java/fr/univlille/sae/classification/view/KNNView.java @@ -26,6 +26,9 @@ public class KNNView { this.owner = owner; } + /** + * + */ public void show() { FXMLLoader loader = new FXMLLoader(); URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+ File.separator+"k-NN-stage.fxml"); diff --git a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java index ad6aff4484f05d5f81889b3c0fc7c654e9bfe22e..36661733bc711b9951119c79df26b58938cdbedb 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -27,12 +27,9 @@ import java.util.*; */ public class MainStageView extends DataVisualizationView implements Observer { - private ClassificationModel model; - private MainStageController controller; private Stage root; - private Map<String, ScatterChart.Series<Double, Double>> serieList; private ScatterChart.Series series1; private ScatterChart.Series series2; @@ -41,16 +38,17 @@ public class MainStageView extends DataVisualizationView implements Observer { /** * Constructeur de la vue principale. + * * @param model modèle de classification à utiliser. */ public MainStageView(ClassificationModel model) { - super(); - this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>(); + super(model); + this.series1 = new ScatterChart.Series(); this.series2 = new ScatterChart.Series(); this.series3 = new ScatterChart.Series(); this.series4 = new ScatterChart.Series(); - this.model = model; + model.attach(this); } @@ -88,8 +86,10 @@ public class MainStageView extends DataVisualizationView implements Observer { } }); + + controller = (MainStageController) controller; controller = loader.getController(); - controller.setMainStageView(this); + ((MainStageController) controller).setMainStageView(this); scatterChart = controller.getScatterChart(); //scatterChart.getData().addAll(series1, series2, series3, series4); controller.setAxesSelected("Aucun fichier sélectionné"); @@ -99,135 +99,23 @@ public class MainStageView extends DataVisualizationView implements Observer { } } - @Override - public void update(Observable observable) { - try { - if (scatterChart == null || !(observable instanceof ClassificationModel)) { - System.err.println("Erreur de mise à jour."); - return; - } - - scatterChart.getData().clear(); - serieList.clear(); - - if (actualX == null && actualY == null) { - controller.setAxesSelected("Aucuns axes sélectionnés"); - } else { - controller.setAxesSelected(""); - controller.setAxesSelectedDisable(); - - List<LoadableData> points = new ArrayList<>(model.getDatas()); - points.addAll(model.getDataToClass().keySet()); - for (LoadableData data : points) { - Object xValue = data.getAttributesNames().get(actualX); - Object yValue = data.getAttributesNames().get(actualY); - - - - double x = 0; - if(xValue instanceof Number) { - x = ((Number) xValue).doubleValue(); - } - double y = 0; - if(yValue instanceof Number) { - y = ((Number) yValue).doubleValue(); - } - /** - Double x = 0.0; - if (xValue instanceof Integer) { - x = ((Integer) xValue).doubleValue(); - } else if (xValue instanceof Double) { - x = (Double) xValue; - } - - Double y = 0.0; - if (yValue instanceof Integer) { - y = ((Integer) yValue).doubleValue(); - } else if (yValue instanceof Double) { - y = (Double) yValue; - } - **/ - ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(x, y); - - Node nodePoint = ViewUtil.getForm(data, new Circle(5), controller); - - ScatterChart.Series<Double, Double> editSerie = serieList.get(data.getClassification()); - if(editSerie == null){ - editSerie = new ScatterChart.Series<Double, Double>(); - } - if(data.getClassification().equals("undefined") || model.getDataToClass().containsKey(data)) { - nodePoint = ViewUtil.getForm(data, new Rectangle(10,10), controller); - } - - dataPoint.setNode(nodePoint); - editSerie.getData().add(dataPoint); - serieList.put(data.getClassification(), editSerie); - } - - for(String serie : serieList.keySet()) { - serieList.get(serie).setName(serie); - } - scatterChart.getData().addAll(serieList.values()); - - - VBox vBox = ViewUtil.loadLegend(); - controller.loadLegend(vBox); - } - - - } catch (Exception e) { - System.err.println("Erreur de mise à jour : " + e.getMessage()); - } - } - - @Override - public void update(Observable observable, Object data) { - try { - if (scatterChart == null || !(observable instanceof ClassificationModel)) { - System.err.println("Erreur de mise à jour."); - return; - } - - - - LoadableData newData = (LoadableData) data; - if (actualX == null || actualY == null) { - controller.setAxesSelected("Aucuns axes sélectionnés"); - return; - } - Object attrX = newData.getAttributesNames().get(actualX); - Object attrY = newData.getAttributesNames().get(actualY); - if (attrX instanceof Integer) { - attrX = ((Integer) attrX).doubleValue(); - } - if (attrY instanceof Integer) { - attrY = ((Integer) attrY).doubleValue(); - } - XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( - (Double) attrX, - (Double) attrY - ); - - dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller)); - if (!scatterChart.getData().isEmpty()) { - series4.getData().add(dataPoint); - series4.setName("indéfini"); - scatterChart.getData().add(series4); - } - - - controller.loadLegend(ViewUtil.loadLegend()); - } catch (Exception e) { - System.err.println("Erreur de mise à jour : " + e.getMessage()); - } - } + /** + * Retourne le contrôleur principal de la scène. + * + * @return le contrôleur principal de la scène en tant qu'instance. + */ public MainStageController getController() { - return controller; + return (MainStageController) controller; } + /** + * Recharge les données nécessaires à partir du modèle de classification. + * Cette méthode met à jour l'état en fonction des données actuelles + */ @Override public void reload() { this.update(ClassificationModel.getClassificationModel()); } } +