diff --git a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java index 584de904d69758cd79417e2b66daf9cb09f1d98d..21c7e41752c372ff4c8c1e47add3812f136d0e00 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java @@ -5,19 +5,18 @@ import fr.univlille.sae.classification.model.ClassificationModel; import fr.univlille.sae.classification.view.MainStageView; import javafx.fxml.FXML; import javafx.geometry.Pos; -import javafx.scene.control.Alert; -import javafx.scene.control.Label; -import javafx.scene.control.Spinner; -import javafx.scene.control.SpinnerValueFactory; +import javafx.scene.control.*; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.io.IOException; import java.lang.reflect.Array; +import java.time.temporal.Temporal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; /** * Controlleur pour le FXML add-data-stage, pour ajouter une nouvelle donnée @@ -35,35 +34,66 @@ public class AddDataController { */ MainStageView mainStageView; - private List<Spinner<Double>> spinners; + private List<Object> components; /** * Méthode d'intitialisation du controlleur */ @FXML public void initialize() { - this.spinners = new ArrayList<>(); + this.components = new ArrayList<>(); ClassificationModel model = ClassificationModel.getClassificationModel(); if (!model.getDatas().isEmpty()) { - String[] attributes = model.getDatas().get(0).getAttributesNames().keySet().toArray(new String[0]); - for (String attribute : attributes) { - Label label = new Label(attribute); + Map<String, Object> attrMap = model.getDatas().get(0).getAttributesNames(); + for (Map.Entry<String, Object> entry : attrMap.entrySet()) { + String attrName = entry.getKey(); + Object attrValue = entry.getValue(); - Spinner<Double> spinner = new Spinner<>(); - spinner.setEditable(true); - SpinnerValueFactory<Double> valueFactory = - new SpinnerValueFactory.DoubleSpinnerValueFactory( - 0, - Double.POSITIVE_INFINITY, - 0.0, - 0.1 - ); - spinner.setValueFactory(valueFactory); - HBox hbox = new HBox(10, label, spinner); + Label label = new Label(attrName); + HBox hbox = new HBox(10, label); hbox.setAlignment(Pos.CENTER); - hbox.setSpacing(10.0); - entries.getChildren().addAll(hbox); - spinners.add(spinner); + hbox.setSpacing(10); + + if (attrValue instanceof Double) { + Spinner<Double> doubleSpinner = new Spinner<>(); + doubleSpinner.setEditable(true); + SpinnerValueFactory<Double> valueFactory = + new SpinnerValueFactory.DoubleSpinnerValueFactory( + 0.0, + 9999, + 0.0, + 0.5 + ); + doubleSpinner.setValueFactory(valueFactory); + hbox.getChildren().add(doubleSpinner); + components.add(doubleSpinner); + } + else if (attrValue instanceof Integer) { + Spinner<Integer> integerSpinner = new Spinner<>(); + integerSpinner.setEditable(true); + SpinnerValueFactory<Integer> valueFactory = + new SpinnerValueFactory.IntegerSpinnerValueFactory( + 0, + Integer.MAX_VALUE, + 0, + 1 + ); + integerSpinner.setValueFactory(valueFactory); + hbox.getChildren().add(integerSpinner); + components.add(integerSpinner); + } + else if (attrValue instanceof String) { + TextField textField = new TextField(); + hbox.getChildren().add(textField); + components.add(textField); + } + else if (attrValue instanceof Boolean) { + ChoiceBox<String> choiceBox = new ChoiceBox<>(); + choiceBox.getItems().addAll("VRAI", "FAUX"); + hbox.getChildren().add(choiceBox); + components.add(choiceBox); + } + entries.getChildren().add(hbox); } } } @@ -83,8 +113,18 @@ public class AddDataController { mainStageView.getController().getClassifyData().setDisable(false); try { - Double[] values = spinners.stream().map(Spinner::getValue).toArray(Double[]::new); - ClassificationModel.getClassificationModel().ajouterDonnee((Object[]) values); + Object[] values = components.stream().map(component -> { + if (component instanceof Spinner) { + return ((Spinner<?>) component).getValue(); + } else if (component instanceof TextField) { + return ((TextField) component).getText(); + } else if (component instanceof ChoiceBox) { + return ((ChoiceBox<String>) component).getValue().equals("VRAI"); + } + return null; + }).toArray(); + + ClassificationModel.getClassificationModel().ajouterDonnee(values); }catch (IllegalArgumentException e){ Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle("Erreur"); diff --git a/src/main/java/fr/univlille/sae/classification/model/DataType.java b/src/main/java/fr/univlille/sae/classification/model/DataType.java index 99e9113443a7261fb700889692fe4c8c6194e7bb..0881c8866aee02eeaf5db1b27dc328bdaad5fc14 100644 --- a/src/main/java/fr/univlille/sae/classification/model/DataType.java +++ b/src/main/java/fr/univlille/sae/classification/model/DataType.java @@ -3,7 +3,7 @@ package fr.univlille.sae.classification.model; public enum DataType { IRIS(4, Iris.class), - POKEMON(12, Pokemon.class); + POKEMON(11, Pokemon.class); private final int argumentSize; private final Class<? extends LoadableData> clazz; diff --git a/src/main/java/fr/univlille/sae/classification/model/Iris.java b/src/main/java/fr/univlille/sae/classification/model/Iris.java index 27d271a25e4898f4b7eeaa38beaf45610cd686a5..abf271abb8ef1ba9bb655bab997a826b774bb18d 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Iris.java +++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java @@ -4,6 +4,7 @@ import com.opencsv.bean.CsvBindByName; import javafx.scene.paint.Color; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; /** @@ -164,8 +165,8 @@ public class Iris extends LoadableData { */ @Override - public Map<String, Double> getAttributesNames() { - Map<String, Double> attrNames = new HashMap<>(); + public Map<String, Object> getAttributesNames() { + Map<String, Object> attrNames = new LinkedHashMap<>(); attrNames.put("Longueur des sépales", sepalLength); attrNames.put("Largeur des sépales", sepalWidth); attrNames.put("Longueur des pétales", petalLength); @@ -179,12 +180,12 @@ public class Iris extends LoadableData { */ @Override public String toString() { - return "Iris{" + - "sepalLength=" + sepalLength + - ", sepalWidth=" + sepalWidth + - ", petalLength=" + petalLength + - ", petalWidth=" + petalWidth + - ", variety='" + getClassification() + '\'' + - '}'; + return ( + "Sepal length: " + sepalLength + "\n" + + "Sepal width: " + sepalWidth + "\n" + + "Petal length: " + petalLength + "\n" + + "Petal width: " + petalWidth + "\n" + + "Variety: " + getClassification() + ); } } diff --git a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java index dcf9b00c05b5b192c5d44b0f99653bf0ce70e66b..4aa25be2e34b88f7db8b244d80410cc4299d6e3c 100644 --- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -46,7 +46,7 @@ public abstract class LoadableData { */ public abstract void setClassification(String classification); - public abstract Map<String, Double> getAttributesNames(); + public abstract Map<String, Object> getAttributesNames(); /** * Renvoie la couleur associée à l'objet. diff --git a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java index 878091653fd2348f366334f8ed5c9f1ad804403b..bddf6995eb5e17c5e48b7de573ec1fa00dbac038 100644 --- a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java +++ b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java @@ -25,9 +25,15 @@ public class PointFactory { break; case POKEMON: if(size != DataType.POKEMON.getArgumentSize()) { - throw new IllegalArgumentException("Le nombre de coordonnées doit être de 12 pour le type IRIS."); + throw new IllegalArgumentException("Le nombre de coordonnées doit être de 11 pour le type POKEMON."); + } + data = null; + if (coords.length == 13) { + data = new Pokemon(coords); + } + else if (coords.length == 11) { + data = new Pokemon((String) coords[0], (Integer) coords[1], (Integer) coords[2], (Double) coords[3], (Integer) coords[4], (Integer) coords[5], (Integer) coords[6], (Integer) coords[7], (Integer) coords[8], "", "", (Double) coords[9], (Boolean) coords[10]); } - data = new Pokemon(coords); break; default: throw new IllegalArgumentException("Type de données non supporté : " + type); diff --git a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java index 63c236b479d1c5b4730d4e8956799d0f0c7658c1..f52f5b1a285687aab16c03cb5f9ff2c41298ef8d 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Pokemon.java +++ b/src/main/java/fr/univlille/sae/classification/model/Pokemon.java @@ -4,6 +4,7 @@ import com.opencsv.bean.CsvBindByName; import javafx.scene.paint.Color; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; public class Pokemon extends LoadableData { @@ -95,18 +96,19 @@ public class Pokemon extends LoadableData { */ @Override - public Map<String, Double> getAttributesNames() { - Map<String, Double> attrNames = new HashMap<>(); - attrNames.put("Attaque", (double) attack); - attrNames.put("Base egg steps", (double) baseEggSteps); + public Map<String, Object> getAttributesNames() { + Map<String, Object> attrNames = new LinkedHashMap<>(); + attrNames.put("Name", name); + attrNames.put("Attaque", attack); + attrNames.put("Base egg steps", baseEggSteps); attrNames.put("Capture rate", captureRate); - attrNames.put("Defense", (double) defense); - attrNames.put("Experience growth", (double) experienceGrowth); - attrNames.put("HP", (double) hp); - attrNames.put("Special attack", (double) spAttack); - attrNames.put("Special defense", (double) spDefense); + attrNames.put("Defense", defense); + attrNames.put("Experience growth", experienceGrowth); + attrNames.put("HP", hp); + attrNames.put("Special attack", spAttack); + attrNames.put("Special defense", spDefense); attrNames.put("Speed", speed); - attrNames.put("Is legendary", isLegendary ? 1.0 : 0.0); + attrNames.put("Is legendary", isLegendary); return attrNames; } diff --git a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java index 7100e254021975aede6f6af63f3e6b676c7fa479..041cafc01de1f11ccd76de9a4578c943ea2a06fe 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java @@ -12,6 +12,7 @@ import javafx.stage.Stage; import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; /** * Classe responsable de la création et de l'affichage de la vue de configuration des axes. @@ -68,8 +69,16 @@ public class AxesSettingsView { } LoadableData dataType = model.getDatas().get(0); - controller.setSelectAbs(dataType.getAttributesNames().keySet().toArray(new String[0])); - controller.setSelectOrd(dataType.getAttributesNames().keySet().toArray(new String[0])); + String[] attributes = dataType.getAttributesNames().keySet().toArray(new String[0]); + ArrayList<String> finalAttrList = new ArrayList<>(); + for (String attribute : attributes) { + if ((dataType.getAttributesNames().get(attribute) instanceof Integer) || (dataType.getAttributesNames().get(attribute) instanceof Double)) { + finalAttrList.add(attribute); + } + } + String[] finalAttributes = finalAttrList.toArray(new String[0]); + controller.setSelectAbs(finalAttributes); + controller.setSelectOrd(finalAttributes); controller.setAbsSizeUpper(((NumberAxis)dataVisualizationView.getScatterChart().getXAxis()).getUpperBound()); controller.setAbsSizeLower(((NumberAxis)dataVisualizationView.getScatterChart().getXAxis()).getLowerBound()); diff --git a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java index 2325405ffc564ddab0b157577d175e7f577dbf27..973c2088541cc0b848e649fe3482c9e6703ef087 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -103,9 +103,9 @@ public class DataStageView extends DataVisualizationView implements Observer { System.err.println("Erreur de mise à jour."); return; } - // On vide le nuage pour s'assurer qu'il est bien vide - ObservableList<XYChart.Series> series = scatterChart.getData(); - for(XYChart.Series serie : series) {serie.getData().clear();} + + scatterChart.getData().clear(); + serieList.clear(); if (actualX == null && actualY == null) { controller.setAxesSelected("Aucuns axes sélectionnés"); @@ -116,7 +116,24 @@ public class DataStageView extends DataVisualizationView implements Observer { List<LoadableData> points = new ArrayList<>(model.getDatas()); points.addAll(model.getDataToClass().keySet()); for (LoadableData data : points) { - ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(data.getAttributesNames().get(actualX), data.getAttributesNames().get(actualY)); + 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); @@ -159,9 +176,17 @@ public class DataStageView extends DataVisualizationView implements Observer { 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<>( - newData.getAttributesNames().get(actualX), - newData.getAttributesNames().get(actualY) + (Double) attrX, + (Double) attrY ); dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller)); diff --git a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java index 43ac5a948165c0ff14484f446a762780b2bafb5a..d87d6d9deccfdc8aa22aa0150bee66b6f69d0817 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -116,7 +116,24 @@ public class MainStageView extends DataVisualizationView implements Observer { List<LoadableData> points = new ArrayList<>(model.getDatas()); points.addAll(model.getDataToClass().keySet()); for (LoadableData data : points) { - ScatterChart.Data<Double, Double> dataPoint = new ScatterChart.Data<>(data.getAttributesNames().get(actualX), data.getAttributesNames().get(actualY)); + 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); @@ -158,9 +175,17 @@ public class MainStageView extends DataVisualizationView implements Observer { 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<>( - newData.getAttributesNames().get(actualX), - newData.getAttributesNames().get(actualY) + (Double) attrX, + (Double) attrY ); dataPoint.setNode(ViewUtil.getForm(newData, new Rectangle(10, 10), controller));