Skip to content
Snippets Groups Projects
Commit 0b82e42e authored by Matias Mennecart's avatar Matias Mennecart
Browse files

Merge remote-tracking branch 'refs/remotes/origin/master' into matiasmennecart

# Conflicts:
#	src/main/java/fr/univlille/sae/classification/controller/AddDataController.java
#	src/main/java/fr/univlille/sae/classification/controller/DataStageController.java
#	src/main/java/fr/univlille/sae/classification/view/DataStageView.java
#	src/main/java/fr/univlille/sae/classification/view/MainStageView.java
parents 7d221e90 0709471d
Branches
Tags
No related merge requests found
Showing
with 323 additions and 175 deletions
# 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
......@@ -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);
......
......@@ -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());
......
......@@ -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);
}
......
......@@ -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();
}
}
......@@ -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;
}
......
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);
}
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;
}
}
......@@ -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();
}
}
......@@ -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();
}
}
......@@ -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() {
......
......@@ -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());
}
}
}
......@@ -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());
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment