diff --git a/README.md b/README.md index c8bf478bb50ca21a0223382dd84e924106c4f6ce..90d461733c3accde497c08c66e298f1af4bbee01 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,16 @@ -# SAE 3.01 - Logiciel de classification +# SAÉ 3.01 - Logiciel de classification -Membres: +## Membres - MENNECART Matias (matias.mennecart.etu@univ-lille.fr) - DEKEISER Matisse (matisse.dekeiser.etu@univ-lille.fr) - DEBUYSER Hugo (hugo.debuyser.etu@univ-lille.fr) - DESMONS Hugo (hugo.desmons.etu@univ-lille.fr) - ANTOINE Maxence (maxence.antoine.etu@univ-lille.fr) +- **Groupe H4** + +## Présentation du projet +L'objectif de cette SAÉ est le développement d'une application de classification de données. L'utilisateur pourra charger un jeu de données en format CSV, puis choisir les axes d'abscisse et d'ordonnée selon 2 attributs, et le logiciel proposera une visualisation des données en 2 dimensions sous forme d'un nuage de points. Par la suite, l'utilisateur pourra ajouter une donnée en spécifiant tous les attributs nécessaires à celle-ci, et le logiciel se chargera de déterminer la possible catégorie à laquelle elle appartient, tout en la rendant visible sur le nuage de points. + +## Pour lancer l'application +**À COMPLÉTER** \ No newline at end of file diff --git a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java index 17805258d2372794a6b33a77d7ebc10148099725..f2b44f3f9084fdd4c70e470e6218c77585849586 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java @@ -9,6 +9,9 @@ import javafx.stage.Stage; import java.io.IOException; +/** + * Controlleur pour le FXML add-data-stage, pour ajouter une nouvelle donnée + */ public class AddDataController { @FXML @@ -26,8 +29,14 @@ public class AddDataController { @FXML private Spinner<Double> petalWidthSpinner; + /** + * MainStageView associé au controlleur + */ MainStageView mainStageView; + /** + * Méthode d'intitialisation du controlleur + */ @FXML public void initialize() { @@ -44,10 +53,16 @@ public class AddDataController { } + /** + * Méthode permettante d'attribuer la mainStageView associer à la classe + * @param mainStageView mainStageView à attribuer + */ public void setMainStageView(MainStageView mainStageView) { this.mainStageView = mainStageView; } - + /** + * Validation des données à ajouter + */ public void validate() { System.out.println("validé"); mainStageView.getController().getClassifyData().setDisable(false); diff --git a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java index ccb845dd5826631d506efd770e12a07fb9eb3f18..88b726cd126eba3e81c11d587905bfb035586b91 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java @@ -6,7 +6,9 @@ import javafx.scene.control.Button; import javafx.scene.control.ChoiceBox; import javafx.stage.Stage; - +/** + * Controlleur pour le FXML axes-settings-stage, pour gérer les axes de la vue + */ public class AxesSettingsController{ @FXML Stage stage; @@ -18,24 +20,42 @@ public class AxesSettingsController{ ChoiceBox selectAbs; + /** + * DataVisualizationView associé au controlleur + */ DataVisualizationView dataVisualizationView; + /** + * Ajout des éléments à sélectionner pour les ordonnées de la grille + * @param fields Éléments à ajouter + */ public void setSelectOrd(String[] fields){ selectOrd.getItems().clear(); selectOrd.getItems().addAll(fields); selectOrd.setValue(dataVisualizationView.getActualY()); } + /** + * Ajout des éléments à sélectionner pout les abscisses de la grille + * @param fields Éléments à ajouter + */ public void setSelectAbs(String[] fields){ selectAbs.getItems().clear(); selectAbs.getItems().addAll(fields); selectAbs.setValue(dataVisualizationView.getActualX()); } + /** + * Méthode permettante d'attribuer la dataVisualizationView associer à la classe + * @param dataVisualizationView dataVisualizationView à attribuer + */ public void setdataVisualizationView(DataVisualizationView dataVisualizationView) { this.dataVisualizationView = dataVisualizationView; } + /** + * Validation des paramètres des axes + */ public void validate(){ dataVisualizationView.setActualX(selectAbs.getValue().toString()); dataVisualizationView.setActualY(selectOrd.getValue().toString()); diff --git a/src/main/java/fr/univlille/sae/classification/controller/DataStageController.java b/src/main/java/fr/univlille/sae/classification/controller/DataStageController.java index 2de3bff9252be348427d9d4e5edd75fa71d8ce9c..acc6a45394c82e88bba20c100a3ee967a80a620c 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/DataStageController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/DataStageController.java @@ -10,7 +10,9 @@ import javafx.stage.Stage; import java.io.IOException; - +/** + * Controlleur pour le FXML data-view-stage, pour gérer la vue supplémentaire + */ public class DataStageController { @FXML Stage stage; @@ -21,24 +23,41 @@ public class DataStageController { @FXML Label AxesSelected; + /** + * DataStageView associé au controlleur + */ private DataStageView dataStageView; - + /** + * Ouvrir les paramètres des axes de la vue + * @throws IOException + */ public void openAxesSetting()throws IOException { AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, dataStageView); axesSettingsView.show(); } + /** + * Associe la dataStageView associer à la classe + * @param dataStageView + */ public void setDataStageView (DataStageView dataStageView) { this.dataStageView = dataStageView; } - + /** + * Renvoie la grille associé à la classe + * @return grille de la classe + */ public ScatterChart getScatterChart() { return this.scatterChart; } + /** + * Attribut une valeur à l'axe de la grille + * @param texte Valeur de l'axe + */ public void setAxesSelected(String texte) { this.AxesSelected.setText(texte); } diff --git a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java index 934ab416a212f54d9ebfcbf34231b169b4fbb711..b0009cecf85c5c2900d539b11ffe04ba4a64ff6e 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java @@ -21,11 +21,14 @@ public class LoadDataController { @FXML TextField filePath; + /** + * Fichier sélectionné + */ File file; - - - + /** + * Ouvre un explorateur de fichiers pour sélectionner le fichier à étudier + */ public void openFileChooser() { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Choisissez le fichier à importer"); @@ -37,6 +40,9 @@ public class LoadDataController { } + /** + * Valide le fichier sélectionné au préalable + */ public void validate() throws IOException { if (file == null || file.isDirectory() || !file.exists()) { @@ -53,7 +59,4 @@ public class LoadDataController { ClassificationModel.getClassificationModel().loadData(file); stage.close(); } - - - } 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 d7d3d6d09c09794b93f9e9d1dd98ee730acbd9f3..9b468c2296dce5d90765c04ea35bc34f9119532d 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java @@ -33,55 +33,72 @@ public class MainStageController { /** * Ouvre l'interface de chargement des données. - * @throws IOException */ public void openLoadData() throws IOException { LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage); loadDataView.show(); } + /** + * Ouvre l'interface d'une nouvelle vue. + */ public void openDataView() throws IOException { DataStageView dataStageView = new DataStageView(ClassificationModel.getClassificationModel()); dataStageView.show(); } + /** + * Ouvre l'interface de la configuration des axes. + */ public void openAxesSetting()throws IOException { AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, mainStageView); axesSettingsView.show(); } + /** + * Associe la mainStageView associer à la classe + * @param mainStageView + */ public void setMainStageView(MainStageView mainStageView) { this.mainStageView = mainStageView; } /** * Ouvre l'interface d'ajout de donnée. - * @throws IOException */ public void openAddData() throws IOException { - AddDataView addDataView = new AddDataView(ClassificationModel.getClassificationModel(), stage, mainStageView); addDataView.show(); - - } - - + /** + * Appelle de la méthode de la classe ClassificationModel afin de classifier les nouvelles données + */ public void classifyDatas() { ClassificationModel.getClassificationModel().classifierDonnees(); classifyData.setDisable(true); } - + /** + * Renvoie la grille associé à la classe + * @return grille de la classe + */ public ScatterChart getScatterChart() { return this.scatterChart; } + /** + * Attribut une valeur à l'axe de la grille + * @param texte Valeur de l'axe + */ public void setAxesSelected(String texte) { this.AxesSelected.setText(texte); } + /** + * Renvoie le bouton de classification de données + * @return Bouton de classification + */ public Button getClassifyData() { return this.classifyData; } diff --git a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java index 745e009fbae14e3022eefc969d9f4f34ba0328f8..28b6b9d4675bf85498238dbfd63924f2528b65df 100644 --- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -1,14 +1,13 @@ package fr.univlille.sae.classification.model; +import javafx.scene.paint.Color; + import java.util.Set; public abstract class LoadableData { private static Set<String> classificationTypes; - - - protected LoadableData() { } @@ -27,4 +26,8 @@ public abstract class LoadableData { public abstract String[] getAttributesName(); + public abstract Color getColor(); + + public abstract double getDataType(String axes); + } diff --git a/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java new file mode 100644 index 0000000000000000000000000000000000000000..79391022a6d6e0b028e6db6ed0c1dc0479aab920 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/utils/ViewUtil.java @@ -0,0 +1,26 @@ +package fr.univlille.sae.classification.utils; + +import fr.univlille.sae.classification.model.LoadableData; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.MenuItem; +import javafx.scene.shape.Shape; +import javafx.stage.Stage; + +public class ViewUtil { + + public static Shape getForm(LoadableData iris, Shape form, Stage root) { + try { + form.setFill(iris.getColor()); + form.setOnMouseClicked(e -> { + ContextMenu contextMenu = new ContextMenu(); + for (String attributes : iris.getAttributesName()) { + contextMenu.getItems().add(new MenuItem(attributes + " : " + iris.getDataType(attributes))); + } + contextMenu.show(root, e.getScreenX(), e.getScreenY()); + }); + } catch (Exception e) { + System.err.println("Erreur lors de la création de la forme : " + e.getMessage()); + } + return form; + } +} diff --git a/src/main/java/fr/univlille/sae/classification/view/AddDataView.java b/src/main/java/fr/univlille/sae/classification/view/AddDataView.java index a8405054603fa0c962b2dadae32a2636b1b8148e..a6a495f70fdcdc5425809aa766e6e26b9568c52c 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AddDataView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AddDataView.java @@ -23,40 +23,46 @@ public class AddDataView { this.mainStageView = mainStageView; } - public void show() throws IOException { - + public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "add-data-stage.fxml").toURI().toURL(); + URL fxmlFileUrl = null; + + try { + fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "add-data-stage.fxml").toURI().toURL(); + } catch (IOException e) { + System.out.println("Erreur lors de la création de l'URL du fichier FXML : " + e.getMessage()); + return; + } if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); System.exit(-1); } - loader.setLocation(fxmlFileUrl); - Stage root = loader.load(); - - AddDataController controller = loader.getController(); - - controller.setMainStageView(mainStageView); + loader.setLocation(fxmlFileUrl); - if(model.getDatas().isEmpty()) { - Alert alert = new Alert(Alert.AlertType.WARNING); - alert.setTitle("Erreur"); - alert.setHeaderText(null); - alert.setContentText("Veuillez d'abord charger les données avant pouvoir ajouter un point"); - alert.showAndWait(); - return; + try { + Stage root = loader.load(); + AddDataController controller = loader.getController(); + controller.setMainStageView(mainStageView); + + if (model.getDatas().isEmpty()) { + Alert alert = new Alert(Alert.AlertType.WARNING); + alert.setTitle("Erreur"); + alert.setHeaderText(null); + alert.setContentText("Veuillez d'abord charger les données avant de pouvoir ajouter un point"); + alert.showAndWait(); + return; + } + + root.setResizable(false); + root.initOwner(owner); + root.initModality(Modality.APPLICATION_MODAL); + root.setTitle("Ajout de donnée"); + + root.showAndWait(); + } catch (IOException e) { + System.out.println("Erreur lors du chargement de la scène : " + e.getMessage()); } - - - root.setResizable(false); - root.initOwner(owner); - root.initModality(Modality.APPLICATION_MODAL); - root.setTitle("Ajout de donée"); - - root.showAndWait(); - } - } diff --git a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java index 31d9fa2981e594a3f69bb6c53c1633405fd7b0fe..999e8176d6f3f4ce6690540134965633628646e1 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java @@ -14,53 +14,59 @@ import java.net.URL; public class AxesSettingsView { - private ClassificationModel model; private Stage owner; private DataVisualizationView dataVisualizationView; - public AxesSettingsView(ClassificationModel model, Stage owner, DataVisualizationView dataVisualizationView){ + public AxesSettingsView(ClassificationModel model, Stage owner, DataVisualizationView dataVisualizationView) { this.model = model; this.owner = owner; this.dataVisualizationView = dataVisualizationView; } - public void show() throws IOException { - + public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "axes-settings-stage.fxml").toURI().toURL(); + URL fxmlFileUrl = null; + + try { + fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "axes-settings-stage.fxml").toURI().toURL(); + } catch (IOException e) { + System.out.println("Erreur lors de la création de l'URL du fichier FXML : " + e.getMessage()); + return; + } if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); System.exit(-1); } - loader.setLocation(fxmlFileUrl); - Stage root = loader.load(); - - root.setResizable(false); - root.initOwner(owner); - root.initModality(Modality.APPLICATION_MODAL); - root.setTitle("Configuration des axes"); - AxesSettingsController controller = loader.getController(); - controller.setdataVisualizationView(dataVisualizationView); + loader.setLocation(fxmlFileUrl); - if(model.getDatas().isEmpty()) { - Alert alert = new Alert(Alert.AlertType.WARNING); - alert.setTitle("Erreur"); - alert.setHeaderText(null); - alert.setContentText("Veuillez d'abord charger les données avant de modifier les parametres"); - alert.showAndWait(); - return; + try { + Stage root = loader.load(); + root.setResizable(false); + root.initOwner(owner); + root.initModality(Modality.APPLICATION_MODAL); + root.setTitle("Configuration des axes"); + AxesSettingsController controller = loader.getController(); + controller.setdataVisualizationView(dataVisualizationView); + + if (model.getDatas().isEmpty()) { + Alert alert = new Alert(Alert.AlertType.WARNING); + alert.setTitle("Erreur"); + alert.setHeaderText(null); + alert.setContentText("Veuillez d'abord charger les données avant de modifier les paramètres"); + alert.showAndWait(); + return; + } + + LoadableData dataType = model.getDatas().get(0); + controller.setSelectAbs(dataType.getAttributesName()); + controller.setSelectOrd(dataType.getAttributesName()); + + root.showAndWait(); + } catch (IOException e) { + System.out.println("Erreur lors du chargement de la scène : " + e.getMessage()); } - - LoadableData dataType = model.getDatas().get(0); - - - controller.setSelectAbs(dataType.getAttributesName()); - controller.setSelectOrd(dataType.getAttributesName()); - - root.showAndWait(); - } } 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 1bf77d5966ea08102ce3519ee9ed37fee5e1fb4a..1d3c3f1109e9f79afd466a1a4e7cdac5902d0d7f 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -8,13 +8,13 @@ import fr.univlille.sae.classification.model.LoadableData; import fr.univlille.sae.classification.utils.Observable; import fr.univlille.sae.classification.utils.Observer; import javafx.collections.ObservableList; +import fr.univlille.sae.classification.utils.ViewUtil; import javafx.fxml.FXMLLoader; import javafx.scene.chart.XYChart; -import javafx.scene.control.ContextMenu; -import javafx.scene.control.MenuItem; import javafx.scene.shape.Circle; import javafx.scene.shape.Rectangle; import javafx.scene.shape.Shape; +import javafx.scene.shape.Rectangle; import javafx.stage.Stage; import java.io.File; @@ -46,10 +46,11 @@ public class DataStageView extends DataVisualizationView implements Observer { model.attach(this); } - public void show() throws IOException { + public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "data-view-stage.fxml").toURI().toURL(); + try { + URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "data-view-stage.fxml").toURI().toURL(); if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); @@ -72,18 +73,23 @@ public class DataStageView extends DataVisualizationView implements Observer { System.out.println("DataStageView scatter chart: " +scatterChart); controller.setAxesSelected("Aucun fichier sélectionné"); - if (!model.getDatas().isEmpty()) { - update(model); + if (!model.getDatas().isEmpty()) { + update(model); + } + } catch (IOException e) { + System.err.println("Erreur lors du chargement du fichier FXML : " + e.getMessage()); } } @Override public void update(Observable observable) { - if(scatterChart == null) throw new IllegalStateException(); - if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); - //on vide le nuage pour s'assurer que celui-ci est bien vide - ObservableList<XYChart.Series> series = scatterChart.getData(); - for(XYChart.Series serie: series) {serie.getData().clear();} + try { + if (scatterChart == null || !(observable instanceof ClassificationModel)) { + System.err.println("Erreur de mise à jour."); + return; + } + // On vide le nuage pour s'assurer qu'il est bien vide + scatterChart.getData().clear(); @@ -105,7 +111,7 @@ public class DataStageView extends DataVisualizationView implements Observer { XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), iris.getDataType(actualY)); - dataPoint.setNode(getForm(iris, new Circle(5))); + dataPoint.setNode(ViewUtil.getForm(iris, new Circle(5), root)); switch (iris.getClassification()) { case "Setosa": @@ -129,47 +135,45 @@ public class DataStageView extends DataVisualizationView implements Observer { series3.setName("Virginica"); series4.setName("undefinied"); + scatterChart.getData().addAll(series1, series2, series3); } } - } + } + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); + } - private Shape getForm(Iris iris, Shape form) { - form.setFill(iris.getColor()); - form.setOnMouseClicked(e -> { - ContextMenu contextMenu = new ContextMenu(); - for(String attributes : iris.getAttributesName()) { - contextMenu.getItems().add(new MenuItem(attributes + " : " + iris.getDataType(attributes))); - } - contextMenu.show(root, e.getScreenX(), e.getScreenY()); - }); - return form; } - - @Override public void update(Observable observable, Object data) { - if(scatterChart == null) throw new IllegalStateException(); - if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); - if(data instanceof Iris) { - Iris iris = (Iris) data; - if(actualX == null || actualY == null) { - controller.setAxesSelected("Aucuns axes sélectionnés"); + try { + if (scatterChart == null || !(observable instanceof ClassificationModel)) { + System.err.println("Erreur de mise à jour."); return; } - XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( - iris.getDataType(actualX), - iris.getDataType(actualY) - ); + if (data instanceof Iris) { + Iris iris = (Iris) data; + if (actualX == null || actualY == null) { + controller.setAxesSelected("Aucuns axes sélectionnés"); + return; + } + XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( + iris.getDataType(actualX), + iris.getDataType(actualY) + ); - dataPoint.setNode(getForm(iris, new Rectangle(10, 10))); + dataPoint.setNode(ViewUtil.getForm(iris, new Rectangle(10, 10))); if (!scatterChart.getData().isEmpty()) { series4.getData().add(dataPoint); } } + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); + } } public DataStageController getController() { diff --git a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java index 156ab380cbae143783efecbfa18969dc384dccd6..4ece4c3509f00d695926eac378c8754f9850959e 100644 --- a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java +++ b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java @@ -19,27 +19,35 @@ public class LoadDataView { this.owner = owner; } - - - public void show() throws IOException { - + public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "load-data-stage.fxml").toURI().toURL(); + URL fxmlFileUrl = null; + + try { + fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "load-data-stage.fxml").toURI().toURL(); + } catch (IOException e) { + System.out.println("Erreur lors de la création de l'URL du fichier FXML : " + e.getMessage()); + return; + } if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); System.exit(-1); } + loader.setLocation(fxmlFileUrl); - Stage root = loader.load(); - root.setResizable(false); - root.initOwner(owner); - root.initModality(Modality.APPLICATION_MODAL); - root.setTitle("Chargement des donées"); + try { + Stage root = loader.load(); - root.showAndWait(); + root.setResizable(false); + root.initOwner(owner); + root.initModality(Modality.APPLICATION_MODAL); + root.setTitle("Chargement des données"); + root.showAndWait(); + } catch (IOException e) { + System.out.println("Erreur lors du chargement de la scène : " + e.getMessage()); + } } - } 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 1eb879482c3e2e88f2edc5b44a4eab6fdd9ff56e..daf7d8cf99b39d8e13dd69d4de808745ff20bd5a 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -7,6 +7,10 @@ import fr.univlille.sae.classification.model.Iris; import fr.univlille.sae.classification.model.LoadableData; import fr.univlille.sae.classification.utils.Observable; import fr.univlille.sae.classification.utils.Observer; +import fr.univlille.sae.classification.utils.ViewUtil; +import javafx.application.Application; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.chart.XYChart; import javafx.scene.control.Alert; @@ -32,18 +36,28 @@ public class MainStageView extends DataVisualizationView implements Observer { private Stage root; + private XYChart.Series series1 ; + private XYChart.Series series2 ; + private XYChart.Series series3; + private XYChart.Series series4 ; public MainStageView(ClassificationModel model) { super(); + this.series1 = new XYChart.Series(); + this.series2 = new XYChart.Series(); + this.series3 = new XYChart.Series(); + this.series4 = new XYChart.Series(); + this.model = model; model.attach(this); } - public void show() throws IOException { + public void show() { 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(); + try { + URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "main-stage.fxml").toURI().toURL(); if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); @@ -72,23 +86,28 @@ public class MainStageView extends DataVisualizationView implements Observer { controller.setMainStageView(this); scatterChart = controller.getScatterChart(); + scatterChart.getData().addAll(series1, series2, series3); - System.out.println("DataStageView scatter chart: " +scatterChart ); + System.out.println("DataStageView scatter chart: " +scatterChart ); controller.setAxesSelected("Aucun fichier sélectionné"); + } catch (IOException e) { + System.err.println("Erreur lors du chargement du fichier FXML : " + e.getMessage()); + } + } @Override public void update(Observable observable) { - if(scatterChart == null) throw new IllegalStateException(); - if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); - scatterChart.getData().clear(); + try { + if (scatterChart == null || !(observable instanceof ClassificationModel)) { + System.err.println("Erreur de mise à jour."); + return; + } - XYChart.Series series1 = new XYChart.Series(); - XYChart.Series series2 = new XYChart.Series(); - XYChart.Series series3 = new XYChart.Series(); - XYChart.Series series4 = new XYChart.Series(); + ObservableList<XYChart.Series> series = scatterChart.getData(); + for(XYChart.Series serie : series) {serie.getData().clear();} @@ -102,15 +121,15 @@ public class MainStageView extends DataVisualizationView implements Observer { else{ controller.setAxesSelected(""); - List<LoadableData> points = new ArrayList<>(model.getDatas()); - points.addAll(model.getDataToClass()); - for(LoadableData i : points) { + List<LoadableData> points = new ArrayList<>(model.getDatas()); + points.addAll(model.getDataToClass()); + for (LoadableData i : points) { - Iris iris = (Iris)i; - XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), - iris.getDataType(actualY)); + Iris iris = (Iris) i; + XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), + iris.getDataType(actualY)); - dataPoint.setNode(getForm(iris, new Circle(5))); + dataPoint.setNode(ViewUtil.getForm(iris, new Circle(5), root)); switch (iris.getClassification()) { case "Setosa": @@ -134,46 +153,41 @@ public class MainStageView extends DataVisualizationView implements Observer { series3.setName("Virginica"); series4.setName("undefinied"); - scatterChart.getData().addAll(series1, series2, series3, series4); - } + } + } + }catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); } - } - - private Shape getForm(Iris iris, Shape form) { - form.setFill(iris.getColor()); - form.setOnMouseClicked(e -> { - ContextMenu contextMenu = new ContextMenu(); - for(String attributes : iris.getAttributesName()) { - contextMenu.getItems().add(new MenuItem(attributes + " : " + iris.getDataType(attributes))); - } - contextMenu.show(root, e.getScreenX(), e.getScreenY()); - }); - - return form; } @Override public void update(Observable observable, Object data) { - if(scatterChart == null) throw new IllegalStateException(); - if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); - if(data instanceof Iris) { - Iris iris = (Iris) data; - if(actualX == null || actualY == null) { - controller.setAxesSelected("Aucuns axes sélectionnés"); + try { + if (scatterChart == null || !(observable instanceof ClassificationModel)) { + System.err.println("Erreur de mise à jour."); return; } - XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( - iris.getDataType(actualX), - iris.getDataType(actualY) - ); - - dataPoint.setNode(getForm(iris, new Rectangle(10, 10))); - if (!scatterChart.getData().isEmpty()) { - XYChart.Series series = (XYChart.Series) scatterChart.getData().get(0); - series.getData().add(dataPoint); + if(data instanceof Iris) { + Iris iris = (Iris) data; + if(actualX == null || actualY == null) { + controller.setAxesSelected("Aucuns axes sélectionnés"); + return; + } + XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( + iris.getDataType(actualX), + iris.getDataType(actualY) + ); + + dataPoint.setNode(ViewUtil.getForm(iris, new Rectangle(10, 10), root)); + if (!scatterChart.getData().isEmpty()) { + XYChart.Series series = (XYChart.Series) scatterChart.getData().get(0); + series.getData().add(dataPoint); + } } + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); } }