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

Merge branch 'matissedekeiser' into 'master'

Ajout multiview

See merge request sae302/2024/H4_SAE3.3!12
parents d6364343 8384b130
No related branches found
No related tags found
No related merge requests found
Showing
with 339 additions and 91 deletions
...@@ -6,39 +6,57 @@ ...@@ -6,39 +6,57 @@
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.image.*?> <?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.stage.*?> <?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"> <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.DataStageController">
<scene> <scene>
<Scene> <Scene>
<AnchorPane prefHeight="363.0" prefWidth="692.0"> <AnchorPane prefHeight="487.0" prefWidth="692.0">
<children> <children>
<VBox prefHeight="363.0" prefWidth="691.0"> <VBox prefHeight="488.0" prefWidth="691.0">
<children> <children>
<HBox prefHeight="356.0" prefWidth="691.0"> <HBox alignment="TOP_CENTER" prefHeight="356.0" prefWidth="691.0" spacing="5.0">
<children>
<AnchorPane prefHeight="200.0" prefWidth="200.0">
<children> <children>
<Region prefHeight="338.0" prefWidth="65.0" /> <Region prefHeight="338.0" prefWidth="65.0" />
<ScatterChart prefHeight="342.0" prefWidth="609.0"> <ScatterChart fx:id="scatterChart" prefHeight="342.0" prefWidth="609.0">
<xAxis> <xAxis>
<CategoryAxis fx:id="absAxeView" prefHeight="21.0" prefWidth="498.0" side="BOTTOM" /> <NumberAxis fx:id="absAxe" prefHeight="21.0" prefWidth="498.0" side="BOTTOM" />
</xAxis> </xAxis>
<yAxis> <yAxis>
<NumberAxis fx:id="ordAxeView" side="LEFT" /> <NumberAxis fx:id="ordAxe" side="LEFT" />
</yAxis> </yAxis>
</ScatterChart> </ScatterChart>
<Button fx:id="settingsView" mnemonicParsing="false"> <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> <graphic>
<ImageView fitHeight="100.0" fitWidth="30.0" pickOnBounds="true" preserveRatio="true"> <ImageView fitHeight="100.0" fitWidth="30.0" pickOnBounds="true" preserveRatio="true">
<image> <image>
<Image url="@gear.png" /> <Image url="@gear.png" />
</image></ImageView> </image>
</ImageView>
</graphic> </graphic>
<HBox.margin> <HBox.margin>
<Insets right="10.0" top="30.0" /> <Insets top="40.0" />
</HBox.margin> </HBox.margin>
</Button> </Button>
</children> </children>
</HBox> </HBox>
<HBox alignment="CENTER" prefHeight="169.0" prefWidth="691.0" spacing="50.0">
<children>
<Button fx:id="classifyData" disable="true" mnemonicParsing="false" onAction="#classifyDatas" prefHeight="26.0" prefWidth="157.0" text="Classifier les données" />
</children>
</HBox>
</children> </children>
</VBox> </VBox>
</children></AnchorPane> </children></AnchorPane>
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
<?import javafx.scene.text.*?> <?import javafx.scene.text.*?>
<?import javafx.stage.*?> <?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"> <Stage fx:id="stage" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.univlille.sae.classification.controller.MainStageController">
<scene> <scene>
<Scene> <Scene>
<AnchorPane prefHeight="487.0" prefWidth="692.0"> <AnchorPane prefHeight="487.0" prefWidth="692.0">
...@@ -52,13 +52,18 @@ ...@@ -52,13 +52,18 @@
</Button> </Button>
</children> </children>
</HBox> </HBox>
<HBox alignment="CENTER" prefHeight="169.0" prefWidth="691.0" spacing="50.0"> <VBox alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0">
<children>
<HBox alignment="CENTER" prefHeight="85.0" prefWidth="691.0" spacing="50.0">
<children> <children>
<Button fx:id="loadData" mnemonicParsing="false" onAction="#openLoadData" prefHeight="27.0" prefWidth="185.0" text="Charger un jeu de données" /> <Button fx:id="loadData" mnemonicParsing="false" onAction="#openLoadData" prefHeight="27.0" prefWidth="185.0" text="Charger un jeu de données" />
<Button fx:id="addData" mnemonicParsing="false" onAction="#openAddData" prefHeight="26.0" prefWidth="141.0" text="Ajouter une donnée" /> <Button fx:id="addData" mnemonicParsing="false" onAction="#openAddData" prefHeight="26.0" prefWidth="141.0" text="Ajouter une donnée" />
<Button fx:id="classifyData" disable="true" mnemonicParsing="false" onAction="#classifyDatas" prefHeight="26.0" prefWidth="157.0" text="Classifier les données" /> <Button fx:id="classifyData" disable="true" mnemonicParsing="false" onAction="#classifyDatas" prefHeight="26.0" prefWidth="157.0" text="Classifier les données" />
</children> </children>
</HBox> </HBox>
<Button alignment="CENTER" contentDisplay="CENTER" mnemonicParsing="false" onAction="#openDataView" text="Ouvrir une autre vue" />
</children>
</VBox>
</children> </children>
</VBox> </VBox>
</children></AnchorPane> </children></AnchorPane>
......
...@@ -2,6 +2,7 @@ package fr.univlille.sae.classification.controller; ...@@ -2,6 +2,7 @@ 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.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.*;
......
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.view.MainStageView; import fr.univlille.sae.classification.view.DataVisualizationView;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox; import javafx.scene.control.ChoiceBox;
...@@ -21,31 +21,31 @@ public class AxesSettingsController{ ...@@ -21,31 +21,31 @@ public class AxesSettingsController{
@FXML @FXML
Button confirmAxes; Button confirmAxes;
MainStageView mainStageView; DataVisualizationView dataVisualizationView;
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(mainStageView.getActualY()); selectOrd.setValue(dataVisualizationView.getActualY());
} }
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(mainStageView.getActualX()); selectAbs.setValue(dataVisualizationView.getActualX());
} }
public void setMainStageView(MainStageView mainStageView) { public void setdataVisualizationView(DataVisualizationView dataVisualizationView) {
this.mainStageView = mainStageView; this.dataVisualizationView = dataVisualizationView;
} }
public void validate(){ public void validate(){
mainStageView.setActualX(selectAbs.getValue().toString()); dataVisualizationView.setActualX(selectAbs.getValue().toString());
mainStageView.setActualY(selectOrd.getValue().toString()); dataVisualizationView.setActualY(selectOrd.getValue().toString());
mainStageView.getController().getScatterChart().getXAxis().setLabel(mainStageView.getActualX()); dataVisualizationView.getScatterChart().getXAxis().setLabel(dataVisualizationView.getActualX());
mainStageView.getController().getScatterChart().getYAxis().setLabel(mainStageView.getActualY()); dataVisualizationView.getScatterChart().getYAxis().setLabel(dataVisualizationView.getActualY());
mainStageView.update(ClassificationModel.getClassificationModel()); dataVisualizationView.reload();
stage.close(); stage.close();
} }
} }
package fr.univlille.sae.classification.controller;
import fr.univlille.sae.classification.model.ClassificationModel;
import fr.univlille.sae.classification.view.*;
import javafx.fxml.FXML;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import java.io.IOException;
public class DataStageController {
@FXML
Stage stage;
@FXML
NumberAxis absAxe;
@FXML
NumberAxis ordAxe;
@FXML
Button settings;
@FXML
Button loadData;
@FXML
Button classifyData;
@FXML
ScatterChart scatterChart;
@FXML
Label AxesSelected;
Stage loadStage;
private DataStageView dataStageView;
/**
* 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, dataStageView);
axesSettingsView.show();
}
public void setDataStageView (DataStageView dataStageView) {
this.dataStageView = dataStageView;
}
public void classifyDatas() {
ClassificationModel.getClassificationModel().classifierDonnees();
classifyData.setDisable(true);
}
public ScatterChart getScatterChart() {
return this.scatterChart;
}
public void setAxesSelected(String texte) {
this.AxesSelected.setText(texte);
}
public Button getClassifyData() {
return this.classifyData;
}
}
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;
}
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.view.AxesSettingsView; import fr.univlille.sae.classification.view.*;
import fr.univlille.sae.classification.view.LoadDataView;
import fr.univlille.sae.classification.view.AddDataView;
import fr.univlille.sae.classification.view.MainStageView;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.chart.*; import javafx.scene.chart.*;
...@@ -59,6 +56,11 @@ public class MainStageController { ...@@ -59,6 +56,11 @@ public class MainStageController {
loadDataView.show(); loadDataView.show();
} }
public void openDataView() throws IOException {
DataStageView dataStageView = new DataStageView(ClassificationModel.getClassificationModel());
dataStageView.show();
}
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();
......
...@@ -24,8 +24,6 @@ public class AddDataView { ...@@ -24,8 +24,6 @@ public class AddDataView {
this.mainStageView = mainStageView; this.mainStageView = mainStageView;
} }
public void show() throws IOException { public void show() throws IOException {
FXMLLoader loader = new FXMLLoader(); FXMLLoader loader = new FXMLLoader();
......
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.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;
...@@ -9,6 +10,7 @@ import javafx.scene.control.Alert; ...@@ -9,6 +10,7 @@ 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;
...@@ -18,12 +20,12 @@ public class AxesSettingsView { ...@@ -18,12 +20,12 @@ public class AxesSettingsView {
private ClassificationModel model; private ClassificationModel model;
private Stage owner; private Stage owner;
private MainStageView mainStageView; private DataVisualizationView dataVisualizationView;
public AxesSettingsView(ClassificationModel model, Stage owner, MainStageView mainStageView){ public AxesSettingsView(ClassificationModel model, Stage owner, DataVisualizationView dataVisualizationView){
this.model = model; this.model = model;
this.owner = owner; this.owner = owner;
this.mainStageView = mainStageView; this.dataVisualizationView = dataVisualizationView;
} }
public void show() throws IOException { public void show() throws IOException {
...@@ -44,7 +46,7 @@ public class AxesSettingsView { ...@@ -44,7 +46,7 @@ public class AxesSettingsView {
root.setTitle("Configuration des axes"); root.setTitle("Configuration des axes");
AxesSettingsController controller = loader.getController(); AxesSettingsController controller = loader.getController();
controller.setMainStageView(mainStageView); controller.setdataVisualizationView(dataVisualizationView);
if(model.getDatas().isEmpty()) { if(model.getDatas().isEmpty()) {
Alert alert = new Alert(Alert.AlertType.WARNING); Alert alert = new Alert(Alert.AlertType.WARNING);
......
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;
import fr.univlille.sae.classification.model.LoadableData;
import fr.univlille.sae.classification.utils.Observable;
import fr.univlille.sae.classification.utils.Observer;
import javafx.fxml.FXMLLoader;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
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;
public class DataStageView extends DataVisualizationView implements Observer {
private ClassificationModel model;
private DataStageController controller;
private Stage root;
public DataStageView(ClassificationModel model) {
this.model = model;
model.attach(this);
}
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 + "data-view-stage.fxml").toURI().toURL();
if (fxmlFileUrl == null) {
System.out.println("Impossible de charger le fichier fxml");
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.setDataStageView(this);
scatterChart = controller.getScatterChart();
controller.setAxesSelected("Aucun fichier sélectionné");
if (!model.getDatas().isEmpty()) {
update(model);
}
}
@Override
public void update(Observable observable) {
if(scatterChart == null) throw new IllegalStateException();
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException();
//on vide le nuage pour s'assurer que celui-ci est bien vide
scatterChart.getData().clear();
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{
controller.setAxesSelected("");
// On ajoute la serie au nuage
scatterChart.getData().add(series1);
//On recupere les données du model
List<LoadableData> points = new ArrayList<>(model.getDatas());
points.addAll(model.getDataToClass());
// on ajoute chaque point a la serie
for(LoadableData i : points) {
Iris iris = (Iris)i;
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(iris.getDataType(actualX),
iris.getDataType(actualY));
dataPoint.setNode(getCircle(iris));
series1.getData().add(dataPoint);
}
}
}
}
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
public void update(Observable observable, Object data) {
if(scatterChart == null) throw new IllegalStateException();
if(!(observable instanceof ClassificationModel)) throw new IllegalStateException();
if(data instanceof Iris) {
Iris iris = (Iris) data;
if(actualX == null || actualY == null) {
controller.setAxesSelected("Aucuns axes sélectionnés");
return;
}
XYChart.Data<Double, Double> dataPoint = new XYChart.Data<>(
iris.getDataType(actualX),
iris.getDataType(actualY)
);
dataPoint.setNode(getCircle(iris));
if (!scatterChart.getData().isEmpty()) {
XYChart.Series series = (XYChart.Series) scatterChart.getData().get(0);
series.getData().add(dataPoint);
}
}
}
public DataStageController getController() {
return controller;
}
@Override
public void reload() {
this.update(ClassificationModel.getClassificationModel());
}
}
package fr.univlille.sae.classification.view;
import javafx.scene.chart.ScatterChart;
public abstract class DataVisualizationView {
protected DataVisualizationView() {}
protected String actualX;
protected String actualY;
protected ScatterChart scatterChart;
public String getActualX() {
return actualX;
}
public void setActualX(String actualX) {
this.actualX = actualX;
}
public String getActualY() {
return actualY;
}
public void setActualY(String actualY) {
this.actualY = actualY;
}
public ScatterChart getScatterChart() {
return this.scatterChart;
}
public abstract void reload();
}
...@@ -24,14 +24,11 @@ import java.io.IOException; ...@@ -24,14 +24,11 @@ import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.*; import java.util.*;
public class MainStageView implements Observer { public class MainStageView extends DataVisualizationView implements Observer {
private ClassificationModel model; private ClassificationModel model;
private ScatterChart scatterChart;
private MainStageController controller; private MainStageController controller;
private String actualX;
private String actualY;
private Stage root; private Stage root;
public MainStageView(ClassificationModel model) { public MainStageView(ClassificationModel model) {
...@@ -144,24 +141,12 @@ public class MainStageView implements Observer { ...@@ -144,24 +141,12 @@ public class MainStageView implements Observer {
} }
} }
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 MainStageController getController() { public MainStageController getController() {
return controller; return controller;
} }
@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