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

Merge branch 'hugodebuyser' into 'master'

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

See merge request sae302/2024/H4_SAE3.3!15
parents 1202d8c5 884724bf
No related branches found
No related tags found
No related merge requests found
Showing
with 387 additions and 291 deletions
package fr.univlille.sae.classification.controller; package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel; 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 fr.univlille.sae.classification.view.MainStageView;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.*; import javafx.scene.control.*;
import javafx.stage.Stage; import javafx.stage.Stage;
import java.io.IOException; 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 { public class AddDataController {
@FXML @FXML
...@@ -32,8 +31,14 @@ public class AddDataController { ...@@ -32,8 +31,14 @@ public class AddDataController {
@FXML @FXML
private Spinner<Double> petalWidthSpinner; private Spinner<Double> petalWidthSpinner;
/**
* MainStageView associé au controlleur
*/
MainStageView mainStageView; MainStageView mainStageView;
/**
* Méthode d'intitialisation du controlleur
*/
@FXML @FXML
public void initialize() { public void initialize() {
sepalLengthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 200.0, 3.0,0.1)); sepalLengthSpinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0.0, 200.0, 3.0,0.1));
...@@ -49,10 +54,17 @@ public class AddDataController { ...@@ -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) { public void setMainStageView(MainStageView mainStageView) {
this.mainStageView = mainStageView; this.mainStageView = mainStageView;
} }
/**
* Validation des données à ajouter
*/
public void validate() throws IOException { public void validate() throws IOException {
System.out.println("validé"); System.out.println("validé");
mainStageView.getController().getClassifyData().setDisable(false); mainStageView.getController().getClassifyData().setDisable(false);
......
...@@ -7,7 +7,9 @@ import javafx.scene.control.Button; ...@@ -7,7 +7,9 @@ import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox; import javafx.scene.control.ChoiceBox;
import javafx.stage.Stage; import javafx.stage.Stage;
/**
* Controlleur pour le FXML axes-settings-stage, pour gérer les axes de la vue
*/
public class AxesSettingsController{ public class AxesSettingsController{
@FXML @FXML
Stage stage; Stage stage;
...@@ -21,24 +23,42 @@ public class AxesSettingsController{ ...@@ -21,24 +23,42 @@ public class AxesSettingsController{
@FXML @FXML
Button confirmAxes; Button confirmAxes;
/**
* DataVisualizationView associé au controlleur
*/
DataVisualizationView dataVisualizationView; 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){ public void setSelectOrd(String[] fields){
selectOrd.getItems().clear(); selectOrd.getItems().clear();
selectOrd.getItems().addAll(fields); selectOrd.getItems().addAll(fields);
selectOrd.setValue(dataVisualizationView.getActualY()); 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){ public void setSelectAbs(String[] fields){
selectAbs.getItems().clear(); selectAbs.getItems().clear();
selectAbs.getItems().addAll(fields); selectAbs.getItems().addAll(fields);
selectAbs.setValue(dataVisualizationView.getActualX()); selectAbs.setValue(dataVisualizationView.getActualX());
} }
/**
* Méthode permettante d'attribuer la dataVisualizationView associer à la classe
* @param dataVisualizationView dataVisualizationView à attribuer
*/
public void setdataVisualizationView(DataVisualizationView dataVisualizationView) { public void setdataVisualizationView(DataVisualizationView dataVisualizationView) {
this.dataVisualizationView = dataVisualizationView; this.dataVisualizationView = dataVisualizationView;
} }
/**
* Validation des paramètres des axes
*/
public void validate(){ public void validate(){
dataVisualizationView.setActualX(selectAbs.getValue().toString()); dataVisualizationView.setActualX(selectAbs.getValue().toString());
dataVisualizationView.setActualY(selectOrd.getValue().toString()); dataVisualizationView.setActualY(selectOrd.getValue().toString());
......
...@@ -11,23 +11,13 @@ import javafx.stage.Stage; ...@@ -11,23 +11,13 @@ import javafx.stage.Stage;
import java.io.IOException; import java.io.IOException;
/**
* Controlleur pour le FXML data-view-stage, pour gérer la vue supplémentaire
*/
public class DataStageController { public class DataStageController {
@FXML @FXML
Stage stage; Stage stage;
@FXML
NumberAxis absAxe;
@FXML
NumberAxis ordAxe;
@FXML
Button settings;
@FXML
Button loadData;
@FXML @FXML
Button classifyData; Button classifyData;
...@@ -37,42 +27,47 @@ public class DataStageController { ...@@ -37,42 +27,47 @@ public class DataStageController {
@FXML @FXML
Label AxesSelected; Label AxesSelected;
Stage loadStage; /**
* DataStageView associé au controlleur
*/
private DataStageView dataStageView; private DataStageView dataStageView;
/** /**
* Ouvre l'interface de chargement des données. * Ouvrir les paramètres des axes de la vue
* @throws IOException
*/ */
public void openLoadData() throws IOException {
LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage);
loadDataView.show();
}
public void openAxesSetting()throws IOException { public void openAxesSetting()throws IOException {
AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, dataStageView); AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, dataStageView);
axesSettingsView.show(); axesSettingsView.show();
} }
/**
* Associe la dataStageView associer à la classe
* @param dataStageView
*/
public void setDataStageView (DataStageView dataStageView) { public void setDataStageView (DataStageView dataStageView) {
this.dataStageView = dataStageView; this.dataStageView = dataStageView;
} }
public void classifyDatas() { public void classifyDatas() {
ClassificationModel.getClassificationModel().classifierDonnees(); ClassificationModel.getClassificationModel().classifierDonnees();
classifyData.setDisable(true); classifyData.setDisable(true);
} }
/**
* Renvoie la grille associé à la classe
* @return grille de la classe
*/
public ScatterChart getScatterChart() { public ScatterChart getScatterChart() {
return this.scatterChart; return this.scatterChart;
} }
/**
* Attribut une valeur à l'axe de la grille
* @param texte Valeur de l'axe
*/
public void setAxesSelected(String texte) { public void setAxesSelected(String texte) {
this.AxesSelected.setText(texte); this.AxesSelected.setText(texte);
} }
public Button getClassifyData() {
return this.classifyData;
}
} }
...@@ -27,11 +27,14 @@ public class LoadDataController { ...@@ -27,11 +27,14 @@ public class LoadDataController {
@FXML @FXML
TextField filePath; TextField filePath;
/**
* Fichier sélectionné
*/
File file; File file;
/**
* Ouvre un explorateur de fichiers pour sélectionner le fichier à étudier
*/
public void openFileChooser() { public void openFileChooser() {
FileChooser fileChooser = new FileChooser(); FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Choisissez le fichier à importer"); fileChooser.setTitle("Choisissez le fichier à importer");
...@@ -43,6 +46,9 @@ public class LoadDataController { ...@@ -43,6 +46,9 @@ public class LoadDataController {
} }
/**
* Valide le fichier sélectionné au préalable
*/
public void validate() throws IOException { public void validate() throws IOException {
if (file == null) { if (file == null) {
...@@ -59,7 +65,4 @@ public class LoadDataController { ...@@ -59,7 +65,4 @@ public class LoadDataController {
ClassificationModel.getClassificationModel().loadData(file); ClassificationModel.getClassificationModel().loadData(file);
stage.close(); stage.close();
} }
} }
...@@ -49,55 +49,72 @@ public class MainStageController { ...@@ -49,55 +49,72 @@ public class MainStageController {
/** /**
* Ouvre l'interface de chargement des données. * Ouvre l'interface de chargement des données.
* @throws IOException
*/ */
public void openLoadData() throws IOException { public void openLoadData() throws IOException {
LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage); LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage);
loadDataView.show(); loadDataView.show();
} }
/**
* Ouvre l'interface d'une nouvelle vue.
*/
public void openDataView() throws IOException { public void openDataView() throws IOException {
DataStageView dataStageView = new DataStageView(ClassificationModel.getClassificationModel()); DataStageView dataStageView = new DataStageView(ClassificationModel.getClassificationModel());
dataStageView.show(); dataStageView.show();
} }
/**
* Ouvre l'interface de la configuration des axes.
*/
public void openAxesSetting()throws IOException { public void openAxesSetting()throws IOException {
AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, mainStageView); AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, mainStageView);
axesSettingsView.show(); axesSettingsView.show();
} }
/**
* Associe la mainStageView associer à la classe
* @param mainStageView
*/
public void setMainStageView(MainStageView mainStageView) { public void setMainStageView(MainStageView mainStageView) {
this.mainStageView = mainStageView; this.mainStageView = mainStageView;
} }
/** /**
* Ouvre l'interface d'ajout de donnée. * Ouvre l'interface d'ajout de donnée.
* @throws IOException
*/ */
public void openAddData() throws IOException { public void openAddData() throws IOException {
AddDataView addDataView = new AddDataView(ClassificationModel.getClassificationModel(), stage, mainStageView); AddDataView addDataView = new AddDataView(ClassificationModel.getClassificationModel(), stage, mainStageView);
addDataView.show(); addDataView.show();
} }
/**
* Appelle de la méthode de la classe ClassificationModel afin de classifier les nouvelles données
*/
public void classifyDatas() { public void classifyDatas() {
ClassificationModel.getClassificationModel().classifierDonnees(); ClassificationModel.getClassificationModel().classifierDonnees();
classifyData.setDisable(true); classifyData.setDisable(true);
} }
/**
* Renvoie la grille associé à la classe
* @return grille de la classe
*/
public ScatterChart getScatterChart() { public ScatterChart getScatterChart() {
return this.scatterChart; return this.scatterChart;
} }
/**
* Attribut une valeur à l'axe de la grille
* @param texte Valeur de l'axe
*/
public void setAxesSelected(String texte) { public void setAxesSelected(String texte) {
this.AxesSelected.setText(texte); this.AxesSelected.setText(texte);
} }
/**
* Renvoie le bouton de classification de données
* @return Bouton de classification
*/
public Button getClassifyData() { public Button getClassifyData() {
return this.classifyData; return this.classifyData;
} }
......
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.AddDataController; import fr.univlille.sae.classification.controller.AddDataController;
import fr.univlille.sae.classification.controller.AxesSettingsController;
import fr.univlille.sae.classification.model.ClassificationModel; import fr.univlille.sae.classification.model.ClassificationModel;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.control.Alert; import javafx.scene.control.Alert;
...@@ -24,40 +23,46 @@ public class AddDataView { ...@@ -24,40 +23,46 @@ public class AddDataView {
this.mainStageView = mainStageView; this.mainStageView = mainStageView;
} }
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 + "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) { 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);
Stage root = loader.load();
AddDataController controller = loader.getController();
controller.setMainStageView(mainStageView);
loader.setLocation(fxmlFileUrl);
if(model.getDatas().isEmpty()) { try {
Alert alert = new Alert(Alert.AlertType.WARNING); Stage root = loader.load();
alert.setTitle("Erreur"); AddDataController controller = loader.getController();
alert.setHeaderText(null); controller.setMainStageView(mainStageView);
alert.setContentText("Veuillez d'abord charger les données avant pouvoir ajouter un point");
alert.showAndWait(); if (model.getDatas().isEmpty()) {
return; 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();
} }
} }
package fr.univlille.sae.classification.view; package fr.univlille.sae.classification.view;
import fr.univlille.sae.classification.controller.AxesSettingsController; 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.ClassificationModel;
import fr.univlille.sae.classification.model.LoadableData; import fr.univlille.sae.classification.model.LoadableData;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
...@@ -10,60 +8,65 @@ import javafx.scene.control.Alert; ...@@ -10,60 +8,65 @@ import javafx.scene.control.Alert;
import javafx.stage.Modality; import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import javax.xml.crypto.Data;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
public class AxesSettingsView { public class AxesSettingsView {
private ClassificationModel model; private ClassificationModel model;
private Stage owner; private Stage owner;
private DataVisualizationView dataVisualizationView; private DataVisualizationView dataVisualizationView;
public AxesSettingsView(ClassificationModel model, Stage owner, DataVisualizationView dataVisualizationView){ public AxesSettingsView(ClassificationModel model, Stage owner, DataVisualizationView dataVisualizationView) {
this.model = model; this.model = model;
this.owner = owner; this.owner = owner;
this.dataVisualizationView = dataVisualizationView; this.dataVisualizationView = dataVisualizationView;
} }
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 + "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) { 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);
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()) { try {
Alert alert = new Alert(Alert.AlertType.WARNING); Stage root = loader.load();
alert.setTitle("Erreur"); root.setResizable(false);
alert.setHeaderText(null); root.initOwner(owner);
alert.setContentText("Veuillez d'abord charger les données avant de modifier les parametres"); root.initModality(Modality.APPLICATION_MODAL);
alert.showAndWait(); root.setTitle("Configuration des axes");
return; 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();
} }
} }
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,7 +25,6 @@ public class DataStageView extends DataVisualizationView implements Observer { ...@@ -26,7 +25,6 @@ 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;
public DataStageView(ClassificationModel model) { public DataStageView(ClassificationModel model) {
...@@ -34,107 +32,117 @@ public class DataStageView extends DataVisualizationView implements Observer { ...@@ -34,107 +32,117 @@ public class DataStageView extends DataVisualizationView implements Observer {
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());
} }
} }
......
...@@ -19,27 +19,35 @@ public class LoadDataView { ...@@ -19,27 +19,35 @@ public class LoadDataView {
this.owner = owner; this.owner = owner;
} }
public void show() {
public void show() throws IOException {
FXMLLoader loader = new FXMLLoader(); 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) { 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);
Stage root = loader.load();
root.setResizable(false); try {
root.initOwner(owner); Stage root = loader.load();
root.initModality(Modality.APPLICATION_MODAL);
root.setTitle("Chargement des donées");
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());
}
} }
} }
...@@ -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