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 1a690a0d60ea419913197b982e16a872a530bae8..ea7510eb725f6d9df947505259c4bba0f4c68d32 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java @@ -1,17 +1,16 @@ package fr.univlille.sae.classification.controller; import fr.univlille.sae.classification.model.ClassificationModel; -import fr.univlille.sae.classification.model.Iris; -import fr.univlille.sae.classification.view.DataVisualizationView; import fr.univlille.sae.classification.view.MainStageView; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.stage.Stage; import java.io.IOException; -import java.text.ParseException; -import java.util.function.UnaryOperator; +/** + * Controlleur pour le FXML add-data-stage, pour ajouter une nouvelle donnée + */ public class AddDataController { @FXML @@ -32,8 +31,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() { sepalLengthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 200.0, 3.0,0.1)); @@ -49,10 +54,17 @@ 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() throws IOException { 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 16c52b1329fb9fd7842620cba9c2f817ef54300e..c04f311d882ce64c4894ffce206ef565a7c9fccd 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java @@ -7,7 +7,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; @@ -21,24 +23,42 @@ public class AxesSettingsController{ @FXML Button confirmAxes; + /** + * 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 2c561a9baeefbb69af581d0a69a7654c44783130..926b167a478fe71ead37aaab5e91df1e82e400f8 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/DataStageController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/DataStageController.java @@ -11,23 +11,13 @@ 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; - @FXML - NumberAxis absAxe; - - @FXML - NumberAxis ordAxe; - - @FXML - Button settings; - - @FXML - Button loadData; - @FXML Button classifyData; @@ -37,42 +27,47 @@ public class DataStageController { @FXML Label AxesSelected; - Stage loadStage; + /** + * DataStageView associé au controlleur + */ private DataStageView dataStageView; /** - * Ouvre l'interface de chargement des données. - * @throws IOException + * Ouvrir les paramètres des axes de la vue */ - public void openLoadData() throws IOException { - LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage); - loadDataView.show(); - } - 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; } + 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); } - public Button getClassifyData() { - return this.classifyData; - } } 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 902fb931d0938d3ec76ea2ca6fb11bb5cb92e7fd..8ca5ee8a174d784f074ca2af58dbd5f818469b30 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java @@ -27,11 +27,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"); @@ -43,6 +46,9 @@ public class LoadDataController { } + /** + * Valide le fichier sélectionné au préalable + */ public void validate() throws IOException { if (file == null) { @@ -59,7 +65,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 bf8ab81524503f95f0e79d146a92a2da1545ab7d..4013b83d1e65bbc29004d92aee1c452da56409f0 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java @@ -49,55 +49,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 033890f3c275ee90712b4680729918fb665032ff..83c23f00cc9202da68c9fe9f12b9037f1f46c77b 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() { } @@ -31,4 +30,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 e9c0b31232ef621ed3258982b7ee6d11d6b6cffc..a6a495f70fdcdc5425809aa766e6e26b9568c52c 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AddDataView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AddDataView.java @@ -1,7 +1,6 @@ package fr.univlille.sae.classification.view; import fr.univlille.sae.classification.controller.AddDataController; -import fr.univlille.sae.classification.controller.AxesSettingsController; import fr.univlille.sae.classification.model.ClassificationModel; import javafx.fxml.FXMLLoader; import javafx.scene.control.Alert; @@ -24,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 donné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 2a1f23424e2d78a964eaae7a13df1d7b1f23802f..999e8176d6f3f4ce6690540134965633628646e1 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java @@ -1,8 +1,6 @@ package fr.univlille.sae.classification.view; import fr.univlille.sae.classification.controller.AxesSettingsController; -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.LoadableData; import javafx.fxml.FXMLLoader; @@ -10,60 +8,65 @@ import javafx.scene.control.Alert; import javafx.stage.Modality; import javafx.stage.Stage; -import javax.xml.crypto.Data; import java.io.File; import java.io.IOException; 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 2cf2f84225f9101e4a4a766392047b18c07b11a4..57b5e6d351ad34b71bbc61145522ad2df340029f 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -1,19 +1,18 @@ 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; 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.fxml.FXMLLoader; import javafx.scene.chart.ScatterChart; 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.stage.Stage; import java.io.File; @@ -26,7 +25,6 @@ public class DataStageView extends DataVisualizationView implements Observer { private ClassificationModel model; private DataStageController controller; - private Stage root; public DataStageView(ClassificationModel model) { @@ -34,107 +32,117 @@ 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"); - System.exit(-1); - } - loader.setLocation(fxmlFileUrl); - root = loader.load(); - root.setResizable(false); - root.setTitle("SAE3.3 - Logiciel de classification"); - root.show(); - loader.getController(); - controller = loader.getController(); - controller.setDataStageView(this); - scatterChart = controller.getScatterChart(); - controller.setAxesSelected("Aucun fichier sélectionné"); - - if (!model.getDatas().isEmpty()) { - update(model); + if (fxmlFileUrl == null) { + System.out.println("Impossible de charger le fichier fxml"); + System.exit(-1); + } + loader.setLocation(fxmlFileUrl); + root = loader.load(); + root.setResizable(false); + root.setTitle("SAE3.3 - Logiciel de classification"); + root.show(); + controller = loader.getController(); + controller.setDataStageView(this); + scatterChart = controller.getScatterChart(); + controller.setAxesSelected("Aucun fichier sélectionné"); + + 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 - scatterChart.getData().clear(); - - XYChart.Series series1 = new XYChart.Series(); - series1.setName("Iris"); - - //Jalon 1: on verifie que le type de donnée est bien IRIS - if(model.getType() == DataType.IRIS) { - 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; } - else{ - controller.setAxesSelected(""); - // On ajoute la serie au nuage - scatterChart.getData().add(series1); - - //On recupere les données du model - List<LoadableData> points = new ArrayList<>(model.getDatas()); - points.addAll(model.getDataToClass()); - // on ajoute chaque point a la serie - for(LoadableData i : points) { - - Iris iris = (Iris)i; - XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), - iris.getDataType(actualY)); - - dataPoint.setNode(getCircle(iris)); - - series1.getData().add(dataPoint); - + // On vide le nuage pour s'assurer qu'il est bien vide + scatterChart.getData().clear(); + + // Jalon 1: on vérifie que le type de donnée est bien IRIS + if (model.getType() == DataType.IRIS) { + XYChart.Series<Double, Double> series1 = new XYChart.Series<>(); + XYChart.Series<Double, Double> series2 = new XYChart.Series<>(); + XYChart.Series<Double, Double> series3 = new XYChart.Series<>(); + if (actualX == null && actualY == null) { + controller.setAxesSelected("Aucuns axes sélectionnés"); + } else { + controller.setAxesSelected(""); + // On récupère les données du modèle + List<LoadableData> points = new ArrayList<>(model.getDatas()); + points.addAll(model.getDataToClass()); + // On ajoute chaque point à la série + for (LoadableData i : points) { + Iris iris = (Iris) i; + XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( + iris.getDataType(actualX), + iris.getDataType(actualY) + ); + + dataPoint.setNode(ViewUtil.getForm(iris, new Circle(5), root)); + + switch (iris.getClassification()) { + case "Setosa": + series1.getData().add(dataPoint); + break; + case "Versicolor": + series2.getData().add(dataPoint); + break; + case "Virginica": + series3.getData().add(dataPoint); + break; + } + } + + series1.setName("Setosa"); + series2.setName("Versicolor"); + series3.setName("Virginica"); + + scatterChart.getData().addAll(series1, series2, series3); } } + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); } } - - private Circle getCircle(Iris iris) { - Circle circle = new Circle(5); - circle.setFill(iris.getColor()); - circle.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 circle; - } - - - @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(getCircle(iris)); - 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<Double, Double> series = (XYChart.Series<Double, Double>) scatterChart.getData().get(0); + series.getData().add(dataPoint); + } } + } catch (Exception e) { + System.err.println("Erreur de mise à jour : " + e.getMessage()); } } 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 236f9307faae9a97fceebaac53c1df836d1a76c7..a429e235d6cc6f2e5cb3ca6926aa58f3959436e3 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -8,6 +8,7 @@ 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.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -39,115 +40,110 @@ public class MainStageView extends DataVisualizationView implements Observer { } - 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"); - System.exit(-1); + if (fxmlFileUrl == null) { + System.out.println("Impossible de charger le fichier fxml"); + System.exit(-1); + } + loader.setLocation(fxmlFileUrl); + root = loader.load(); + root.setResizable(false); + root.setTitle("SAE3.3 - Logiciel de classification"); + root.show(); + loader.getController(); + controller = loader.getController(); + controller.setMainStageView(this); + scatterChart = controller.getScatterChart(); + controller.setAxesSelected("Aucun fichier sélectionné"); + + } catch (IOException e) { + System.err.println("Erreur lors du chargement du fichier FXML : " + e.getMessage()); } - loader.setLocation(fxmlFileUrl); - root = loader.load(); - root.setResizable(false); - root.setTitle("SAE3.3 - Logiciel de classification"); - root.show(); - loader.getController(); - controller = loader.getController(); - controller.setMainStageView(this); - scatterChart = controller.getScatterChart(); - controller.setAxesSelected("Aucun fichier sélectionné"); } @Override public void update(Observable observable) { - if(scatterChart == null) throw new IllegalStateException(); - if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); - scatterChart.getData().clear(); - - XYChart.Series series1 = new XYChart.Series(); - XYChart.Series series2 = new XYChart.Series(); - XYChart.Series series3 = new XYChart.Series(); - - - - //Jalon 1: on verifie que le type de donnée est bien IRIS - if(model.getType() == DataType.IRIS) { - - - 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; } - else{ - controller.setAxesSelected(""); - - 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)); - - dataPoint.setNode(getForm(iris, new Circle(5))); - - if(iris.getClassification().equals("Setosa")){ - series1.getData().add(dataPoint); - }else if(iris.getClassification().equals("Versicolor")){ - series2.getData().add(dataPoint); - }else if(iris.getClassification().equals("Virginica")){ - series3.getData().add(dataPoint); + scatterChart.getData().clear(); + + //Jalon 1: on verifie que le type de donnée est bien IRIS + if (model.getType() == DataType.IRIS) { + XYChart.Series series1 = new XYChart.Series(); + XYChart.Series series2 = new XYChart.Series(); + XYChart.Series series3 = new XYChart.Series(); + if (actualX == null && actualY == null) { + controller.setAxesSelected("Aucuns axes sélectionnés"); + } else { + controller.setAxesSelected(""); + + 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)); + + dataPoint.setNode(ViewUtil.getForm(iris, new Circle(5), root)); + + if (iris.getClassification().equals("Setosa")) { + series1.getData().add(dataPoint); + } else if (iris.getClassification().equals("Versicolor")) { + series2.getData().add(dataPoint); + } else if (iris.getClassification().equals("Virginica")) { + series3.getData().add(dataPoint); + } } - } - - series1.setName("Setosa"); - series2.setName("Versicolor"); - series3.setName("Virginica"); + series1.setName("Setosa"); + series2.setName("Versicolor"); + series3.setName("Virginica"); - scatterChart.getData().addAll(series1, series2, series3); + 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) - ); - - 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()); } }