diff --git a/out/production/Capteur/fxml/ImageWindow.fxml b/out/production/Capteur/fxml/ImageWindow.fxml
index 346fc80..1bf5289 100644
--- a/out/production/Capteur/fxml/ImageWindow.fxml
+++ b/out/production/Capteur/fxml/ImageWindow.fxml
@@ -5,48 +5,67 @@
-
+
-
-
+
+
-
+
+
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
-
\ No newline at end of file
+
diff --git a/out/production/Capteur/fxml/MainWindow.fxml b/out/production/Capteur/fxml/MainWindow.fxml
index 037eae1..741a83e 100644
--- a/out/production/Capteur/fxml/MainWindow.fxml
+++ b/out/production/Capteur/fxml/MainWindow.fxml
@@ -1,20 +1,30 @@
+
-
+
-
-
-
+
+
-
-
-
+
+
+
+
+
+
diff --git a/out/production/Capteur/fxml/SpinnerWindow.fxml b/out/production/Capteur/fxml/SpinnerWindow.fxml
index f2c9ce7..9edd467 100644
--- a/out/production/Capteur/fxml/SpinnerWindow.fxml
+++ b/out/production/Capteur/fxml/SpinnerWindow.fxml
@@ -4,26 +4,45 @@
-
-
+
-
-
+
+
+
+
-
diff --git a/out/production/Capteur/launcher/Console.class b/out/production/Capteur/launcher/Console.class
index 57648dd..151a3e0 100644
Binary files a/out/production/Capteur/launcher/Console.class and b/out/production/Capteur/launcher/Console.class differ
diff --git a/out/production/Capteur/launcher/LaunchMeteo.class b/out/production/Capteur/launcher/LaunchMeteo.class
index 11edb21..df1cd41 100644
Binary files a/out/production/Capteur/launcher/LaunchMeteo.class and b/out/production/Capteur/launcher/LaunchMeteo.class differ
diff --git a/out/production/Capteur/model/Capteur.class b/out/production/Capteur/model/Capteur.class
index 6099dd2..5ea05fd 100644
Binary files a/out/production/Capteur/model/Capteur.class and b/out/production/Capteur/model/Capteur.class differ
diff --git a/out/production/Capteur/model/Thread.class b/out/production/Capteur/model/Thread.class
deleted file mode 100644
index 74ff14a..0000000
Binary files a/out/production/Capteur/model/Thread.class and /dev/null differ
diff --git a/out/production/Capteur/view/AfficheurTemperature.class b/out/production/Capteur/view/AfficheurTemperature.class
index 5561adb..065ab91 100644
Binary files a/out/production/Capteur/view/AfficheurTemperature.class and b/out/production/Capteur/view/AfficheurTemperature.class differ
diff --git a/out/production/Capteur/view/ImageWindow.class b/out/production/Capteur/view/ImageWindow.class
index aee12fa..ed224ca 100644
Binary files a/out/production/Capteur/view/ImageWindow.class and b/out/production/Capteur/view/ImageWindow.class differ
diff --git a/out/production/Capteur/view/MainWindow.class b/out/production/Capteur/view/MainWindow.class
index 307724d..effdd16 100644
Binary files a/out/production/Capteur/view/MainWindow.class and b/out/production/Capteur/view/MainWindow.class differ
diff --git a/out/production/Capteur/view/SaisiseurTemperature.class b/out/production/Capteur/view/SaisiseurTemperature.class
index 710da95..5d0a442 100644
Binary files a/out/production/Capteur/view/SaisiseurTemperature.class and b/out/production/Capteur/view/SaisiseurTemperature.class differ
diff --git a/out/production/Capteur/view/SpinnerWindow.class b/out/production/Capteur/view/SpinnerWindow.class
index 3038af9..851aa15 100644
Binary files a/out/production/Capteur/view/SpinnerWindow.class and b/out/production/Capteur/view/SpinnerWindow.class differ
diff --git a/out/production/Capteur/view/Visualisateur.class b/out/production/Capteur/view/Visualisateur.class
index a90741d..a6e5636 100644
Binary files a/out/production/Capteur/view/Visualisateur.class and b/out/production/Capteur/view/Visualisateur.class differ
diff --git a/resource/fxml/DetailWindow.fxml b/resource/fxml/DetailWindow.fxml
new file mode 100644
index 0000000..77e3a86
--- /dev/null
+++ b/resource/fxml/DetailWindow.fxml
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resource/fxml/DetailZoneWindow.fxml b/resource/fxml/DetailZoneWindow.fxml
new file mode 100644
index 0000000..1b74080
--- /dev/null
+++ b/resource/fxml/DetailZoneWindow.fxml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resource/fxml/ImageWindow.fxml b/resource/fxml/ImageWindow.fxml
index 346fc80..1bf5289 100644
--- a/resource/fxml/ImageWindow.fxml
+++ b/resource/fxml/ImageWindow.fxml
@@ -5,48 +5,67 @@
-
+
-
-
+
+
-
+
+
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/resource/fxml/MainWindow.fxml b/resource/fxml/MainWindow.fxml
index 037eae1..741a83e 100644
--- a/resource/fxml/MainWindow.fxml
+++ b/resource/fxml/MainWindow.fxml
@@ -1,20 +1,30 @@
+
-
+
-
-
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resource/fxml/SpinnerWindow.fxml b/resource/fxml/SpinnerWindow.fxml
index f2c9ce7..9edd467 100644
--- a/resource/fxml/SpinnerWindow.fxml
+++ b/resource/fxml/SpinnerWindow.fxml
@@ -4,26 +4,45 @@
-
-
+
-
-
+
+
+
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/launcher/Console.java b/src/launcher/Console.java
index 5eb98cc..63dac69 100644
--- a/src/launcher/Console.java
+++ b/src/launcher/Console.java
@@ -5,8 +5,6 @@ import model.GenerateurAleatoire;
import view.AfficheurTemperature;
import view.SaisiseurTemperature;
-import java.util.Random;
-
public class Console {
public static void main(String[] args) {
GenerateurAleatoire ga = new GenerateurAleatoire(-5,40);
diff --git a/src/launcher/LaunchMeteo.java b/src/launcher/LaunchMeteo.java
index 95ffea5..c174d52 100644
--- a/src/launcher/LaunchMeteo.java
+++ b/src/launcher/LaunchMeteo.java
@@ -16,7 +16,7 @@ public class LaunchMeteo extends Application {
Parent root = FXMLLoader.load(getClass().getResource("/fxml/MainWindow.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
- primaryStage.setTitle("Title");
+ primaryStage.setTitle("Capteur JavaFX");
primaryStage.show();
}
diff --git a/src/model/Capteur.java b/src/model/Capteur.java
index 1ef99ba..c75fe00 100644
--- a/src/model/Capteur.java
+++ b/src/model/Capteur.java
@@ -1,43 +1,34 @@
package model;
+import javafx.application.Platform;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import java.util.ArrayList;
-public class Capteur extends Observable implements Runnable{
- private static int idActuel;
- private int id;
- private String nom;
- private DoubleProperty temperature;
-// private Thread thread;
+public class Capteur extends CapteurAbstrait implements Runnable{
+ private Thread thread;
private GenerateurStrategy strategy;
public Capteur(String nom, GenerateurStrategy strategy) {
- this.id = idActuel;
- idActuel += 1;
- this.nom = nom;
+ super(nom);
this.temperature = new SimpleDoubleProperty(strategy.genereTemperature());
- this.lesObservateurs = new ArrayList<>();
this.strategy = strategy;
+ if (strategy.getClass().getSimpleName().equals("GenerateurManuel")) {
+ this.thread = null;
+ }
+ else{
+ startThread();
+ }
}
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getNom() {
- return nom;
+ public void startThread(){
+ thread = new Thread(this);
+ thread.setDaemon(true);
+ thread.start();
}
-
- public void setNom(String nom) {
- this.nom = nom;
- this.notifier();
+ public void stopThread(){
+ thread.interrupt();
}
public DoubleProperty getTemperature() {
@@ -45,7 +36,7 @@ public class Capteur extends Observable implements Runnable{
}
public void setTemperature(double temperature) {
- this.temperature = new SimpleDoubleProperty(temperature);
+ this.temperature.set(temperature);
this.notifier();
}
@@ -55,6 +46,16 @@ public class Capteur extends Observable implements Runnable{
public void setStrategy(GenerateurStrategy strategy) {
this.strategy = strategy;
+ if (thread != null){
+ thread.interrupt();
+ }
+ if (strategy.getClass().getSimpleName().equals("GenerateurManuel")) {
+ this.thread = null;
+ }
+ else{
+ startThread();
+ }
+ this.notifier();
}
public void setGenerateur(GenerateurStrategy strategy){
@@ -62,6 +63,14 @@ public class Capteur extends Observable implements Runnable{
}
@Override
- public void run(){}
-
+ public void run(){
+ while (true) {
+ Platform.runLater(() -> setTemperature(this.strategy.genereTemperature()));
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ }
}
diff --git a/src/model/CapteurAbstrait.java b/src/model/CapteurAbstrait.java
new file mode 100644
index 0000000..4d157c6
--- /dev/null
+++ b/src/model/CapteurAbstrait.java
@@ -0,0 +1,38 @@
+package model;
+
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.beans.property.StringProperty;
+
+import java.util.ArrayList;
+
+public abstract class CapteurAbstrait extends Observable {
+ protected static int idActuel;
+ protected int id;
+ protected StringProperty nom;
+ protected DoubleProperty temperature;
+
+ public CapteurAbstrait(String nom) {
+ this.id = idActuel;
+ idActuel += 1;
+ this.nom = new SimpleStringProperty(nom);
+ this.lesObservateurs = new ArrayList<>();
+ }
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public StringProperty getNom() {
+ return nom;
+ }
+
+ public void setNom(String nom) {
+ this.nom = new SimpleStringProperty(nom);
+ this.notifier();
+ }
+ public abstract DoubleProperty getTemperature();
+}
diff --git a/src/model/CapteurZone.java b/src/model/CapteurZone.java
new file mode 100644
index 0000000..19d1b5e
--- /dev/null
+++ b/src/model/CapteurZone.java
@@ -0,0 +1,73 @@
+package model;
+
+import javafx.application.Platform;
+import javafx.beans.property.DoubleProperty;
+import javafx.beans.property.IntegerProperty;
+import javafx.beans.property.SimpleDoubleProperty;
+import javafx.beans.property.SimpleIntegerProperty;
+
+import java.util.ArrayList;
+
+public class CapteurZone extends CapteurAbstrait implements Runnable{
+ private Thread thread;
+ private ArrayList lesCapteurs;
+
+ public CapteurZone(String nom, ArrayList lesCapteurs) {
+ super(nom);
+ this.temperature = new SimpleDoubleProperty(0);
+ this.lesCapteurs = lesCapteurs;
+ thread = new Thread(this);
+ thread.setDaemon(true);
+ thread.start();
+ calculTemperature();
+ }
+
+ @Override
+ public void run(){
+ while (true) {
+ Platform.runLater(() -> calculTemperature());
+ try {
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ break;
+ }
+ }
+ }
+
+ @Override
+ public DoubleProperty getTemperature() {
+ return this.temperature;
+ }
+ private void calculTemperature(){
+ double temperature = 0;
+ for (Capteur capteur : lesCapteurs){
+ temperature += capteur.getTemperature().get();
+ }
+ this.temperature.set(temperature/lesCapteurs.size());
+ }
+// private void genereTemperature(){
+// for (Capteur capteur : lesCapteurs){
+// capteur.setTemperature(capteur.getStrategy().genereTemperature());
+// }
+// calculTemperature();
+// this.notifier();
+// }
+ public void addCapteur(Capteur capteur){
+ lesCapteurs.add(capteur);
+ calculTemperature();
+ }
+ public void removeCapteur(Capteur capteur){
+ lesCapteurs.remove(capteur);
+ calculTemperature();
+ }
+ public ArrayList getLesCapteurs() {
+ return lesCapteurs;
+ }
+ public void setLesCapteurs(ArrayList lesCapteurs) {
+ this.lesCapteurs = lesCapteurs;
+ calculTemperature();
+ }
+ public IntegerProperty getNbCapteurs(){
+ return new SimpleIntegerProperty(lesCapteurs.size());
+ }
+}
diff --git a/src/model/GenerateurAleatoire.java b/src/model/GenerateurAleatoire.java
index 5a709b0..636e632 100644
--- a/src/model/GenerateurAleatoire.java
+++ b/src/model/GenerateurAleatoire.java
@@ -39,4 +39,4 @@ public class GenerateurAleatoire implements GenerateurStrategy{
temperature = bornInf+random.nextDouble(bornSup-bornInf);
return temperature;
}
-}
+}
\ No newline at end of file
diff --git a/src/model/GenerateurManuel.java b/src/model/GenerateurManuel.java
new file mode 100644
index 0000000..91647fb
--- /dev/null
+++ b/src/model/GenerateurManuel.java
@@ -0,0 +1,10 @@
+package model;
+
+import java.util.Random;
+
+public class GenerateurManuel implements GenerateurStrategy{
+ @Override
+ public double genereTemperature() {
+ return 0;
+ }
+}
\ No newline at end of file
diff --git a/src/model/GenerateurRealiste.java b/src/model/GenerateurRealiste.java
new file mode 100644
index 0000000..3413b6c
--- /dev/null
+++ b/src/model/GenerateurRealiste.java
@@ -0,0 +1,42 @@
+package model;
+
+import java.util.Random;
+
+public class GenerateurRealiste implements GenerateurStrategy{
+ private double bornInf;
+ private double bornSup;
+ private double temperature;
+
+ public GenerateurRealiste() {
+ Random random = new Random();
+ this.bornInf = -20;
+ this.bornSup = 40;
+ this.temperature = bornInf+random.nextDouble(bornSup-bornInf);
+ }
+
+ public double getBornInf() {
+ return bornInf;
+ }
+
+ public void setBornInf(double bornInf) {
+ this.bornInf = bornInf;
+ }
+
+ public double getBornSup() {
+ return bornSup;
+ }
+
+ public void setBornSup(double bornSup) {
+ this.bornSup = bornSup;
+ }
+
+ @Override
+ public double genereTemperature() {
+ Random random = new Random();
+ double inf, sup;
+ inf = -2;
+ sup = 2;
+ this.temperature += inf+random.nextDouble(sup-inf);
+ return this.temperature;
+ }
+}
\ No newline at end of file
diff --git a/src/model/Thread.java b/src/model/Thread.java
deleted file mode 100644
index 6250eb8..0000000
--- a/src/model/Thread.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package model;
-
-public class Thread {
-}
diff --git a/src/view/DetailWindow.java b/src/view/DetailWindow.java
new file mode 100644
index 0000000..a7b1963
--- /dev/null
+++ b/src/view/DetailWindow.java
@@ -0,0 +1,120 @@
+package view;
+
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.layout.GridPane;
+import javafx.stage.Stage;
+import javafx.util.converter.NumberStringConverter;
+import model.Capteur;
+import model.GenerateurAleatoire;
+import model.GenerateurManuel;
+import model.GenerateurRealiste;
+
+import java.io.IOException;
+
+public class DetailWindow extends Visualisateur{
+ @FXML
+ private Label nom;
+ @FXML
+ private Label id;
+ @FXML
+ private Label temperature;
+ @FXML
+ private Label strategy;
+ @FXML
+ private Button btnSpinner;
+ @FXML
+ private Button btnImage;
+ @FXML
+ private Button btnModifier;
+ @FXML
+ private TextField textFieldNom;
+ @FXML
+ private MenuButton menuStrategy;
+ @FXML
+ private MenuItem menuStrategyRandom;
+ protected Capteur capteur;
+ private GridPane layout;
+
+ public DetailWindow(Capteur capteur) throws IOException {
+ this.capteur = capteur;
+ Stage stage = new Stage();
+ layout = new GridPane();
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DetailWindow.fxml"));
+ loader.setRoot(this.layout);
+ loader.setController(this);
+ Parent root = loader.load();
+ Scene scene = new Scene(root);
+ stage.setScene(scene);
+ stage.setTitle(this.capteur.getNom().toString());
+ stage.show();
+ }
+ @FXML
+ public void initialize(){
+ id.setText(new NumberStringConverter().toString(capteur.getId()));
+ nom.textProperty().bindBidirectional(this.capteur.getNom());
+ String strategyName = this.capteur.getStrategy().getClass().getSimpleName();
+ strategy.setText(strategyName);
+ if (! strategyName.equals("GenerateurManuel")){
+ btnSpinner.setDisable(true);
+ }
+ temperature.textProperty().bindBidirectional(this.capteur.getTemperature() , new NumberStringConverter());
+ }
+
+ @FXML
+ private void clickButtonImage() throws Exception{
+ ImageWindow Iw = new ImageWindow(this.capteur);
+ }
+ @FXML
+ private void clickButtonSpinner() throws Exception{
+ SpinnerWindow Sw = new SpinnerWindow(this.capteur);
+ }
+ @FXML
+ private void clickButtonModifier() throws Exception{
+ if (nom.isVisible() && strategy.isVisible()) {
+ textFieldNom.setText(nom.getText());
+ textFieldNom.setVisible(true);
+ nom.setVisible(false);
+ menuStrategy.setText(strategy.getText());
+ menuStrategy.setVisible(true);
+ } else {
+ nom.setText(textFieldNom.getText());
+ String strategyName = menuStrategy.getText();
+ if (strategyName.equals("GenerateurAleatoire")){
+ this.capteur.setStrategy(new GenerateurAleatoire(-20,40));
+ strategy.setText("GenerateurAleatoire");
+ } else if (strategyName.equals("GenerateurRealiste")){
+ this.capteur.setStrategy(new GenerateurRealiste());
+ strategy.setText("GenerateurRealiste");
+ }
+ else if (strategyName.equals("GenerateurManuel")){
+ this.capteur.setStrategy(new GenerateurManuel());
+ strategy.setText("GenerateurManuel");
+ btnSpinner.setDisable(false);
+ }
+ textFieldNom.setVisible(false);
+ menuStrategy.setVisible(false);
+ nom.setVisible(true);
+ }
+ }
+ @FXML
+ private void clickMenuStrategyRandom() throws Exception{
+ menuStrategy.setText("GenerateurAleatoire");
+ }
+ @FXML
+ private void clickMenuStrategyReal() throws Exception{
+ menuStrategy.setText("GenerateurRealiste");
+ }
+ @FXML
+ private void clickMenuStrategyMan() throws Exception{
+ menuStrategy.setText("GenerateurManuel");
+ }
+
+ @Override
+ public void update() {
+ temperature.textProperty().bindBidirectional(this.capteur.getTemperature() , new NumberStringConverter());
+ }
+}
diff --git a/src/view/DetailZoneWindow.java b/src/view/DetailZoneWindow.java
new file mode 100644
index 0000000..57b3af4
--- /dev/null
+++ b/src/view/DetailZoneWindow.java
@@ -0,0 +1,110 @@
+package view;
+
+import javafx.beans.property.SimpleStringProperty;
+import javafx.collections.ObservableList;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.layout.GridPane;
+import javafx.stage.Stage;
+import javafx.util.Callback;
+import javafx.util.converter.NumberStringConverter;
+import model.*;
+
+import java.io.IOException;
+
+public class DetailZoneWindow extends Visualisateur{
+ private CapteurZone capteurZone;
+ private ObservableList lesCapteurs;
+ private GridPane layout;
+ @FXML
+ private Label nom;
+ @FXML
+ private Label id;
+ @FXML
+ private Label nbCapteurs;
+ @FXML
+ private Label temperature;
+ @FXML
+ private Button btnImage;
+ @FXML
+ private Button btnAjouter;
+ @FXML
+ private ListView listView;
+
+ public DetailZoneWindow(CapteurZone capteurZone) throws IOException {
+ this.capteurZone = capteurZone;
+ Stage stage = new Stage();
+ layout = new GridPane();
+ FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/DetailZoneWindow.fxml"));
+ loader.setRoot(this.layout);
+ loader.setController(this);
+ Parent root = loader.load();
+ Scene scene = new Scene(root);
+ stage.setScene(scene);
+ stage.setTitle("this.capteur.getNom().toString()");
+ stage.show();
+ }
+ @FXML
+ public void initialize(){
+ id.setText(new NumberStringConverter().toString(capteurZone.getId()));
+ nom.textProperty().bindBidirectional(this.capteurZone.getNom());
+ nbCapteurs.textProperty().bindBidirectional(this.capteurZone.getNbCapteurs(), new NumberStringConverter());
+ temperature.textProperty().bindBidirectional(this.capteurZone.getTemperature() , new NumberStringConverter());
+
+ lesCapteurs = listView.getItems();
+
+ listView.setCellFactory(new Callback, ListCell>() {
+ @Override
+ public ListCell call(ListView capteurListView) {
+ return new ListCell(){
+ @Override
+ public void updateItem(CapteurAbstrait value, boolean empty) {
+ super.updateItem(value, empty);
+ if (value != null) {
+ textProperty().bind(new SimpleStringProperty(this, "", "")
+ .concat("[")
+ .concat(value.getId())
+ .concat("] ")
+ .concat(value.getNom())
+ .concat(" : ")
+ .concat(value.getTemperature().asString("%.2f°C")));
+ }
+ }
+ };
+ }
+ });
+
+ listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
+ try {
+ if (lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()).getClass().getSimpleName().equals("CapteurZone")) {
+ DetailZoneWindow Dzw = new DetailZoneWindow((CapteurZone) lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()));
+ }
+ else{
+ DetailWindow Dw = new DetailWindow((Capteur) lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()));
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ lesCapteurs.addAll(capteurZone.getLesCapteurs());
+ }
+ @FXML
+ private void clickButtonImage() throws Exception{
+ ImageWindow Iw = new ImageWindow(this.capteurZone);
+ }
+
+ @FXML
+ private void clickButtonAjouter() throws Exception{
+ Capteur c = new Capteur("Nouveau Capteur Réaliste", new GenerateurRealiste());
+ this.capteurZone.addCapteur(c);
+ lesCapteurs.add(c);
+ }
+
+ @Override
+ public void update() {
+ }
+}
diff --git a/src/view/ImageWindow.java b/src/view/ImageWindow.java
index cab55de..322badc 100644
--- a/src/view/ImageWindow.java
+++ b/src/view/ImageWindow.java
@@ -1,31 +1,39 @@
package view;
-import javafx.beans.property.Property;
+import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Label;
-import javafx.scene.layout.BorderPane;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.converter.NumberStringConverter;
import model.Capteur;
-import model.GenerateurAleatoire;
+import model.CapteurAbstrait;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
public class ImageWindow extends Visualisateur{
- private Capteur capteur;
- private GridPane layout;
+ private final CapteurAbstrait capteur;
@FXML
private Label temperature;
-
- public ImageWindow(Capteur capteur) throws IOException {
+ @FXML
+ private Label nom;
+ @FXML
+ private Label id;
+ @FXML
+ private ImageView imageView;
+ public ImageWindow(CapteurAbstrait capteur) throws IOException {
this.capteur = capteur;
Stage stage = new Stage();
- layout = new GridPane();
+ GridPane layout = new GridPane();
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/ImageWindow.fxml"));
- loader.setRoot(this.layout);
+ loader.setRoot(layout);
loader.setController(this);
Parent root = loader.load();
Scene scene = new Scene(root);
@@ -33,14 +41,30 @@ public class ImageWindow extends Visualisateur{
stage.setTitle("Image");
stage.show();
}
-
+ private void initializeAndUpdate() {
+ id.setText(new NumberStringConverter().toString(capteur.getId()));
+ nom.textProperty().bind(this.capteur.getNom());
+ temperature.textProperty().bindBidirectional(this.capteur.getTemperature() , new NumberStringConverter());
+ this.capteur.getTemperature().addListener((observable, oldValue, newValue) -> {
+ try {
+ if ((Double)newValue < 0) {
+ imageView.setImage(new Image(new FileInputStream("resource/Image/Froid.png")));
+ } else if ((Double)newValue > 22) {
+ imageView.setImage(new Image(new FileInputStream("resource/Image/Chaud.png")));
+ } else {
+ imageView.setImage(new Image(new FileInputStream("resource/Image/Normal.png")));
+ }
+ }
+ catch (FileNotFoundException ignored){}
+ });
+ }
@FXML
public void initialize(){
- temperature.textProperty().bindBidirectional(this.capteur.getTemperature(), new NumberStringConverter());
+ initializeAndUpdate();
}
@Override
public void update() {
- temperature.textProperty().bindBidirectional(this.capteur.getTemperature(), new NumberStringConverter());
+ initializeAndUpdate();
}
}
diff --git a/src/view/MainWindow.java b/src/view/MainWindow.java
index 78980c5..2b5d0d5 100644
--- a/src/view/MainWindow.java
+++ b/src/view/MainWindow.java
@@ -1,39 +1,118 @@
package view;
+import javafx.beans.property.SimpleStringProperty;
+import javafx.collections.ListChangeListener;
+import javafx.collections.ObservableList;
import javafx.fxml.FXML;
-import javafx.fxml.FXMLLoader;
-import javafx.scene.Parent;
-import javafx.scene.Scene;
import javafx.scene.control.Button;
-import javafx.scene.layout.GridPane;
-import javafx.stage.Stage;
-import model.Capteur;
-import model.GenerateurAleatoire;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.ListView;
+import javafx.util.Callback;
+import model.*;
-public class MainWindow {
+import java.io.IOException;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+
+public class MainWindow extends Visualisateur{
+ @FXML
+ private ListView listView;
+ @FXML
+ private Button btnAjouter;
@FXML
- private Button btnSpinner;
+ private Button btnAjouterZone;
@FXML
- private Button btnImage;
+ private Button btnVoir;
@FXML
- private Button btnFermer;
- protected Capteur capteur;
+ private Button btnSupprimer;
+ private ObservableList lesCapteurs;
+ private final DecimalFormat df = new DecimalFormat("#.##");
- public void initialize(){
- this.capteur = new Capteur("a", new GenerateurAleatoire(0,12));
- }
@FXML
- private void clickButtonFermer(){
- Stage stage = (Stage) btnFermer.getScene().getWindow();
- stage.close();
+ public void initialize(){
+ lesCapteurs = listView.getItems();
+
+ listView.setCellFactory(new Callback, ListCell>() {
+ @Override
+ public ListCell call(ListView capteurListView) {
+ return new ListCell(){
+ @Override
+ public void updateItem(CapteurAbstrait value, boolean empty) {
+ super.updateItem(value, empty);
+ if (value != null) {
+ textProperty().bind(new SimpleStringProperty(this, "", "")
+ .concat("[")
+ .concat(value.getId())
+ .concat("] ")
+ .concat(value.getNom())
+ .concat(" : ")
+ .concat(value.getTemperature().asString("%.2f°C")));
+ }
+ }
+ };
+ }
+ });
+
+ listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
+// btnVoir.setDisable(false);
+// btnSupprimer.setDisable(false);
+ try {
+ if (lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()).getClass().getSimpleName().equals("CapteurZone")) {
+ DetailZoneWindow Dzw = new DetailZoneWindow((CapteurZone) lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()));
+ }
+ else{
+ DetailWindow Dw = new DetailWindow((Capteur) lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()));
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ Capteur capteur1 = new Capteur("Capteur Réaliste", new GenerateurRealiste());
+ Capteur capteur2 = new Capteur("Capteur Aléatoire", new GenerateurAleatoire(-20, 40));
+ Capteur capteur3 = new Capteur("Capteur Manuel", new GenerateurManuel());
+ lesCapteurs.add(capteur1);
+ lesCapteurs.add(capteur2);
+ lesCapteurs.add(capteur3);
+
+ Capteur capteur4 = new Capteur("Capteur4", new GenerateurRealiste());
+ Capteur capteur5 = new Capteur("Capteur5", new GenerateurRealiste());
+ CapteurZone capteurZone = new CapteurZone("Capteur Zone", new ArrayList(){{add(capteur4); add(capteur5);}});
+ lesCapteurs.add(capteurZone);
}
@FXML
- private void clickButtonImage() throws Exception{
- ImageWindow Iw = new ImageWindow(this.capteur);
+ private void clickButtonAjouter() throws Exception{
+ Capteur c = new Capteur("Nouveau Capteur Réaliste", new GenerateurRealiste());
+ lesCapteurs.add(c);
}
@FXML
- private void clickButtonSpinner() throws Exception{
- SpinnerWindow Sw = new SpinnerWindow(this.capteur);
+ private void clickButtonAjouterZone() throws Exception{
+ CapteurZone c = new CapteurZone("Nouveau Capteur Zone", new ArrayList());
+ lesCapteurs.add(c);
+ }
+// @FXML
+// private void clickButtonSupprimer() throws Exception{
+// CapteurAbstrait c = lesCapteurs.get(listView.getSelectionModel().getSelectedIndex());
+// lesCapteurs.remove(c);
+// listView.getItems().remove(c);
+// listView.refresh();
+// }
+// @FXML
+// private void clickButtonVoir() throws Exception{
+// try {
+// if (lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()).getClass().getSimpleName().equals("CapteurZone")) {
+// DetailZoneWindow Dzw = new DetailZoneWindow((CapteurZone) lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()));
+// }
+// else{
+// DetailWindow Dw = new DetailWindow((Capteur) lesCapteurs.get(listView.getSelectionModel().getSelectedIndex()));
+// }
+// } catch (IOException e) {
+// throw new RuntimeException(e);
+// }
+// }
+ @Override
+ public void update() {
+ listView.refresh();
}
}
diff --git a/src/view/SpinnerWindow.java b/src/view/SpinnerWindow.java
index 06a67b0..7e08e05 100644
--- a/src/view/SpinnerWindow.java
+++ b/src/view/SpinnerWindow.java
@@ -1,13 +1,12 @@
package view;
-import javafx.beans.property.IntegerProperty;
-import javafx.beans.property.ObjectProperty;
-import javafx.beans.property.SimpleObjectProperty;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
+import javafx.scene.control.Label;
import javafx.scene.control.Spinner;
+import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.converter.NumberStringConverter;
@@ -18,6 +17,10 @@ import java.io.IOException;
public class SpinnerWindow extends Visualisateur{
@FXML
private Spinner spinner;
+ @FXML
+ private Label nom;
+ @FXML
+ private Label id;
protected Capteur capteur;
private GridPane layout;
@@ -36,7 +39,13 @@ public class SpinnerWindow extends Visualisateur{
}
@FXML
public void initialize(){
+ double min, max;
+ min = -20.0;
+ max = 40.0;
+ spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(min,max));
spinner.getValueFactory().valueProperty().bindBidirectional(this.capteur.getTemperature());
+ id.setText(new NumberStringConverter().toString(capteur.getId()));
+ nom.textProperty().bind(this.capteur.getNom());
}
@Override
diff --git a/src/view/Visualisateur.java b/src/view/Visualisateur.java
index df5ee6d..4b487c9 100644
--- a/src/view/Visualisateur.java
+++ b/src/view/Visualisateur.java
@@ -1,14 +1,19 @@
package view;
+
import javafx.fxml.FXML;
+import javafx.scene.control.Button;
import javafx.stage.Stage;
import model.Capteur;
import model.Observateur;
public abstract class Visualisateur implements Observateur {
- private void clickFermer(){
-// Stage stage = (Stage) .getScene().getWindow();
-// stage.close();
+ @FXML
+ private Button btnFermer;
+ @FXML
+ protected void clickButtonFermer(){
+ Stage stage = (Stage) btnFermer.getScene().getWindow();
+ stage.close();
}
private void intialize (Capteur c){
c.addObservateur(this);