Skip to content
Snippets Groups Projects
Commit 60eb9718 authored by Hugo Debuyser's avatar Hugo Debuyser
Browse files

Ajout d'une classe ViewUtil pour regrouper les méthodes communes aux view,...

Ajout d'une classe ViewUtil pour regrouper les méthodes communes aux view, ajout d'une méthode dans Iris pour renvoyer les différentes variétés. Ajout de try catch dans les views principales
parent 1202d8c5
Branches
Tags
No related merge requests found
...@@ -100,6 +100,14 @@ public class Iris extends LoadableData{ ...@@ -100,6 +100,14 @@ public class Iris extends LoadableData{
return names; return names;
} }
public String[] getTypesName() {
return new String[]{
"Setosa",
"Versicolor",
"Virginica"
};
}
@Override @Override
public String toString() { public String toString() {
return "Iris{" + return "Iris{" +
......
package fr.univlille.sae.classification.model; package fr.univlille.sae.classification.model;
import javafx.scene.paint.Color;
import java.util.Set; import java.util.Set;
public abstract class LoadableData { public abstract class LoadableData {
private static Set<String> classificationTypes; private static Set<String> classificationTypes;
protected LoadableData() { protected LoadableData() {
} }
...@@ -31,4 +30,8 @@ public abstract class LoadableData { ...@@ -31,4 +30,8 @@ public abstract class LoadableData {
public abstract String[] getAttributesName(); public abstract String[] getAttributesName();
public abstract Color getColor();
public abstract double getDataType(String axes);
} }
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;
}
}
package fr.univlille.sae.classification.view; package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.DataStageController; 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.ClassificationModel;
import fr.univlille.sae.classification.model.DataType; import fr.univlille.sae.classification.model.DataType;
import fr.univlille.sae.classification.model.Iris; import fr.univlille.sae.classification.model.Iris;
import fr.univlille.sae.classification.model.LoadableData; import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable; import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.Observer; import fr.univlille.sae.classification.utils.Observer;
import fr.univlille.sae.classification.utils.ViewUtil;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.chart.ScatterChart; import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart; import javafx.scene.chart.XYChart;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.shape.Circle; import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.File; import java.io.File;
...@@ -26,115 +25,126 @@ public class DataStageView extends DataVisualizationView implements Observer { ...@@ -26,115 +25,126 @@ public class DataStageView extends DataVisualizationView implements Observer {
private ClassificationModel model; private ClassificationModel model;
private DataStageController controller; private DataStageController controller;
private Stage root; private Stage root;
private ScatterChart<Double, Double> scatterChart;
private String actualX, actualY;
public DataStageView(ClassificationModel model) { public DataStageView(ClassificationModel model) {
this.model = model; this.model = model;
model.attach(this); model.attach(this);
} }
public void show() throws IOException { public void show() {
FXMLLoader loader = new FXMLLoader(); 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) { if (fxmlFileUrl == null) {
System.out.println("Impossible de charger le fichier fxml"); System.out.println("Impossible de charger le fichier fxml");
System.exit(-1); System.exit(-1);
} }
loader.setLocation(fxmlFileUrl); loader.setLocation(fxmlFileUrl);
root = loader.load(); root = loader.load();
root.setResizable(false); root.setResizable(false);
root.setTitle("SAE3.3 - Logiciel de classification"); root.setTitle("SAE3.3 - Logiciel de classification");
root.show(); root.show();
loader.getController(); controller = loader.getController();
controller = loader.getController(); controller.setDataStageView(this);
controller.setDataStageView(this); scatterChart = controller.getScatterChart();
scatterChart = controller.getScatterChart(); controller.setAxesSelected("Aucun fichier sélectionné");
controller.setAxesSelected("Aucun fichier sélectionné");
if (!model.getDatas().isEmpty()) {
if (!model.getDatas().isEmpty()) { update(model);
update(model); }
} catch (IOException e) {
System.err.println("Erreur lors du chargement du fichier FXML : " + e.getMessage());
} }
} }
@Override @Override
public void update(Observable observable) { public void update(Observable observable) {
if(scatterChart == null) throw new IllegalStateException(); try {
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); if (scatterChart == null || !(observable instanceof ClassificationModel)) {
//on vide le nuage pour s'assurer que celui-ci est bien vide System.err.println("Erreur de mise à jour.");
scatterChart.getData().clear(); return;
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");
} }
else{ // On vide le nuage pour s'assurer qu'il est bien vide
controller.setAxesSelected(""); scatterChart.getData().clear();
// On ajoute la serie au nuage
scatterChart.getData().add(series1); // Jalon 1: on vérifie que le type de donnée est bien IRIS
if (model.getType() == DataType.IRIS) {
//On recupere les données du model XYChart.Series<Double, Double> series1 = new XYChart.Series<>();
List<LoadableData> points = new ArrayList<>(model.getDatas()); XYChart.Series<Double, Double> series2 = new XYChart.Series<>();
points.addAll(model.getDataToClass()); XYChart.Series<Double, Double> series3 = new XYChart.Series<>();
// on ajoute chaque point a la serie if (actualX == null && actualY == null) {
for(LoadableData i : points) { controller.setAxesSelected("Aucuns axes sélectionnés");
} else {
Iris iris = (Iris)i; controller.setAxesSelected("");
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), // On récupère les données du modèle
iris.getDataType(actualY)); List<LoadableData> points = new ArrayList<>(model.getDatas());
points.addAll(model.getDataToClass());
dataPoint.setNode(getCircle(iris)); // On ajoute chaque point à la série
for (LoadableData i : points) {
series1.getData().add(dataPoint); 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 @Override
public void update(Observable observable, Object data) { public void update(Observable observable, Object data) {
if(scatterChart == null) throw new IllegalStateException(); try {
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); if (scatterChart == null || !(observable instanceof ClassificationModel)) {
if(data instanceof Iris) { System.err.println("Erreur de mise à jour.");
Iris iris = (Iris) data;
if(actualX == null || actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
return; return;
} }
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( if (data instanceof Iris) {
iris.getDataType(actualX), Iris iris = (Iris) data;
iris.getDataType(actualY) if (actualX == null || actualY == null) {
); controller.setAxesSelected("Aucuns axes sélectionnés");
return;
dataPoint.setNode(getCircle(iris)); }
if (!scatterChart.getData().isEmpty()) { XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(
XYChart.Series series = (XYChart.Series) scatterChart.getData().get(0); iris.getDataType(actualX),
series.getData().add(dataPoint); 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());
} }
} }
......
...@@ -8,6 +8,7 @@ import fr.univlille.sae.classification.model.Iris; ...@@ -8,6 +8,7 @@ import fr.univlille.sae.classification.model.Iris;
import fr.univlille.sae.classification.model.LoadableData; import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable; import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.Observer; import fr.univlille.sae.classification.utils.Observer;
import fr.univlille.sae.classification.utils.ViewUtil;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
...@@ -39,115 +40,110 @@ public class MainStageView extends DataVisualizationView implements Observer { ...@@ -39,115 +40,110 @@ public class MainStageView extends DataVisualizationView implements Observer {
} }
public void show() throws IOException { public void show() {
FXMLLoader loader = new FXMLLoader(); 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) { if (fxmlFileUrl == null) {
System.out.println("Impossible de charger le fichier fxml"); System.out.println("Impossible de charger le fichier fxml");
System.exit(-1); 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 @Override
public void update(Observable observable) { public void update(Observable observable) {
if(scatterChart == null) throw new IllegalStateException(); try {
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); if (scatterChart == null || !(observable instanceof ClassificationModel)) {
scatterChart.getData().clear(); 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();
//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");
} }
else{ scatterChart.getData().clear();
controller.setAxesSelected("");
//Jalon 1: on verifie que le type de donnée est bien IRIS
List<LoadableData> points = new ArrayList<>(model.getDatas()); if (model.getType() == DataType.IRIS) {
points.addAll(model.getDataToClass()); XYChart.Series series1 = new XYChart.Series();
for(LoadableData i : points) { XYChart.Series series2 = new XYChart.Series();
XYChart.Series series3 = new XYChart.Series();
Iris iris = (Iris)i; if (actualX == null && actualY == null) {
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), controller.setAxesSelected("Aucuns axes sélectionnés");
iris.getDataType(actualY)); } else {
controller.setAxesSelected("");
dataPoint.setNode(getForm(iris, new Circle(5)));
List<LoadableData> points = new ArrayList<>(model.getDatas());
if(iris.getClassification().equals("Setosa")){ points.addAll(model.getDataToClass());
series1.getData().add(dataPoint); for (LoadableData i : points) {
}else if(iris.getClassification().equals("Versicolor")){
series2.getData().add(dataPoint); Iris iris = (Iris) i;
}else if(iris.getClassification().equals("Virginica")){ XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX),
series3.getData().add(dataPoint); 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");
series1.setName("Setosa"); series3.setName("Virginica");
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 @Override
public void update(Observable observable, Object data) { public void update(Observable observable, Object data) {
if(scatterChart == null) throw new IllegalStateException(); try {
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); if (scatterChart == null || !(observable instanceof ClassificationModel)) {
if(data instanceof Iris) { System.err.println("Erreur de mise à jour.");
Iris iris = (Iris) data;
if(actualX == null || actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
return; return;
} }
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>( if(data instanceof Iris) {
iris.getDataType(actualX), Iris iris = (Iris) data;
iris.getDataType(actualY) if(actualX == null || actualY == null) {
); controller.setAxesSelected("Aucuns axes sélectionnés");
return;
dataPoint.setNode(getForm(iris, new Rectangle(10, 10))); }
if (!scatterChart.getData().isEmpty()) { XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(
XYChart.Series series = (XYChart.Series) scatterChart.getData().get(0); iris.getDataType(actualX),
series.getData().add(dataPoint); 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());
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment