diff --git a/res/stages/axes-settings-stage.fxml b/res/stages/axes-settings-stage.fxml index 8fb6b84d1748b83d03cb6f3cce523ab8ab62d8c8..3fa1c37d951e26a6260c46fa7abacff1d3acf58b 100644 --- a/res/stages/axes-settings-stage.fxml +++ b/res/stages/axes-settings-stage.fxml @@ -24,7 +24,7 @@ <ChoiceBox fx:id="selectAbs" prefWidth="150.0" /> </children> </HBox> - <Button fx:id="confirmAxes" mnemonicParsing="false" text="Valider" /> + <Button fx:id="confirmAxes" onAction="#validate" mnemonicParsing="false" text="Valider" /> </children> </VBox> </children></AnchorPane> diff --git a/res/stages/data-view-stage.fxml b/res/stages/data-view-stage.fxml new file mode 100644 index 0000000000000000000000000000000000000000..4eaff3a517f37cf2129ee0f95c841f2182c4ff82 --- /dev/null +++ b/res/stages/data-view-stage.fxml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.geometry.*?> +<?import javafx.scene.*?> +<?import javafx.scene.chart.*?> +<?import javafx.scene.control.*?> +<?import javafx.scene.image.*?> +<?import javafx.scene.layout.*?> +<?import javafx.stage.*?> + +<Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.MainStageController"> + <scene> + <Scene> + <AnchorPane prefHeight="363.0" prefWidth="692.0"> + <children> + <VBox prefHeight="363.0" prefWidth="691.0"> + <children> + <HBox prefHeight="356.0" prefWidth="691.0"> + <children> + <Region prefHeight="338.0" prefWidth="65.0" /> + <ScatterChart prefHeight="342.0" prefWidth="609.0"> + <xAxis> + <CategoryAxis fx:id="absAxeView" prefHeight="21.0" prefWidth="498.0" side="BOTTOM" /> + </xAxis> + <yAxis> + <NumberAxis fx:id="ordAxeView" side="LEFT" /> + </yAxis> + </ScatterChart> + <Button fx:id="settingsView" mnemonicParsing="false"> + <graphic> + <ImageView fitHeight="100.0" fitWidth="30.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@gear.png" /> + </image></ImageView> + </graphic> + <HBox.margin> + <Insets right="10.0" top="30.0" /> + </HBox.margin> + </Button> + </children> + </HBox> + </children> + </VBox> + </children></AnchorPane> + </Scene> + </scene> +</Stage> diff --git a/res/stages/gear.png b/res/stages/gear.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2b723b8951d835f19ce3d0753be26e7aa9ef03 Binary files /dev/null and b/res/stages/gear.png differ diff --git a/res/stages/main-stage.fxml b/res/stages/main-stage.fxml index d32296897275d3818030eeb4d0d56a5d10b3403e..3032ca0a558254be1d26f016e731e4e711779725 100644 --- a/res/stages/main-stage.fxml +++ b/res/stages/main-stage.fxml @@ -1,9 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> +<?import javafx.geometry.*?> <?import javafx.scene.*?> <?import javafx.scene.chart.*?> <?import javafx.scene.control.*?> +<?import javafx.scene.image.*?> <?import javafx.scene.layout.*?> +<?import javafx.scene.text.*?> <?import javafx.stage.*?> <Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.12" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.MainStageController"> @@ -13,18 +16,40 @@ <children> <VBox prefHeight="488.0" prefWidth="691.0"> <children> - <HBox prefHeight="356.0" prefWidth="691.0"> + <HBox alignment="TOP_CENTER" prefHeight="356.0" prefWidth="691.0" spacing="5.0"> <children> - <Region prefHeight="338.0" prefWidth="65.0" /> - <ScatterChart fx:id="scatterChart" prefHeight="342.0" prefWidth="609.0"> - <xAxis> - <NumberAxis fx:id="absAxe" prefHeight="21.0" prefWidth="498.0" side="BOTTOM" /> - </xAxis> - <yAxis> - <NumberAxis fx:id="ordAxe" side="LEFT" /> - </yAxis> - </ScatterChart> - <Button fx:id="settings" mnemonicParsing="false" text="Réglage" /> + <AnchorPane prefHeight="200.0" prefWidth="200.0"> + <children> + <Region prefHeight="338.0" prefWidth="65.0" /> + <ScatterChart fx:id="scatterChart" prefHeight="342.0" prefWidth="609.0"> + <xAxis> + <NumberAxis fx:id="absAxe" prefHeight="21.0" prefWidth="498.0" side="BOTTOM" /> + </xAxis> + <yAxis> + <NumberAxis fx:id="ordAxe" side="LEFT" /> + </yAxis> + </ScatterChart> + <Label fx:id="AxesSelected" alignment="CENTER" layoutX="175.0" layoutY="152.0" prefHeight="38.0" prefWidth="259.0"> + <font> + <Font size="21.0" /> + </font></Label> + </children> + <HBox.margin> + <Insets left="10.0" /> + </HBox.margin> + </AnchorPane> + <Button fx:id="settingsView" mnemonicParsing="false" onAction="#openAxesSetting"> + <graphic> + <ImageView fitHeight="100.0" fitWidth="30.0" pickOnBounds="true" preserveRatio="true"> + <image> + <Image url="@gear.png" /> + </image> + </ImageView> + </graphic> + <HBox.margin> + <Insets top="40.0" /> + </HBox.margin> + </Button> </children> </HBox> <HBox alignment="CENTER" prefHeight="169.0" prefWidth="691.0" spacing="50.0"> diff --git a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java index 0679ea9492f13d56af8c055656812f6c766632ab..16cae7a159098b17cb3abc58e7f1c52e33d2dc7d 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AxesSettingsController.java @@ -1,10 +1,16 @@ package fr.univlille.sae.classification.controller; +import fr.univlille.sae.classification.view.MainStageView; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ChoiceBox; +import javafx.stage.Stage; + + +public class AxesSettingsController{ + @FXML + Stage stage; -public class AxesSettingsController { @FXML ChoiceBox selectOrd; @@ -13,4 +19,29 @@ public class AxesSettingsController { @FXML Button confirmAxes; + + MainStageView mainStageView; + + public void setSelectOrd(String[] fields){ + selectOrd.getItems().clear(); + selectOrd.getItems().addAll(fields); + selectOrd.setValue(mainStageView.getActualY()); + } + + public void setSelectAbs(String[] fields){ + selectAbs.getItems().clear(); + selectAbs.getItems().addAll(fields); + selectAbs.setValue(mainStageView.getActualX()); + } + + public void setMainStageView(MainStageView mainStageView) { + this.mainStageView = mainStageView; + } + + public void validate(){ + mainStageView.setActualX(selectAbs.getValue().toString()); + mainStageView.setActualY(selectOrd.getValue().toString()); + mainStageView.update(mainStageView.getModel()); + stage.close(); + } } diff --git a/src/main/java/fr/univlille/sae/classification/controller/DataViewStage.java b/src/main/java/fr/univlille/sae/classification/controller/DataViewStage.java new file mode 100644 index 0000000000000000000000000000000000000000..fe7a9b0083d0ef2abc3ac4a22eb5be0faae92c5c --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/controller/DataViewStage.java @@ -0,0 +1,22 @@ +package fr.univlille.sae.classification.controller; + +import javafx.fxml.FXML; +import javafx.scene.chart.CategoryAxis; +import javafx.scene.chart.NumberAxis; +import javafx.scene.control.Button; +import javafx.stage.Stage; + +public class DataViewStage { + + @FXML + Stage stage; + + @FXML + CategoryAxis absAxe; + + @FXML + NumberAxis ordAxe; + + @FXML + Button settings; +} diff --git a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java index 965120d3f60d7961f4d6bd46cb23c3940e8d3915..cf27808e0137d14171c71ffaa2153cc07ff6cd8c 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/LoadDataController.java @@ -30,15 +30,12 @@ public class LoadDataController { public void loadData() { - System.out.println("Loading data"); stage.close(); - } public void openFileChooser() { - FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Choisissez le fichier à importer"); this.file = fileChooser.showOpenDialog(stage); @@ -47,8 +44,6 @@ public class LoadDataController { filePath.setText(file.getPath()); } - - } public void validate() throws IOException { diff --git a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java index 43599c8041b94d95e3569264fc937c30a3d38c7d..cacb8e322aa55ea5b07d520f258cb5c579631a34 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/MainStageController.java @@ -1,12 +1,16 @@ package fr.univlille.sae.classification.controller; import fr.univlille.sae.classification.model.ClassificationModel; +import fr.univlille.sae.classification.view.AxesSettingsView; import fr.univlille.sae.classification.view.LoadDataView; +import fr.univlille.sae.classification.view.MainStageView; import fr.univlille.sae.classification.view.AddDataView; +import fr.univlille.sae.classification.view.MainStageView; import javafx.fxml.FXML; import javafx.scene.chart.*; import javafx.scene.control.Button; +import javafx.scene.control.Label; import javafx.stage.*; @@ -40,19 +44,29 @@ public class MainStageController { @FXML ScatterChart scatterChart; + @FXML + Label AxesSelected; + Stage loadStage; + private MainStageView mainStageView; /** * Ouvre l'interface de chargement des données. * @throws IOException */ public void openLoadData() throws IOException { - LoadDataView loadDataView = new LoadDataView(ClassificationModel.getClassificationModel(), stage); loadDataView.show(); + } + public void openAxesSetting()throws IOException { + AxesSettingsView axesSettingsView = new AxesSettingsView(ClassificationModel.getClassificationModel(), stage, mainStageView); + axesSettingsView.show(); + } + public void setMainStageView(MainStageView mainStageView) { + this.mainStageView = mainStageView; } /** @@ -63,6 +77,7 @@ public class MainStageController { AddDataView addDataView = new AddDataView(ClassificationModel.getClassificationModel(), stage); addDataView.show(); + } } @@ -71,4 +86,8 @@ public class MainStageController { public ScatterChart getScatterChart() { return this.scatterChart; } + + public void setAxesSelected(String texte) { + this.AxesSelected.setText(texte); + } } diff --git a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java index b878ee7cd2d8b6b442f05744f5f5c20e33618953..b581562f7ead46a3650364f1d033b89e6cf4d98a 100644 --- a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java +++ b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java @@ -19,9 +19,9 @@ public class ClassificationModel extends Observable { private DataType type; - private static ClassificationModel model; + /** * Renvoie une instance unique du model. Par default le type de ce modele est Iris. * Modifier en .setType(DataType). @@ -102,7 +102,6 @@ public class ClassificationModel extends Observable { return dataToClass; } - public DataType getType() { return type; } 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 629f3b67653ce742a3e9647cd784c4f04c4f04b3..5f6d3a77d66e42c1553aaf749212d29fbe88eff9 100644 --- a/src/main/java/fr/univlille/sae/classification/model/Iris.java +++ b/src/main/java/fr/univlille/sae/classification/model/Iris.java @@ -1,7 +1,9 @@ package fr.univlille.sae.classification.model; -import java.util.Set; import com.opencsv.bean.*; +import javafx.scene.paint.Color; + +import java.util.Random; public class Iris extends LoadableData{ @@ -13,6 +15,8 @@ public class Iris extends LoadableData{ private double petalWidth; @CsvBindByName(column = "petal.length") private double petalLength; + @CsvBindByName(column = "variety") + private String variety; public Iris(double sepalWidth, double sepalLength, double petalWidth, double petalLength) { this(sepalWidth, sepalLength, petalWidth, petalLength, "undefined"); @@ -22,12 +26,13 @@ public class Iris extends LoadableData{ // } - public Iris(double sepalWidth, double sepalLength, double petalWidth, double petalLength, String classification) { + public Iris(double sepalWidth, double sepalLength, double petalWidth, double petalLength, String variety) { super(); this.sepalWidth = sepalWidth; this.sepalLength = sepalLength; this.petalWidth = petalWidth; this.petalLength = petalLength; + this.variety = variety; } public double getSepalWidth() { @@ -46,6 +51,48 @@ public class Iris extends LoadableData{ return petalLength; } + public String getVariety() { + return variety; + } + + public double getDataType(String axes){ + switch (axes){ + case "sepalWidth": + return sepalWidth; + case "sepalLength": + return sepalLength; + case "petalWidth": + return petalWidth; + case "petalLength": + return petalLength; + default: + return sepalLength; + } + } + + public Color getColor(){ + switch (this.variety){ + case "Setosa": + return Color.RED; + case "Versicolor": + return Color.BLUE; + case "Virginica": + return Color.GREEN; + default: + return Color.BLACK; + } + } + + public String[] getAttributesName() { + String[] names = new String[]{ + "sepalWidth", + "sepalLength", + "petalWidth", + "petalLength" + }; + return names; + } + @Override public String toString() { return "Iris{" + 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 27678aa908bde366122bbce5e0f6351eb4e2a5f5..fba0fb716aefea3f9a0fb81e584f41671130891c 100644 --- a/src/main/java/fr/univlille/sae/classification/model/LoadableData.java +++ b/src/main/java/fr/univlille/sae/classification/model/LoadableData.java @@ -8,13 +8,18 @@ public abstract class LoadableData { private String classification; - protected LoadableData() { } + + public void addClassification(String classificationType) { + this.classificationTypes.add(classificationType); + } + public String getClassification() { return this.classification; } + public static Set<String> getClassificationTypes() { return classificationTypes; } @@ -27,4 +32,6 @@ public abstract class LoadableData { this.classification = classification; } + public abstract String[] getAttributesName(); + } diff --git a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java new file mode 100644 index 0000000000000000000000000000000000000000..d5cc72fb9ca2601314228f8f4a32f204730fd7a1 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java @@ -0,0 +1,56 @@ +package fr.univlille.sae.classification.view; + +import fr.univlille.sae.classification.controller.AxesSettingsController; +import fr.univlille.sae.classification.controller.MainStageController; +import fr.univlille.sae.classification.model.ClassificationModel; +import fr.univlille.sae.classification.model.LoadableData; +import javafx.fxml.FXMLLoader; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.io.File; +import java.io.IOException; +import java.net.URL; + +public class AxesSettingsView { + + + private ClassificationModel model; + private Stage owner; + private MainStageView mainStageView; + + public AxesSettingsView(ClassificationModel model, Stage owner, MainStageView mainStageView){ + this.model = model; + this.owner = owner; + this.mainStageView = mainStageView; + } + + public void show() throws IOException { + + 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(); + + 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(); + + LoadableData dataType = model.getDatas().get(0); + + controller.setMainStageView(mainStageView); + + controller.setSelectAbs(dataType.getAttributesName()); + controller.setSelectOrd(dataType.getAttributesName()); + + root.showAndWait(); + + } +} 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 7d3163b7987b6c46bee2ace35d683b6d1de5bbd6..6a109423c1cd925a295d7bd69b742ad3ffd48614 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -13,20 +13,25 @@ import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.chart.ScatterChart; import javafx.scene.chart.XYChart; +import javafx.scene.paint.Color; +import javafx.scene.shape.Circle; import javafx.stage.Stage; import java.io.File; import java.io.IOException; import java.net.URL; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; public class MainStageView implements Observer { - - - private ClassificationModel model; - private ScatterChart scatterChart; + private MainStageController controller; + + private String actualX; + private String actualY; public MainStageView(ClassificationModel model) { this.model = model; @@ -49,32 +54,62 @@ public class MainStageView implements Observer { root.setTitle("SAE3.3 - Logiciel de classification"); root.show(); loader.getController(); - MainStageController controller = loader.getController(); + controller = loader.getController(); + controller.setMainStageView(this); scatterChart = controller.getScatterChart(); - + controller.setAxesSelected("Aucun fichier sélectionné"); } @Override public void update(Observable observable) { if(scatterChart == null) throw new IllegalStateException(); + scatterChart.getData().clear(); if(!(observable instanceof ClassificationModel)) throw new IllegalStateException(); XYChart.Series series1 = new XYChart.Series(); - series1.setName("Dice Launch"); - scatterChart.getData().add(series1); - for(LoadableData i : model.getDatas()) { - if(model.getType() == DataType.IRIS) { - series1.getData().add(new XYChart.Data<>(((Iris)i).getPetalLength(), - ((Iris)i).getPetalWidth())); - + series1.setName("Iris"); + if(model.getType() == DataType.IRIS) { + controller.setAxesSelected(""); + if(actualX==null && actualY==null){ + controller.setAxesSelected("Aucuns axes sélectionnés"); + } + else{ + scatterChart.getData().add(series1); + for(LoadableData i : model.getDatas()) { + Iris iris = (Iris)i; + XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX), + iris.getDataType(actualY)); + Circle circle = new Circle(5); + circle.setFill(iris.getColor()); + dataPoint.setNode(circle); + series1.getData().add(dataPoint); + } } } - - } @Override public void update(Observable observable, Object data) { } + + public void setActualX(String actualX) { + this.actualX = actualX; + } + + public void setActualY(String actualY) { + this.actualY = actualY; + } + + public String getActualX() { + return actualX; + } + + public String getActualY() { + return actualY; + } + + public Observable getModel() { + return this.model; + } }