diff --git a/src/main/java/fr/univlille/sae/classification/model/Iris.java b/src/main/java/fr/univlille/sae/classification/model/Iris.java index f71fe890c7154f3d7fae2ecffbc335d13db71fe6..9912b9b26aa2ad38f89b82866575510a7f48d069 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Iris.java +++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java @@ -100,6 +100,14 @@ public class Iris extends LoadableData{ return names; } + public String[] getTypesName() { + return new String[]{ + "Setosa", + "Versicolor", + "Virginica" + }; + } + @Override public String toString() { return "Iris{" + 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/DataStageView.java b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java index 2cf2f84225f9101e4a4a766392047b18c07b11a4..47f21b628872b2ffc3f95e6ea068ed60131bbb4b 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,115 +25,126 @@ public class DataStageView extends DataVisualizationView implements Observer { private ClassificationModel model; private DataStageController controller; - private Stage root; + private ScatterChart<Double, Double> scatterChart; + private String actualX, actualY; public DataStageView(ClassificationModel model) { 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 + "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/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()); } }