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

Merge branch 'hugo-desmons' into 'master'

Refacto

See merge request sae302/2024/H4_SAE3.3!28
parents 3611137d 7be12e8f
Branches
No related tags found
No related merge requests found
......@@ -7,9 +7,19 @@ import javafx.stage.Stage;
import java.io.IOException;
/**
* Classe principale pour l'application de classification.
* Cette classe initialise et lance l'interface graphique de l'application.
*/
public class ClassificationApp extends Application {
/**
* Point d'entrée principal pour l'initialisation de l'interface utilisateur.
* Cette méthode configure la vue principale en utilisant une instance du modèle
* de classification, puis affiche la fenêtre principale.
* @param stage la fenêtre principale de l'application.
*/
public void start(Stage stage) throws IOException {
ClassificationModel model = ClassificationModel.getClassificationModel();
MainStageView view = new MainStageView(model);
......@@ -17,7 +27,11 @@ public class ClassificationApp extends Application {
view.show();
}
// Ouvre l'application
/**
* Point d'entrée principal de l'application.
* Cette méthode lance l'application JavaFX.
* @param args les arguments de ligne de commande.
*/
public static void main(String[] args) {
Application.launch(args);
}
......
......@@ -6,8 +6,14 @@ import javafx.application.Application;
import javafx.stage.Stage;
import java.io.IOException;
/**
* Cette classe redirige l'exécution vers la classe principale de l'application,
*/
public class Main {
/**
* Point d'entrée principal de l'application.
* @param args les arguments de ligne de commande.
*/
public static void main(String[] args) {
ClassificationApp.main(args);
}
......
package fr.univlille.sae.classification.utils;
public interface Observer {
/**
* Interface pour implémenter le modèle Observateur.
* Cette interface définit les méthodes que les classes doivent implémenter pour agir
* comme des observateurs dans le cadre du modèle Observateur/Observé.
* Les observateurs sont notifiés des changements d'état des objets observés
* via les méthodes `update'.
*/
public interface Observer {
/**
* Méthode appelée pour notifier l'observateur qu'un changement s'est produit
* dans l'objet observé.
* @param observable l'objet observé qui a subi un changement.
*/
void update(Observable observable);
/**
* Méthode appelée pour notifier l'observateur qu'un changement s'est produit
* dans l'objet observé, avec des données supplémentaires.
* @param observable l'objet observé qui a subi un changement.
* @param data des informations supplémentaires concernant le changement.
*/
void update(Observable observable, Object data);
......
......@@ -92,8 +92,6 @@ public class ViewUtil {
tempHBox.getChildren().addAll(rectangle, label);
line.getChildren().add(tempHBox);
}
}
if(colorsString.length < 7) legend.getChildren().add(line);
......
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;
......@@ -14,7 +15,6 @@ import javafx.scene.Node;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
......@@ -33,10 +33,10 @@ import java.util.Map;
*/
public class DataStageView extends DataVisualizationView implements Observer {
private ClassificationModel model;
private DataStageController controller;
private Map<String, ScatterChart.Series<Double, Double>> serieList;
private XYChart.Series series1;
private XYChart.Series series2;
......@@ -50,9 +50,9 @@ public class DataStageView extends DataVisualizationView implements Observer {
* @param model le modèle de classification utilisé pour gérer les données.
*/
public DataStageView(ClassificationModel model) {
super();
this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>();
this.model = model;
super(model);
this.series1 = new XYChart.Series();
this.series2 = new XYChart.Series();
this.series3 = new XYChart.Series();
......@@ -78,8 +78,9 @@ public class DataStageView extends DataVisualizationView implements Observer {
root.setResizable(false);
root.setTitle("SAE3.3 - Logiciel de classification");
root.show();
controller = (MainStageController) controller;
controller = loader.getController();
controller.setDataStageView(this);
((DataStageController) controller).setDataStageView(this);
scatterChart = controller.getScatterChart();
scatterChart.setLegendVisible(false);
scatterChart.getData().addAll(series4, series1, series2, series3);
......@@ -94,125 +95,13 @@ public class DataStageView extends DataVisualizationView implements Observer {
}
}
/**
* Met à jour l'affichage des données en fonction des changements dans le modèle.
* @param observable modèle observé.
*/
@Override
public void update(Observable observable) {
try {
if (scatterChart == null || !(observable instanceof ClassificationModel)) {
System.err.println("Erreur de mise à jour.");
return;
}
scatterChart.getData().clear();
serieList.clear();
if (actualX == null && actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
} else {
controller.setAxesSelected("");
controller.setAxesSelectedDisable();
List<LoadableData> points = new ArrayList<>(model.getDatas());
points.addAll(model.getDataToClass().keySet());
for (LoadableData data : points) {
Object xValue = data.getAttributesNames().get(actualX);
Object yValue = data.getAttributesNames().get(actualY);
Double x = 0.0;
if (xValue instanceof Integer) {
x = ((Integer) xValue).doubleValue();
} else if (xValue instanceof Double) {
x = (Double) xValue;
}
Double y = 0.0;
if (yValue instanceof Integer) {
y = ((Integer) yValue).doubleValue();
} else if (yValue instanceof Double) {
y = (Double) yValue;
}
ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(x, y);
Node nodePoint = ViewUtil.getForm(data, new Circle(5), controller);
ScatterChart.Series<Double, Double> editSerie = serieList.get(data.getClassification());
if(editSerie == null){
editSerie = new ScatterChart.Series<Double, Double>();
}
if(data.getClassification().equals("undefined") || model.getDataToClass().containsKey(data)) {
nodePoint = ViewUtil.getForm(data, new Rectangle(10,10), controller);
}
dataPoint.setNode(nodePoint);
editSerie.getData().add(dataPoint);
serieList.put(data.getClassification(), editSerie);
}
for(String serie : serieList.keySet()) {
serieList.get(serie).setName(serie);
}
scatterChart.getData().addAll(serieList.values());
VBox vBox = ViewUtil.loadLegend();
controller.loadLegend(vBox);
}
} catch (Exception e) {
System.err.println("Erreur de mise à jour : " + e.getMessage());
}
}
/**
* Met à jour l'affichage en ajoutant un nouveau point de données.
* @param observable modèle observé.
* @param data point de données à ajouter.
*/
@Override
public void update(Observable observable, Object data) {
try {
if (scatterChart == null || !(observable instanceof ClassificationModel)) {
System.err.println("Erreur de mise à jour.");
return;
}
LoadableData newData = (LoadableData) data;
if (actualX == null || actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
return;
}
Object attrX = newData.getAttributesNames().get(actualX);
Object attrY = newData.getAttributesNames().get(actualY);
if (attrX instanceof Integer) {
attrX = ((Integer) attrX).doubleValue();
}
if (attrY instanceof Integer) {
attrY = ((Integer) attrY).doubleValue();
}
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(
(Double) attrX,
(Double) attrY
);
dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller));
if (!scatterChart.getData().isEmpty()) {
series4.getData().add(dataPoint);
series4.setName("indéfini");
scatterChart.getData().add(series4);
}
VBox vBox = ViewUtil.loadLegend();
controller.loadLegend(vBox);
} catch (Exception e) {
System.err.println("Erreur de mise à jour : " + e.getMessage());
}
}
/**
* Renvoie le contrôleur associé à cette vue.
* @return contrôleur de la vue.
*/
public DataStageController getController() {
return controller;
return (DataStageController) controller;
}
/**
......
package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.DataStageController;
import fr.univlille.sae.classification.controller.DataVisualizationController;
import fr.univlille.sae.classification.controller.MainStageController;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.ViewUtil;
import javafx.scene.Node;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.shape.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Classe abstraite représentant une vue de visualisation des données.
......@@ -8,14 +25,27 @@ import javafx.scene.chart.ScatterChart;
*/
public abstract class DataVisualizationView {
public DataVisualizationController controller;
private ScatterChart.Series series1;
private ScatterChart.Series series2;
private ScatterChart.Series series3;
private ScatterChart.Series series4;
protected String actualX;
protected String actualY;
protected ScatterChart scatterChart;
private Map<String, ScatterChart.Series<Double, Double>> serieList;
public ClassificationModel model;
/**
* Constructeur par défaut.
* Constructeur pour initialiser la vue de données.
* @param model le modèle de classification utilisé pour gérer les données.
*/
protected DataVisualizationView() {}
protected DataVisualizationView(ClassificationModel model) {
this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>();
this.model = model;
this.series4 = new XYChart.Series();
}
/**
* Renvoie le nom de l'axe X actuel.
......@@ -61,4 +91,137 @@ public abstract class DataVisualizationView {
* Méthode abstraite à implémenter pour recharger les données de la vue.
*/
public abstract void reload();
/**
* Met à jour l'affichage des données en fonction des changements dans le modèle.
* @param observable modèle observé.
*/
public void update(Observable observable) {
try {
if (scatterChart == null || !(observable instanceof ClassificationModel)) {
System.err.println("Erreur de mise à jour.");
return;
}
scatterChart.getData().clear();
serieList.clear();
if (actualX == null && actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
} else {
controller.setAxesSelected("");
controller.setAxesSelectedDisable();
List<LoadableData> points = new ArrayList<>(model.getDatas());
points.addAll(model.getDataToClass().keySet());
for (LoadableData data : points) {
Object xValue = data.getAttributesNames().get(actualX);
Object yValue = data.getAttributesNames().get(actualY);
double x = 0;
if(xValue instanceof Number) {
x = ((Number) xValue).doubleValue();
}
double y = 0;
if(yValue instanceof Number) {
y = ((Number) yValue).doubleValue();
}
/**
Double x = 0.0;
if (xValue instanceof Integer) {
x = ((Integer) xValue).doubleValue();
} else if (xValue instanceof Double) {
x = (Double) xValue;
}
Double y = 0.0;
if (yValue instanceof Integer) {
y = ((Integer) yValue).doubleValue();
} else if (yValue instanceof Double) {
y = (Double) yValue;
}
**/
ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(x, y);
Node nodePoint = ViewUtil.getForm(data, new Circle(5), controller);
ScatterChart.Series<Double, Double> editSerie = serieList.get(data.getClassification());
if(editSerie == null){
editSerie = new ScatterChart.Series<Double, Double>();
}
if(data.getClassification().equals("undefined") || model.getDataToClass().containsKey(data)) {
nodePoint = ViewUtil.getForm(data, new Rectangle(10,10), controller);
}
dataPoint.setNode(nodePoint);
editSerie.getData().add(dataPoint);
serieList.put(data.getClassification(), editSerie);
}
for(String serie : serieList.keySet()) {
serieList.get(serie).setName(serie);
}
scatterChart.getData().addAll(serieList.values());
VBox vBox = ViewUtil.loadLegend();
controller.loadLegend(vBox);
}
} catch (Exception e) {
System.err.println("Erreur de mise à jour : " + e.getMessage());
}
}
/**
* Met à jour l'affichage en ajoutant un nouveau point de données.
* @param observable modèle observé.
* @param data point de données à ajouter.
*/
public void update(Observable observable, Object data) {
try {
if (scatterChart == null || !(observable instanceof ClassificationModel)) {
System.err.println("Erreur de mise à jour.");
return;
}
LoadableData newData = (LoadableData) data;
if (actualX == null || actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
return;
}
Object attrX = newData.getAttributesNames().get(actualX);
Object attrY = newData.getAttributesNames().get(actualY);
if (attrX instanceof Integer) {
attrX = ((Integer) attrX).doubleValue();
}
if (attrY instanceof Integer) {
attrY = ((Integer) attrY).doubleValue();
}
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(
(Double) attrX,
(Double) attrY
);
dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller));
if (!scatterChart.getData().isEmpty()) {
series4.getData().add(dataPoint);
series4.setName("indéfini");
scatterChart.getData().add(series4);
}
controller.loadLegend(ViewUtil.loadLegend());
} catch (Exception e) {
System.err.println("Erreur de mise à jour : " + e.getMessage());
}
}
}
......@@ -26,6 +26,9 @@ public class KNNView {
this.owner = owner;
}
/**
*
*/
public void show() {
FXMLLoader loader = new FXMLLoader();
URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+ File.separator+"k-NN-stage.fxml");
......
......@@ -27,12 +27,9 @@ import java.util.*;
*/
public class MainStageView extends DataVisualizationView implements Observer {
private ClassificationModel model;
private MainStageController controller;
private Stage root;
private Map<String, ScatterChart.Series<Double, Double>> serieList;
private ScatterChart.Series series1;
private ScatterChart.Series series2;
......@@ -41,16 +38,17 @@ public class MainStageView extends DataVisualizationView implements Observer {
/**
* Constructeur de la vue principale.
*
* @param model modèle de classification à utiliser.
*/
public MainStageView(ClassificationModel model) {
super();
this.serieList = new HashMap<String, ScatterChart.Series<Double, Double>>();
super(model);
this.series1 = new ScatterChart.Series();
this.series2 = new ScatterChart.Series();
this.series3 = new ScatterChart.Series();
this.series4 = new ScatterChart.Series();
this.model = model;
model.attach(this);
}
......@@ -88,8 +86,10 @@ public class MainStageView extends DataVisualizationView implements Observer {
}
});
controller = (MainStageController) controller;
controller = loader.getController();
controller.setMainStageView(this);
((MainStageController) controller).setMainStageView(this);
scatterChart = controller.getScatterChart();
//scatterChart.getData().addAll(series1, series2, series3, series4);
controller.setAxesSelected("Aucun fichier sélectionné");
......@@ -99,135 +99,23 @@ public class MainStageView extends DataVisualizationView implements Observer {
}
}
@Override
public void update(Observable observable) {
try {
if (scatterChart == null || !(observable instanceof ClassificationModel)) {
System.err.println("Erreur de mise à jour.");
return;
}
scatterChart.getData().clear();
serieList.clear();
if (actualX == null && actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
} else {
controller.setAxesSelected("");
controller.setAxesSelectedDisable();
List<LoadableData> points = new ArrayList<>(model.getDatas());
points.addAll(model.getDataToClass().keySet());
for (LoadableData data : points) {
Object xValue = data.getAttributesNames().get(actualX);
Object yValue = data.getAttributesNames().get(actualY);
double x = 0;
if(xValue instanceof Number) {
x = ((Number) xValue).doubleValue();
}
double y = 0;
if(yValue instanceof Number) {
y = ((Number) yValue).doubleValue();
}
/**
Double x = 0.0;
if (xValue instanceof Integer) {
x = ((Integer) xValue).doubleValue();
} else if (xValue instanceof Double) {
x = (Double) xValue;
}
Double y = 0.0;
if (yValue instanceof Integer) {
y = ((Integer) yValue).doubleValue();
} else if (yValue instanceof Double) {
y = (Double) yValue;
}
**/
ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(x, y);
Node nodePoint = ViewUtil.getForm(data, new Circle(5), controller);
ScatterChart.Series<Double, Double> editSerie = serieList.get(data.getClassification());
if(editSerie == null){
editSerie = new ScatterChart.Series<Double, Double>();
}
if(data.getClassification().equals("undefined") || model.getDataToClass().containsKey(data)) {
nodePoint = ViewUtil.getForm(data, new Rectangle(10,10), controller);
}
dataPoint.setNode(nodePoint);
editSerie.getData().add(dataPoint);
serieList.put(data.getClassification(), editSerie);
}
for(String serie : serieList.keySet()) {
serieList.get(serie).setName(serie);
}
scatterChart.getData().addAll(serieList.values());
VBox vBox = ViewUtil.loadLegend();
controller.loadLegend(vBox);
}
} catch (Exception e) {
System.err.println("Erreur de mise à jour : " + e.getMessage());
}
}
@Override
public void update(Observable observable, Object data) {
try {
if (scatterChart == null || !(observable instanceof ClassificationModel)) {
System.err.println("Erreur de mise à jour.");
return;
}
LoadableData newData = (LoadableData) data;
if (actualX == null || actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
return;
}
Object attrX = newData.getAttributesNames().get(actualX);
Object attrY = newData.getAttributesNames().get(actualY);
if (attrX instanceof Integer) {
attrX = ((Integer) attrX).doubleValue();
}
if (attrY instanceof Integer) {
attrY = ((Integer) attrY).doubleValue();
}
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(
(Double) attrX,
(Double) attrY
);
dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller));
if (!scatterChart.getData().isEmpty()) {
series4.getData().add(dataPoint);
series4.setName("indéfini");
scatterChart.getData().add(series4);
}
controller.loadLegend(ViewUtil.loadLegend());
} catch (Exception e) {
System.err.println("Erreur de mise à jour : " + e.getMessage());
}
}
* Retourne le contrôleur principal de la scène.
*
* @return le contrôleur principal de la scène en tant qu'instance.
*/
public MainStageController getController() {
return controller;
return (MainStageController) controller;
}
/**
* Recharge les données nécessaires à partir du modèle de classification.
* Cette méthode met à jour l'état en fonction des données actuelles
*/
@Override
public void reload() {
this.update(ClassificationModel.getClassificationModel());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment